攻击原理
XSS 的根因在于浏览器遵循同源策略(Same-Origin Policy)保护跨站数据隔离,但无法区分「来自服务器的合法脚本」与「攻击者注入的恶意脚本」——两者在同一页面的同一 JavaScript 执行上下文中运行,享有完全相同的 DOM 访问权限和 Cookie 读取能力。
当 Web 应用将用户输入未经转义地拼接进 HTML 输出时,浏览器解析器在构建 DOM 树的过程中遇到攻击者嵌入的 <script> 标签或事件处理器属性(如 onerror、onload),将其视为页面开发者编写的合法代码执行。这一问题的本质是「数据与代码边界模糊」——HTML 规范允许在文档的多个位置(标签体、属性值、URL 协议、CSS 表达式、事件处理器)嵌入可执行内容,而应用开发者往往只在其中部分位置做转义。
三大类型
- 反射型 XSS:恶意载荷通过 URL 参数、表单提交等途径传入,服务器在响应中直接回显。用户需点击攻击者精心构造的链接才会触发,通常用于钓鱼邮件的 Credential Harvester 场景。
- 存储型 XSS:恶意载荷被持久化到服务端(数据库、日志、文件),当其他用户请求包含该数据的页面时自动触发。危害最大——攻击者只需注入一次,所有访问者均受影响。2005 年 MySpace Samy 蠕虫即是存储型 XSS 的最著名案例。
- DOM 型 XSS:载荷完全在客户端触发,服务器响应中不含恶意内容。攻击篡改 DOM 环境(如修改
document.location、innerHTML、eval()参数),浏览器在运行时执行注入脚本。因服务器端日志中不可见,检测难度最高。
典型攻击案例
| 时间 | 事件 | XSS 类型 | 影响规模 |
|---|