TPCTF2025 Web WriteUp
字数 1712 2025-08-29 08:30:12

TPCTF2025 Web题目解析与XSS绕过技术详解

1. Baby Layout题目分析

1.1 漏洞原理

该题目利用了DOMPurify库对<textarea>标签内容检测的缺陷:

  • DOMPurify对<textarea>中的内容检测存在漏洞
  • 浏览器在遇到<textarea>标签时,会将所有后续内容视为纯文本,直到遇到</textarea>
  • 这使得可以在<textarea>中插入恶意内容,绕过DOMPurify的过滤

1.2 利用步骤

  1. 审计发现发帖子和创建layout的API都使用了DOMPurify过滤输入
  2. 确认该版本DOMPurify存在已知漏洞(相关CVE)
  3. 测试发现常规XSS payload被完全过滤
  4. 构造利用<textarea>缺陷的payload:
    <textarea></textarea>
    
  5. 通过onerror事件触发XSS

1.3 关键点

  • 利用浏览器与DOMPurify对<textarea>处理的不一致性
  • 通过图片加载失败触发onerror事件
  • 最终payload提交到/api/layout/api/post接口

2. Safe Layout题目分析

2.1 漏洞升级

这是Baby Layout的升级版,主要区别在于:

  • 设置了ALLOWED_ATTR白名单为空
  • 但保留了ALLOW_DATA_ATTRALLOW_ARIA_ATTR的默认值(true)

2.2 利用原理

DOMPurify的默认配置:

  • ALLOW_DATA_ATTR默认为true:允许使用data-*属性
  • ALLOW_ARIA_ATTR默认为true:允许使用aria-*属性
  • 即使ALLOWED_ATTR为空,仍可使用这些属性

2.3 利用步骤

  1. 构造使用data-*aria-*属性的payload:
    
    
  2. 由于/api/layout接口没有替换操作,payload得以保留
  3. 通过保留的HTML标签构造XSS

2.4 关键点

  • 利用DOMPurify默认配置的宽松性
  • data-*aria-*属性的特殊处理
  • 接口未对内容进行二次处理

3. Safe Layout Revenge题目分析

3.1 进一步限制

在前一题基础上增加了限制:

  • ALLOW_DATA_ATTRALLOW_ARIA_ATTR都设置为false
  • 需要寻找新的绕过方式

3.2 新绕过技术

