Jsp中的jsp标准语法和XML语法的多重编码混淆
字数 1491 2025-08-18 11:36:48
JSP多重编码混淆技术详解
一、前言
本文深入分析JSP页面中利用标准语法和XML语法进行多重编码混淆的技术原理,重点探讨如何通过不同编码方式的组合来绕过WebShell检测引擎。该技术主要基于Y4tacker师傅的研究成果,并在代码层面进行了复现和验证。
二、JSP编码解析机制
1. 编码解析流程
JSP引擎处理编码主要分为两个步骤:
- 解析JSP中的所有指令
- 翻译整个单元(translation unit)
2. 指令解析核心
编码解析主要集中在ParserController#parseDirectives方法中,关键变量包括:
jspConfigPageEnc:通过getJspConfigPageEncoding方法从JSP配置(web.xml)中获取- 具体配置位置:web.xml中的
<page-encoding>标签
3. 语法与编码探测
通过determineSyntaxAndEncoding方法探测:
- 处理的是标准JSP语法还是XML语法编写的JSP页面
- 获取它们使用的编码
- 使用
isXml和sourceEnc变量保存探测结果- 默认不是XML格式
- 可通过JSP配置中的
<is-xml>标签判断 - 或通过
.jspx/.tagx后缀作为标志
三、编码获取机制
1. JSP语法格式编码获取
- 从JSP配置中获取特定编码
- 如果未指定具体编码,后续会通过BOM(字节顺序标记)探测
2. XML语法格式编码获取
- 如果文件有
.jspx/.tagx后缀 - 或在JSP配置中使用
<is-xml>标签显式指明
3. 自动编码探测
对于普通.jsp后缀且未在JSP配置中显式指明的情况:
- 通过
EncodingDetector进行自动探测 - 在Tomcat 8.0.50版本中使用
XMLEncodingDetector类(高版本已弃用/移除)
自动探测核心
processBom方法进行BOM解析:
- 通过流的前四个字节判断编码
- 探测失败默认使用UTF-8编码
- 支持的编码包括:
- UTF-16BE
- UTF-16LE
- UTF-8
- ISO-10646-UCS-4
- CP037
- 等
4. XML声明中的编码
对于XML形式语法:
- 优先使用
<?xml encoding='xx'中指定的编码 - 若无该属性,则使用前面BOM判断出的编码
四、多重编码混淆技术
1. 基本原理
利用JSP引擎对多重编码的处理特性:
- 通过不同层级的编码声明制造混淆
- 利用BOM探测与显式编码声明的优先级差异
- 组合使用标准JSP语法和XML语法
2. 实现方式
- BOM层混淆:在文件开头添加特定BOM标记
- XML声明层混淆:在XML声明中使用不同编码
- JSP配置层混淆:在web.xml中配置冲突的编码设置
- 语法混合:在同一个文件中混合使用标准JSP和XML语法
3. 绕过检测的关键点
- 利用不同层级编码解析的优先级
- 制造编码解析冲突使检测引擎失效
- 利用默认编码回退机制(UTF-8)
五、防御建议
- 统一编码规范:强制项目使用单一编码标准
- 严格语法检查:禁止混合使用JSP和XML语法
- BOM处理:明确处理或拒绝包含BOM的文件
- 编码声明验证:验证各层编码声明是否一致
- 更新检测引擎:支持多重编码解析场景的检测
六、总结
JSP的多重编码混淆技术利用了JSP引擎复杂的编码解析机制,通过在不同层级设置冲突的编码声明,可以有效绕过简单的WebShell检测。防御此类攻击需要深入理解JSP编码解析的全流程,并在各环节实施严格的验证措施。