从业者-web消息与javascript url-实现DOM型XSS
# 实验室:使用Web消息和JavaScript URL的DOM型XSS
# 题目
此实验室包含一个由 Web 消息传递触发的基于 DOM 的重定向漏洞。若要解决实验室问题,请在漏洞利用服务器上构造一个 HTML 页面并使其调用print()
函数。
- name: 实验室-从业者
desc: 使用Web消息和JavaScript URL的DOM型XSS >>
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/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-a-javascript-url
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
进入任意一篇博客的详情页,查看网页源代码,可以看到一段 JavaScript:
window.addEventListener('message', function(e) {
var url = e.data;
if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) {
location.href = url;
}
}, false);
1
2
3
4
5
6
2
3
4
5
6
这将会获取 web 消息,然后通过indexOf()
函数检查消息内容是否包含 HTTP 协议,如果包含则将location.href
设置为消息内容。
看到这里,你应该知道怎么做了吧?indexOf()
只检查是否包含某个字符,而不检查是否以某个字符开头。因此,你可以在 web 消息中的任意位置包含 HTTP 协议字符,以通过检查。
访问漏洞利用服务器,构造一个载荷:
<iframe src="//<目标站点>" onload="this.contentWindow.postMessage('https://<目标站点>/abcdefg','*')">
1
通过iframe
标签框柱目标网页,然后向网页发送一条 web 消息,内容为一个 URL:https://<目标站点>/abcdefg
。
访问漏洞利用 URL,正确地框柱了目标网页,短时间内进行了重定向(刷新按钮在转圈,说明没加载完成)。
重定向到了目标站点的/abcdefg
路径,显示 “未找到网页”。
成功将 web 消息注入到了location.href
当中。
对 web 消息的内容进行修改,通过location.href
标签 + 伪协议javascript:
的方式触发print()
函数:
<iframe src="//<目标站点>" onload="this.contentWindow.postMessage('javascript:print();//http:','*')">
1
我们可以先在控制台测试一遍,location.href
与javascript:
结合之后是否需要用户交互?
和a
与javascript:
的结合不一样,无需用户交互即可执行 JavaScript。
将以上载荷保存到漏洞利用服务器之后,访问漏洞利用 URL,访问的一瞬间触发了print()
函数。
将载荷发送给受害用户。
实验完成。
编辑 (opens new window)