一些BAT的XSS实例(五)最终篇
字数 1174 2025-08-26 22:11:40

BAT XSS实例分析(六)高级绕过技术详解

一、题目背景

这是BAT XSS实例系列中最难的第六题,主要考察在强过滤条件下的XSS绕过技术。题目特点:

  • 参数从2个变为1个(uin)
  • 路径中去掉了问号字符
  • 参数会进行一次URL解码操作
  • 存在严格的过滤机制

二、题目分析

初始尝试

  1. 基本构造尝试:

    http://px1624.sinaapp.com/test/xsstest6/?#uin=../test/xsstest6/user.php?callback=111
    
    • 发现会直接跳转
    • 断点调试显示参数变为空字符串
  2. URL编码尝试:

    http://px1624.sinaapp.com/test/xsstest6/?#uin=../test/xsstest6/user.php%3fcallback=111
    
    • 百分号被过滤导致失败

代码审计发现

  1. 过滤机制:

    • 问号(?)被过滤
    • 百分号(%)被过滤(防止URL编码绕过)
    • 参数校验:不符合条件返回空,导致跳转到php页面
  2. 关键正则表达式:

    str.replace(/.*\?/, '')
    
    • 将问号前面的所有内容替换为空
    • 导致GETname和parmtname不相等,返回空字符串

三、绕过技术详解

1. 正则表达式特性利用

  • 正则中的点(.)匹配任意字符除了换行符
  • JavaScript中的行结束符:
    • \n (换行)
    • \r (回车)
    • \u2028 (行分隔符)
    • \u2029 (段落分隔符)

2. 换行符绕过尝试

  1. 初始尝试:

    http://px1624.sinaapp.com/test/xsstest6/?#11?\n&uin=../test/xsstest6/user.php?callback=alert()
    
    • 失败原因:浏览器地址栏无法直接解析\n
  2. 控制台测试:

    location="http://px1624.sinaapp.com/test/xsstest6/?#11?\n&uin=../test/xsstest6/user.php?callback=alert()"
    
    • 仍然失败:浏览器地址栏特殊处理

3. Unicode行结束符绕过

  1. 使用\u2028\u2029

    location="http://px1624.sinaapp.com/test/xsstest6/?#11?\u2028&uin=../test/xsstest6/user.php?callback=alert()"
    
    • 成功原因:正则中的点(.)不匹配这些行结束符
    • 在行结束符处截断,保留后面内容
  2. 浏览器兼容性:

    • 老版本浏览器(如旧版Chrome、IE)支持
    • 新版Chrome对location.hash的特殊字符进行URL编码,导致失效

4. 长度限制绕过

user.php限制callback参数长度≤7字符,而alert(1)为8字符:

方案一:利用PHP构造

  • 参考第五题解法,利用PHP特性绕过长度限制

方案二:利用jQuery DOM XSS

  • 利用jQuery的$()函数进行DOM操作
  • 构造iframe实现:
    <iframe src="http://px1624.sinaapp.com/test/xsstest6/?#11?\u2028&uin=../test/xsstest6/user.php?callback=$(``)"></iframe>
    

四、完整Payload

  1. 基础弹窗(老浏览器):

    http://px1624.sinaapp.com/test/xsstest6/?#11?\u2028&uin=../test/xsstest6/user.php?callback=alert()
    
  2. 带参数的弹窗(需绕过长度限制):

    location="http://px1624.sinaapp.com/test/xsstest6/?#11?\u2028&uin=../test/xsstest6/user.php?callback=$(``)"
    

五、技术总结

  1. 核心知识点

    • JavaScript正则表达式特性(.不匹配行结束符)
    • Unicode行结束符(\u2028, \u2029)
    • 浏览器URL解析机制
    • jQuery DOM操作特性
  2. 调试技巧

    • 断点调试分析参数处理流程
    • 控制台测试特殊字符行为
    • 代码映射分析过滤逻辑
  3. 绕过思路

    • 利用语言特性而非单纯编码
    • 关注过滤规则的边界条件
    • 多维度组合利用各种特性
  4. 防御建议

    • 统一字符编码处理
    • 严格限制输入格式
    • 避免依赖客户端过滤

六、扩展思考

  1. 现代浏览器防御机制对这类攻击的影响
  2. 其他可能被忽略的Unicode控制字符
  3. 服务端与客户端协同防御方案
  4. 基于DOM的XSS防御策略

通过这道题目,展示了在强过滤条件下如何利用语言特性和浏览器行为差异实现XSS绕过,强调了基础知识和系统化思维在安全研究中的重要性。

BAT XSS实例分析(六)高级绕过技术详解 一、题目背景 这是BAT XSS实例系列中最难的第六题,主要考察在强过滤条件下的XSS绕过技术。题目特点: 参数从2个变为1个(uin) 路径中去掉了问号字符 参数会进行一次URL解码操作 存在严格的过滤机制 二、题目分析 初始尝试 基本构造尝试: 发现会直接跳转 断点调试显示参数变为空字符串 URL编码尝试: 百分号被过滤导致失败 代码审计发现 过滤机制: 问号(?)被过滤 百分号(%)被过滤(防止URL编码绕过) 参数校验:不符合条件返回空,导致跳转到php页面 关键正则表达式: 将问号前面的所有内容替换为空 导致GETname和parmtname不相等,返回空字符串 三、绕过技术详解 1. 正则表达式特性利用 正则中的点(.)匹配任意字符 除了换行符 JavaScript中的行结束符: \n (换行) \r (回车) \u2028 (行分隔符) \u2029 (段落分隔符) 2. 换行符绕过尝试 初始尝试: 失败原因:浏览器地址栏无法直接解析 \n 控制台测试: 仍然失败:浏览器地址栏特殊处理 3. Unicode行结束符绕过 使用 \u2028 和 \u2029 : 成功原因:正则中的点(.)不匹配这些行结束符 在行结束符处截断,保留后面内容 浏览器兼容性: 老版本浏览器(如旧版Chrome、IE)支持 新版Chrome对location.hash的特殊字符进行URL编码,导致失效 4. 长度限制绕过 user.php限制callback参数长度≤7字符,而 alert(1) 为8字符: 方案一:利用PHP构造 参考第五题解法,利用PHP特性绕过长度限制 方案二:利用jQuery DOM XSS 利用jQuery的$()函数进行DOM操作 构造iframe实现: 四、完整Payload 基础弹窗(老浏览器): 带参数的弹窗(需绕过长度限制): 五、技术总结 核心知识点 : JavaScript正则表达式特性(.不匹配行结束符) Unicode行结束符(\u2028, \u2029) 浏览器URL解析机制 jQuery DOM操作特性 调试技巧 : 断点调试分析参数处理流程 控制台测试特殊字符行为 代码映射分析过滤逻辑 绕过思路 : 利用语言特性而非单纯编码 关注过滤规则的边界条件 多维度组合利用各种特性 防御建议 : 统一字符编码处理 严格限制输入格式 避免依赖客户端过滤 六、扩展思考 现代浏览器防御机制对这类攻击的影响 其他可能被忽略的Unicode控制字符 服务端与客户端协同防御方案 基于DOM的XSS防御策略 通过这道题目,展示了在强过滤条件下如何利用语言特性和浏览器行为差异实现XSS绕过,强调了基础知识和系统化思维在安全研究中的重要性。