从业者-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-broken
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
进入实验室,点击 “My account” 访问登录界面,并使用题目中提供的用户名和密码进行登录。
登录后,在账户页面中可以看到一个邮箱更改功能,输入一个新邮箱,点击 “Update email” 并捕获请求数据包。
捕获的请求数据包如下。
将数据包转发至 Repeater 功能模块。
只要Referer
标头的值有一个字符不对,就会请求失败。
生成一个 PoC,保存到漏洞利用服务器上,自己测试一下。
由于携带了不正确的Referer
标头,所以请求失败。
尝试在漏洞利用 URL 中添加伪造的 GET 传参?a=
,参数值为实验室的域名。
但由于现代浏览器的策略限制,Referer
标头中不会包含查询字符串。
回到漏洞利用服务器,在路径中添加伪造的传参:
/exploit?a=<受攻击的域>
同时添加响应标头,允许在Referer
中包含查询字符串:
Referrer-Policy: unsafe-url
再次测试载荷,正确返回了Referrer-Policy: unsafe-url
标头。
但Referer
标头中的 URL 依旧没有包含查询字符串。
为什么?哪里搞错了吗?
问题出在载荷中,BurpSuite 生成的 CSRF PoC 中,总会带有一个history.pushState()
函数。该函数会干扰Referer
标头的生成。
两个办法:
- 删掉该函数;
- 或者,在第三个参数的位置,添加你想要的查询字符串。
<!-- 删掉 -->
<script>
document.forms[0].submit();
</script>
<!-- 添加参数 -->
<script>
history.pushState('', '', '/?a=0a0c008403b8de6c80e77668009e00b6.web-security-academy.net');
document.forms[0].submit();
</script>
2
3
4
5
6
7
8
9
10
第一个方法我已经单独试过了,删掉该函数是可行的。
现在尝试第二个方法,添加相应的查询字符串。
再次访问载荷,这一次Referer
标头总算包含了预期的 URL。
修改 PoC 中的邮箱地址,防止冲突。
保存之后,发送给受害用户。
载荷正确,成功更改了受害用户的邮箱地址。
实验完成。