一款根据ASM污点流扫描 Jsp Webshell的工具
字数 1833 2025-08-29 08:30:36

JspFinder工具教学文档:基于ASM污点流扫描的JSP Webshell检测

一、工具概述

JspFinder是一款基于ASM污点流分析技术的JSP Webshell检测工具,能够有效识别各种类型的JSP Webshell,包括但不限于:

  • Runtime.exec类Webshell
  • ProcessBuilder类Webshell
  • ScriptEngine类Webshell
  • 冰蝎/哥斯拉/天蝎等加密Webshell

二、工具使用方式

基本命令

java -jar JspFinder-1.0.0-SNAPSHOT-jar-with-dependencies.jar 
  -d <web目录路径> 
  -cp <中间件jar包目录>

参数说明

  • -d:必需参数,指定需要扫描的web目录
  • -cp:推荐参数,指定依赖的中间件jar包目录(如Tomcat的lib目录)

示例

java -jar JspFinder-1.0.0-SNAPSHOT-jar-with-dependencies.jar 
  -d D:\tomcat环境\apache-tomcat-8.0.50-windows-x64\apache-tomcat-8.0.50 
  -cp D:\tomcat环境\apache-tomcat-8.0.50-windows-x64\apache-tomcat-8.0.50\lib

三、技术原理详解

1. JSP到Class的转换

JspFinder使用Tomcat的jasper包将JSP文件编译为class文件:

  • JSP执行逻辑会被放入__jspService方法中
  • 自定义方法在编译后保持原方法名和方法体不变

特殊文件名处理

  • 当JSP文件名包含非Java可识别字符时,jasper会修改文件名(如将"-"转换为"_002d")
  • 工具内部维护了原始文件名与编译后文件名的映射关系

2. 污点分析核心流程

2.1 方法调用关系分析

  1. 通过ASM分析类文件,构建方法调用关系图
  2. 对方法进行逆拓扑排序(确保先分析被调用的方法,再分析调用者)

2.2 污点传播分析

  • 分析方法的哪个参数会影响返回值
  • 示例分析结果格式:类名 方法名 方法描述符 污染参数位置

特殊处理

  • 非静态方法的第0号参数是类实例
  • 静态方法的参数从0开始编号

3. 关键技术改进点

3.1 构造方法的污点传递

public String abc(String abc) {
    return new String(abc);  // 构造方法也能传递污点
}
  • 在ASM模拟中,即使构造方法无返回值,也需要将污点传递给新建对象

3.2 集合操作的污点处理

List<String> cmds = new ArrayList<>();
cmds.add("cmd.exe");
cmds.add("/c");
cmds.add(cmd);  // 污点参数
  • 通过跟踪astore指令记录变量在本地变量表中的位置
  • 当执行List.add时,将污点传播到集合对象本身

3.3 字符串操作模拟

  1. Base64编码/解码

    • 跟踪LDC指令加载的字符串常量
    • 模拟Base64解码过程,保持污点传播
  2. 字节数组转字符串

    • 跟踪BIPUSH指令压入的ASCII码
    • 模拟new String(byte[])操作,还原原始字符串

3.4 反射调用检测

  • 跟踪反射调用的类名和方法名
  • 当发现反射调用RuntimeProcessBuilder时,判定为Webshell

4. 恶意方法检测流程

  1. 从逆拓扑排序结果开始分析
  2. 维护危险方法集合EvilDataflow
  3. 检测到调用危险方法时,记录方法名和污染参数位置
  4. 当分析到__jspService方法时:
    • 如果request参数(1号位)能流入危险方法,判定为Webshell

四、高级检测能力

1. 加密Webshell检测

  • 能够处理Base64编码的类名和方法名
  • 能够处理字节数组形式的反射调用

2. 多方法调用链分析

  • 支持分析跨多个方法的污点传播
  • 示例:
    public void webshell(String cmd) {
        String processedCmd = processInput(cmd);  // 方法调用
        execute(processedCmd);  // 危险方法
    }
    

3. 性能优化

  • 预分析JDK核心方法的污点传播关系,存储在passthrough.dat
  • 运行时只分析目标Web应用中的方法,提高检测速度

五、开发扩展指南

1. 添加新的危险方法

CoreMethodAdapter.visitMethodInsn中添加白名单条目:

// 格式:类名 方法名 方法描述符 参数位置
"java/lang/Runtime" "exec" "(Ljava/lang/String;)Ljava/lang/Process;" "1"

