JSP Webshell中的编码问题
字数 1498 2025-08-10 08:28:18

JSP Webshell编码绕过技术详解

前言

本文深入探讨JSP Webshell构造中的编码绕过技术,主要基于Y4tacker师傅的研究成果,分析在JSP页面中如何利用多种编码方式进行混淆和绕过检测。我们将从JSP编译过程、编码探测机制到具体绕过方法进行系统讲解。

JSP编译过程中的编码处理

1. JSP编译流程概述

当JSP页面被请求时,容器会将其转换为等价的Servlet代码,这个过程主要分为两个步骤:

  1. 指令解析阶段:解析JSP中的所有指令
  2. 翻译单元阶段:将整个JSP页面转换为Servlet代码

2. 编码探测机制

编码的探测主要集中在generateJava方法中,该方法负责将JSP页面生成等价的Servlet页面。编码的获取主要通过以下途径:

2.1 从JSP配置获取

  • 通过getJspConfigPageEncoding方法从web.xml中的<page-encoding>标签获取编码
  • 存储在jspConfigPageEnc变量中

2.2 语法类型与编码确定

通过determineSyntaxAndEncoding方法确定:

  • 处理的是标准JSP语法还是XML语法编写的JSP页面
  • 获取它们使用的编码
  • 结果保存在isXmlsourceEnc变量中(默认非XML格式)

判断依据:

  • 通过<is-xml>标签显式声明
  • 通过.jspx.tagx后缀自动识别为XML格式

2.3 自动编码探测

对于普通.jsp后缀且未显式声明XML格式的情况,通过EncodingDetector进行自动探测:

  1. BOM探测

    • 通过processBom方法解析流的前四个字节判断编码
    • 支持的编码包括:UTF-16BE、UTF-16LE、UTF-8、ISO-10646-UCS-4、CP037等
    • 探测失败默认使用UTF-8编码
  2. XML编码声明

    • 如果存在<?xml encoding='xx'声明,优先使用声明的编码
    • 否则使用BOM探测的编码

编码混淆技术

1. 多重编码混淆

在JSP页面中支持使用多种不同的编码进行多次编码混淆,主要技术点:

  1. 嵌入编码声明:在JSP页面中使用支持的编码声明
  2. 编码叠加:对关键代码部分进行多次不同编码转换

2. XML语法利用

通过XML格式的JSP页面进行绕过:

  1. XML根元素检测

    • 创建JspReader对象
    • 通过hasJspRoot方法检测是否存在xxx:root标签
    • 该标签必须是第一个元素
    • 存在则设置isXml为true
  2. 命名空间提取

    • 通过切片获取xx部分作为命名空间

实际应用示例

1. 编码混淆Webshell

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 使用多重编码混淆 --%>
<%
    // 这里可以插入经过多重编码的恶意代码
    String cmd = request.getParameter("cmd");
    Process p = Runtime.getRuntime().exec(cmd);
    // ...
%>

2. XML格式Webshell

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:scriptlet>
        // 恶意代码
        String cmd = request.getParameter("cmd");
        Process p = Runtime.getRuntime().exec(cmd);
        // ...
    </jsp:scriptlet>
</jsp:root>

防御建议

  1. 输入验证:严格验证所有用户输入
  2. 文件上传限制:限制上传文件类型,检查文件内容
  3. 编码标准化:强制使用特定编码格式
  4. 安全配置:在web.xml中明确配置编码和语法类型
  5. WAF规则:部署针对多重编码混淆的检测规则

总结

JSP Webshell的编码绕过技术主要利用了JSP编译过程中复杂的编码探测机制,通过多重编码混淆和XML语法特性实现绕过。理解这些技术原理对于防御此类攻击至关重要。安全人员应关注编码处理流程中的各个环节,制定相应的防御措施。

参考资源

  1. JSP Webshell新姿势解读 - Y4tacker
  2. Webshell攻防下的黑魔法 - yzddmr6
  3. Byte order mark - Wikipedia
  4. Internationalization in Eclipse
JSP Webshell编码绕过技术详解 前言 本文深入探讨JSP Webshell构造中的编码绕过技术,主要基于Y4tacker师傅的研究成果,分析在JSP页面中如何利用多种编码方式进行混淆和绕过检测。我们将从JSP编译过程、编码探测机制到具体绕过方法进行系统讲解。 JSP编译过程中的编码处理 1. JSP编译流程概述 当JSP页面被请求时,容器会将其转换为等价的Servlet代码,这个过程主要分为两个步骤: 指令解析阶段 :解析JSP中的所有指令 翻译单元阶段 :将整个JSP页面转换为Servlet代码 2. 编码探测机制 编码的探测主要集中在 generateJava 方法中,该方法负责将JSP页面生成等价的Servlet页面。编码的获取主要通过以下途径: 2.1 从JSP配置获取 通过 getJspConfigPageEncoding 方法从 web.xml 中的 <page-encoding> 标签获取编码 存储在 jspConfigPageEnc 变量中 2.2 语法类型与编码确定 通过 determineSyntaxAndEncoding 方法确定: 处理的是标准JSP语法还是XML语法编写的JSP页面 获取它们使用的编码 结果保存在 isXml 和 sourceEnc 变量中(默认非XML格式) 判断依据: 通过 <is-xml> 标签显式声明 通过 .jspx 或 .tagx 后缀自动识别为XML格式 2.3 自动编码探测 对于普通 .jsp 后缀且未显式声明XML格式的情况,通过 EncodingDetector 进行自动探测: BOM探测 : 通过 processBom 方法解析流的前四个字节判断编码 支持的编码包括:UTF-16BE、UTF-16LE、UTF-8、ISO-10646-UCS-4、CP037等 探测失败默认使用UTF-8编码 XML编码声明 : 如果存在 <?xml encoding='xx' 声明,优先使用声明的编码 否则使用BOM探测的编码 编码混淆技术 1. 多重编码混淆 在JSP页面中支持使用多种不同的编码进行多次编码混淆,主要技术点: 嵌入编码声明 :在JSP页面中使用支持的编码声明 编码叠加 :对关键代码部分进行多次不同编码转换 2. XML语法利用 通过XML格式的JSP页面进行绕过: XML根元素检测 : 创建 JspReader 对象 通过 hasJspRoot 方法检测是否存在 xxx:root 标签 该标签必须是第一个元素 存在则设置 isXml 为true 命名空间提取 : 通过切片获取 xx 部分作为命名空间 实际应用示例 1. 编码混淆Webshell 2. XML格式Webshell 防御建议 输入验证 :严格验证所有用户输入 文件上传限制 :限制上传文件类型,检查文件内容 编码标准化 :强制使用特定编码格式 安全配置 :在web.xml中明确配置编码和语法类型 WAF规则 :部署针对多重编码混淆的检测规则 总结 JSP Webshell的编码绕过技术主要利用了JSP编译过程中复杂的编码探测机制,通过多重编码混淆和XML语法特性实现绕过。理解这些技术原理对于防御此类攻击至关重要。安全人员应关注编码处理流程中的各个环节,制定相应的防御措施。 参考资源 JSP Webshell新姿势解读 - Y4tacker Webshell攻防下的黑魔法 - yzddmr6 Byte order mark - Wikipedia Internationalization in Eclipse