java 静态方法 load+写文件组合拳利用
字数 1330 2025-08-22 12:23:30
Java静态方法load与文件写入组合利用技术分析
前言
本文主要分析Java中通过静态方法System.load()加载动态链接库与文件写入操作组合利用的技术。这种技术在反序列化漏洞利用中具有重要价值,特别是在Hessian反序列化等场景中,因为Hessian反序列化不需要类实现序列化接口,大大增加了利用面。
JNI与动态链接库基础
JNI概述
JNI(Java Native Interface)是Java提供的一种机制,允许Java程序调用C/C++编写的本地代码。这种调用不是直接执行可执行文件,而是通过动态链接库(DLL/SO)中封装的方法实现。
关键特点:
- 使用
native关键字修饰的方法表示该方法由本地代码实现 - Java底层很多功能都是通过JNI实现的
- 在漏洞利用中,可以通过加载恶意动态链接库实现RCE
动态链接库创建
环境准备
- 安装MinGW并配置环境变量
- 执行
mingw-get install gcc安装GCC编译器
创建DLL示例
- 编写C代码文件(如
evil.c):
#include <stdlib.h>
#include <stdio.h>
void exec() {
system("calc.exe");
}
- 编译为DLL:
gcc -shared -o evil.dll evil.c
System.load方法分析
System类概述
System类是Java中与系统交互的重要类,提供静态方法和属性用于:
- 输入输出处理
- 获取系统信息
- 管理程序运行
load方法分析
System.load()是一个静态方法,用于加载动态链接库:
public static void load(String filename) {
Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
}
关键点:
- 必须传入绝对路径,否则抛出异常
- 最终调用
load0方法(0结尾表示是本地方法) - 通过
ClassLoader.loadLibrary加载库
加载流程
System.load(String filename)- 调用
Runtime.load0(Class<?> fromClass, String filename) - 调用
ClassLoader.loadLibrary(Class<?> fromClass, File file) - 在
loadLibrary0中实例化NativeLibrary对象并调用其load方法
文件写入方法
Java中可用于写入文件的方法很多,常见的有:
JavaUtils.writeBytesToFilenameFiles.write- 各种输出流(FileOutputStream等)
示例代码:
import org.apache.commons.io.IOUtils;
import java.nio.file.Files;
import java.nio.file.Paths;
public class FileWriter {
public static void writeFile(String path, byte[] content) throws Exception {
Files.write(Paths.get(path), content);
// 或使用:IOUtils.write(content, new FileOutputStream(path));
}
}
组合利用技术
利用场景
- Hessian反序列化漏洞
- 表达式注入(如SpEL)
- 其他能够触发静态方法调用的场景
利用步骤
- 准备恶意DLL文件内容
- 通过文件写入方法将DLL写入目标系统临时目录
- 调用
System.load加载写入的DLL
示例Payload
// 1. 写入DLL文件
String tempDir = System.getProperty("java.io.tmpdir");
String dllPath = tempDir + "/evil.dll";
byte[] evilDll = getEvilDllBytes(); // 获取恶意DLL的字节数组
JavaUtils.writeBytesToFilename(dllPath, evilDll);
// 2. 加载DLL
System.load(dllPath);
防御措施
- 限制反序列化操作
- 禁止加载非可信的动态链接库
- 对文件写入操作进行严格权限控制
- 使用安全管理器限制敏感操作
扩展应用
这种技术也可以应用于:
- SpEL表达式注入中调用静态方法
- 其他能够触发静态方法调用的漏洞场景
- 结合其他漏洞链实现更复杂的攻击
总结
Java静态方法System.load()与文件写入的组合利用是一种有效的RCE技术,特别适用于Hessian等不需要序列化接口的反序列化场景。理解这种技术的原理和实现方式,有助于更好地防御相关攻击。