从业者-基于DOM的cookie操纵
# 实验室:基于DOM的cookie操纵
# 题目
此实验室包含一个基于 DOM 的客户端 Cookie 操纵。
若要解决实验室问题,请注入一个 cookie,它将在不同的页面上导致 XSS 并调用print()
函数。你需要使用漏洞利用服务器 将受害者定向到正确的页面。
- name: 实验室-从业者
desc: 基于DOM的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/dom-based/cookie-manipulation/lab-dom-cookie-manipulation
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
进入任意一个商品详情页,然后查看网页源代码,会看到以下 JavaScript:
document.cookie = 'lastViewedProduct=' + window.location + '; SameSite=None; Secure'
1
这将会获取当前的 URL,并将其拼接到字符lastViewedProduct=
的后面,然后被设置为 Cookie 的一部分。
捕获一个数据包看看,当前 URL 果然被设置到了 Cookie 当中。
可以在 URL 中添加几个无效的 GET 传参,看看是否存在可控输入。
再捕获一个数据包,我们在 URL 中设置的值成功被带入 Cookie 当中。
直接在 URL 的 GET 传参中拼接 XSS 载荷:
'><img src=1 onerror=print()>
1
访问的一瞬间,成功执行print()
函数。
来到漏洞利用服务器,通过window.location
将受害用户重定向到存在漏洞的 URL:
<script>
window.location = "https://<受攻击的域>/product?productId=1&abc123%27%3E%3Cimg%20src=1%20onerror=print()%3E";
</script>
1
2
3
2
3
保存之后,将其发送给受害用户。
注意,需要发送两次才能成功。因为 Cookie 的缘故,第一次访问时会向 Cookie 注入载荷,第二次访问时载荷才会触发。
发送之后,实验完成。
# 更好的解决方案
完成实验之后,我看了答案,寻求更好的解决方案(以上载荷需要发送两次才能攻击成功)。
答案是这样做的,通过if
和变量x
来判断用户是第一次访问,还是第二次访问:
- 如果未设置变量
x
的值,则说明是第一次访问,此时会先向 Cookie 注入载荷。然后重新设置src
属性,重载站点页面并触发已经注入到 Cookie 中的载荷; - 如果已经设置了变量
x
的值,说明已经注入了载荷,直接加载站点页面 并 触发载荷即可。
<iframe src="https://<受攻击的域>/product?productId=1&'><script>print()</script>" onload="if(!window.x)this.src='https://<受攻击的域>';window.x=1;">
1
编辑 (opens new window)