2. 支持新的编码方式

  1. 在模拟执行中跟踪相关指令(如BIPUSHLDC
  2. 在适当位置添加解码逻辑(如new String(byte[])BASE64Decoder.decodeBuffer

六、工具局限性

  1. 目前主要检测Runtime/ProcessBuilder/ScriptEngine相关Webshell
  2. 对高度混淆的Webshell可能存在漏报
  3. 需要依赖项目环境进行JSP编译

七、未来改进方向

  1. 增加更多Webshell家族的特征检测(如冰蝎、哥斯拉等)
  2. 优化字符串操作模拟的准确性
  3. 支持更多编码和混淆方式的检测

八、参考资源

  1. 项目地址:https://github.com/flowerwind/JspFinder
  2. ASM官方文档:https://asm.ow2.io/
  3. GadgetInspector分析:https://xz.aliyun.com/t/7058

通过本工具,安全人员可以快速准确地检测JSP Webshell,特别适合在真实攻防场景中使用。工具的模块化设计也便于扩展新的检测规则和功能。

JspFinder工具教学文档:基于ASM污点流扫描的JSP Webshell检测 一、工具概述 JspFinder是一款基于ASM污点流分析技术的JSP Webshell检测工具,能够有效识别各种类型的JSP Webshell,包括但不限于: Runtime.exec类Webshell ProcessBuilder类Webshell ScriptEngine类Webshell 冰蝎/哥斯拉/天蝎等加密Webshell 二、工具使用方式 基本命令 参数说明 -d :必需参数,指定需要扫描的web目录 -cp :推荐参数,指定依赖的中间件jar包目录(如Tomcat的lib目录) 示例 三、技术原理详解 1. JSP到Class的转换 JspFinder使用Tomcat的jasper包将JSP文件编译为class文件: JSP执行逻辑会被放入 __jspService 方法中 自定义方法在编译后保持原方法名和方法体不变 特殊文件名处理 : 当JSP文件名包含非Java可识别字符时,jasper会修改文件名(如将"-"转换为"_ 002d") 工具内部维护了原始文件名与编译后文件名的映射关系 2. 污点分析核心流程 2.1 方法调用关系分析 通过ASM分析类文件,构建方法调用关系图 对方法进行逆拓扑排序(确保先分析被调用的方法,再分析调用者) 2.2 污点传播分析 分析方法的哪个参数会影响返回值 示例分析结果格式: 类名 方法名 方法描述符 污染参数位置 特殊处理 : 非静态方法的第0号参数是类实例 静态方法的参数从0开始编号 3. 关键技术改进点 3.1 构造方法的污点传递 在ASM模拟中,即使构造方法无返回值,也需要将污点传递给新建对象 3.2 集合操作的污点处理 通过跟踪 astore 指令记录变量在本地变量表中的位置 当执行 List.add 时,将污点传播到集合对象本身 3.3 字符串操作模拟 Base64编码/解码 : 跟踪LDC指令加载的字符串常量 模拟Base64解码过程,保持污点传播 字节数组转字符串 : 跟踪 BIPUSH 指令压入的ASCII码 模拟 new String(byte[]) 操作,还原原始字符串 3.4 反射调用检测 跟踪反射调用的类名和方法名 当发现反射调用 Runtime 或 ProcessBuilder 时,判定为Webshell 4. 恶意方法检测流程 从逆拓扑排序结果开始分析 维护危险方法集合 EvilDataflow 检测到调用危险方法时,记录方法名和污染参数位置 当分析到 __jspService 方法时: 如果request参数(1号位)能流入危险方法,判定为Webshell 四、高级检测能力 1. 加密Webshell检测 能够处理Base64编码的类名和方法名 能够处理字节数组形式的反射调用 2. 多方法调用链分析 支持分析跨多个方法的污点传播 示例: 3. 性能优化 预分析JDK核心方法的污点传播关系,存储在 passthrough.dat 中 运行时只分析目标Web应用中的方法,提高检测速度 五、开发扩展指南 1. 添加新的危险方法 在 CoreMethodAdapter.visitMethodInsn 中添加白名单条目: 2. 支持新的编码方式 在模拟执行中跟踪相关指令(如 BIPUSH 、 LDC ) 在适当位置添加解码逻辑(如 new String(byte[]) 或 BASE64Decoder.decodeBuffer ) 六、工具局限性 目前主要检测Runtime/ProcessBuilder/ScriptEngine相关Webshell 对高度混淆的Webshell可能存在漏报 需要依赖项目环境进行JSP编译 七、未来改进方向 增加更多Webshell家族的特征检测(如冰蝎、哥斯拉等) 优化字符串操作模拟的准确性 支持更多编码和混淆方式的检测 八、参考资源 项目地址:https://github.com/flowerwind/JspFinder ASM官方文档:https://asm.ow2.io/ GadgetInspector分析:https://xz.aliyun.com/t/7058 通过本工具,安全人员可以快速准确地检测JSP Webshell,特别适合在真实攻防场景中使用。工具的模块化设计也便于扩展新的检测规则和功能。