1.漏洞是什么

定义:DOM 型 XSS 的本质是前端 JavaScript 代码的逻辑漏洞

核心特征: 它的数据流只在浏览器本地(客户端)中交互。它不需要经过后端服务器和数据库,这是它与存储型、反射型最本质的区别(可以无视后端 WAF 拦截)。

2.怎么打(攻击链路与payload字典)

(黄金公式)漏洞成立=soure(用户可控的输入点)→数据传递→sink(危险的执行点)

// 1. 捕获 Source:从当前 URL 获取问号(?)后面的全部参数
var str = window.location.search; 
// 2. 数据加工:切片取出 "text=" 后面紧跟的用户输入值
var txId = str.split("text=")[1];
// 3. 触发 Sink:直接把变量 txId 塞进网页。如果是合法的 HTML/JS 代码,浏览器会直接执行!
document.getElementById("dom_box").innerHTML = txId; 

一个简单的payload

?text=<script>alert(1)</script>

3.实战踩坑和绕过(新学的知识)

(1)常见的 Source(找输入):location.search(URL问号后)、location.href(完整URL)、location.hash(URL井号#后)。

(2)sink:
前端 JS 拿到用户输入后,有哪些函数会把字符串当代码执行?最典型的就是 innerHTMLdocument.write()eval()、 setTimeout() 。

4.漏洞触发本质(为什么成功)

(1)漏洞代码缺陷:

document.write("<option value='" + lang + "'>" + ...);

前端代码太信任外部输入,直接把来自 URL 的变量 lang 拼接进了 <option> 标签内部。

(2) (实际payload构造方法,要考虑到js是什么代码)因为你的输入被死死关在 <option value='[这里]'> 的单引号里,你必须通过输入单引号和尖括号('></option>)来强行炸开前后的原本标签,让它提前结束,这样你后面拼接的 <script>alert(1)</script> 才能变成网页上独立生效的代码。

5.防御与修复

不要使用 document.write()innerHTML 拼接字符串。防御它只需要前端开发把代码改成:

JavaScript

element.textContent = lang; // 或者 element.innerText

这样浏览器就会把一切输入都强制当成“纯文本”打印在页面上,即使输入 <script> 也绝不执行。

6.DVWA实操

(1)注入点

这里在dom的low级别点击select按钮后,url的?后面会有default=,此时我们需要在=后面写入payload

(2)分析

f12找到这个输入框对应的js前端代码,重点看划线部分

则可以构造出payload为:

?default='></option><script>alert(1)</script>

出现一个弹窗并且显示1则完成。

注:所有测验请在合法的情况下

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