Jsp中的jsp标准语法和XML语法的多重编码混淆
字数 1491 2025-08-18 11:36:48

JSP多重编码混淆技术详解

一、前言

本文深入分析JSP页面中利用标准语法和XML语法进行多重编码混淆的技术原理,重点探讨如何通过不同编码方式的组合来绕过WebShell检测引擎。该技术主要基于Y4tacker师傅的研究成果,并在代码层面进行了复现和验证。

二、JSP编码解析机制

1. 编码解析流程

JSP引擎处理编码主要分为两个步骤:

  1. 解析JSP中的所有指令
  2. 翻译整个单元(translation unit)

2. 指令解析核心

编码解析主要集中在ParserController#parseDirectives方法中,关键变量包括:

  • jspConfigPageEnc:通过getJspConfigPageEncoding方法从JSP配置(web.xml)中获取
  • 具体配置位置:web.xml中的<page-encoding>标签

3. 语法与编码探测

通过determineSyntaxAndEncoding方法探测:

  • 处理的是标准JSP语法还是XML语法编写的JSP页面
  • 获取它们使用的编码
  • 使用isXmlsourceEnc变量保存探测结果
    • 默认不是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引擎对多重编码的处理特性:

  1. 通过不同层级的编码声明制造混淆
  2. 利用BOM探测与显式编码声明的优先级差异
  3. 组合使用标准JSP语法和XML语法

2. 实现方式

  1. BOM层混淆:在文件开头添加特定BOM标记
  2. XML声明层混淆:在XML声明中使用不同编码
  3. JSP配置层混淆:在web.xml中配置冲突的编码设置
  4. 语法混合:在同一个文件中混合使用标准JSP和XML语法

3. 绕过检测的关键点

  • 利用不同层级编码解析的优先级
  • 制造编码解析冲突使检测引擎失效
  • 利用默认编码回退机制(UTF-8)

五、防御建议

  1. 统一编码规范:强制项目使用单一编码标准
  2. 严格语法检查:禁止混合使用JSP和XML语法
  3. BOM处理:明确处理或拒绝包含BOM的文件
  4. 编码声明验证:验证各层编码声明是否一致
  5. 更新检测引擎:支持多重编码解析场景的检测

六、总结

JSP的多重编码混淆技术利用了JSP引擎复杂的编码解析机制,通过在不同层级设置冲突的编码声明,可以有效绕过简单的WebShell检测。防御此类攻击需要深入理解JSP编码解析的全流程,并在各环节实施严格的验证措施。

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编码解析的全流程,并在各环节实施严格的验证措施。