利用DOMPurify检测规则的缺陷:

  • DOMPurify依赖正则表达式/<[/\w]/进行检测
  • 使用{{content}}导致出现<{这种模式
  • 这种模式无法被DOMPurify正确检测

3.3 利用步骤

  1. 构造包含{{content}}的payload
  2. 利用动态内容替换构造XSS
  3. 示例payload:
    <{{content}}script>alert(1)</script>
    

3.4 关键点

  • 利用DOMPurify正则检测的盲区
  • 动态内容替换的技巧
  • 特殊字符组合绕过过滤

4. Supersqli题目分析

4.1 注入技术

  1. 初始尝试

    • 时间盲注:发现远程数据库和附件数据库的目标表是空的
    • 堆叠注入:注入点的raw()只支持单个语句执行,不可行
  2. Quine注入

    • 通过自引用查询绕过空表限制
    • 示例payload:
      SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine') AS Quine
      
  3. uwsgi中间件编码绕过

    • 利用uwsgi支持的编码方式绕过WAF
    • 另一种方法:利用Go不解析filename参数的特性,绕过代理服务器对password参数的检测

4.2 关键点

  • Quine注入的自引用技术
  • 中间件特性导致的WAF绕过
  • 不同语言处理参数的差异性

5. 防御建议

  1. 更新DOMPurify到最新版本
  2. 明确设置所有安全相关的配置选项,不要依赖默认值
  3. ALLOW_DATA_ATTRALLOW_ARIA_ATTR根据实际需求进行配置
  4. <textarea>等特殊标签进行额外检查
  5. 实施多层防御策略,不依赖单一过滤机制

6. 参考资源

  1. Exploring the DOMPurify Library: Hunting for Misconfigurations
  2. CTF-Writeups by Sudistark
TPCTF2025 Web题目解析与XSS绕过技术详解 1. Baby Layout题目分析 1.1 漏洞原理 该题目利用了DOMPurify库对 <textarea> 标签内容检测的缺陷: DOMPurify对 <textarea> 中的内容检测存在漏洞 浏览器在遇到 <textarea> 标签时,会将所有后续内容视为纯文本,直到遇到 </textarea> 这使得可以在 <textarea> 中插入恶意内容,绕过DOMPurify的过滤 1.2 利用步骤 审计发现发帖子和创建layout的API都使用了DOMPurify过滤输入 确认该版本DOMPurify存在已知漏洞(相关CVE) 测试发现常规XSS payload被完全过滤 构造利用 <textarea> 缺陷的payload: 通过 onerror 事件触发XSS 1.3 关键点 利用浏览器与DOMPurify对 <textarea> 处理的不一致性 通过图片加载失败触发 onerror 事件 最终payload提交到 /api/layout 或 /api/post 接口 2. Safe Layout题目分析 2.1 漏洞升级 这是Baby Layout的升级版,主要区别在于: 设置了 ALLOWED_ATTR 白名单为空 但保留了 ALLOW_DATA_ATTR 和 ALLOW_ARIA_ATTR 的默认值(true) 2.2 利用原理 DOMPurify的默认配置: ALLOW_DATA_ATTR 默认为true:允许使用 data-* 属性 ALLOW_ARIA_ATTR 默认为true:允许使用 aria-* 属性 即使 ALLOWED_ATTR 为空,仍可使用这些属性 2.3 利用步骤 构造使用 data-* 或 aria-* 属性的payload: 由于 /api/layout 接口没有替换操作,payload得以保留 通过保留的HTML标签构造XSS 2.4 关键点 利用DOMPurify默认配置的宽松性 data-* 和 aria-* 属性的特殊处理 接口未对内容进行二次处理 3. Safe Layout Revenge题目分析 3.1 进一步限制 在前一题基础上增加了限制: 将 ALLOW_DATA_ATTR 和 ALLOW_ARIA_ATTR 都设置为false 需要寻找新的绕过方式 3.2 新绕过技术 利用DOMPurify检测规则的缺陷: DOMPurify依赖正则表达式 /<[/\w]/ 进行检测 使用 {{content}} 导致出现 <{ 这种模式 这种模式无法被DOMPurify正确检测 3.3 利用步骤 构造包含 {{content}} 的payload 利用动态内容替换构造XSS 示例payload: 3.4 关键点 利用DOMPurify正则检测的盲区 动态内容替换的技巧 特殊字符组合绕过过滤 4. Supersqli题目分析 4.1 注入技术 初始尝试 : 时间盲注:发现远程数据库和附件数据库的目标表是空的 堆叠注入:注入点的 raw() 只支持单个语句执行,不可行 Quine注入 : 通过自引用查询绕过空表限制 示例payload: uwsgi中间件编码绕过 : 利用uwsgi支持的编码方式绕过WAF 另一种方法:利用Go不解析filename参数的特性,绕过代理服务器对password参数的检测 4.2 关键点 Quine注入的自引用技术 中间件特性导致的WAF绕过 不同语言处理参数的差异性 5. 防御建议 更新DOMPurify到最新版本 明确设置所有安全相关的配置选项,不要依赖默认值 对 ALLOW_DATA_ATTR 和 ALLOW_ARIA_ATTR 根据实际需求进行配置 对 <textarea> 等特殊标签进行额外检查 实施多层防御策略,不依赖单一过滤机制 6. 参考资源 Exploring the DOMPurify Library: Hunting for Misconfigurations CTF-Writeups by Sudistark