一款根据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 方法调用关系分析
- 通过ASM分析类文件,构建方法调用关系图
- 对方法进行逆拓扑排序(确保先分析被调用的方法,再分析调用者)
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 字符串操作模拟
-
Base64编码/解码:
- 跟踪LDC指令加载的字符串常量
- 模拟Base64解码过程,保持污点传播
-
字节数组转字符串:
- 跟踪
BIPUSH指令压入的ASCII码 - 模拟
new String(byte[])操作,还原原始字符串
- 跟踪
3.4 反射调用检测
- 跟踪反射调用的类名和方法名
- 当发现反射调用
Runtime或ProcessBuilder时,判定为Webshell
4. 恶意方法检测流程
- 从逆拓扑排序结果开始分析
- 维护危险方法集合
EvilDataflow - 检测到调用危险方法时,记录方法名和污染参数位置
- 当分析到
__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. 支持新的编码方式
- 在模拟执行中跟踪相关指令(如
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,特别适合在真实攻防场景中使用。工具的模块化设计也便于扩展新的检测规则和功能。