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

动态链接库创建

环境准备

  1. 安装MinGW并配置环境变量
  2. 执行mingw-get install gcc安装GCC编译器

创建DLL示例

  1. 编写C代码文件(如evil.c):
#include <stdlib.h>
#include <stdio.h>

void exec() {
    system("calc.exe");
}
  1. 编译为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);
}

关键点:

  1. 必须传入绝对路径,否则抛出异常
  2. 最终调用load0方法(0结尾表示是本地方法)
  3. 通过ClassLoader.loadLibrary加载库

加载流程

  1. System.load(String filename)
  2. 调用Runtime.load0(Class<?> fromClass, String filename)
  3. 调用ClassLoader.loadLibrary(Class<?> fromClass, File file)
  4. loadLibrary0中实例化NativeLibrary对象并调用其load方法

文件写入方法

Java中可用于写入文件的方法很多,常见的有:

  1. JavaUtils.writeBytesToFilename
  2. Files.write
  3. 各种输出流(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));
    }
}

组合利用技术

利用场景

  1. Hessian反序列化漏洞
  2. 表达式注入(如SpEL)
  3. 其他能够触发静态方法调用的场景

利用步骤

  1. 准备恶意DLL文件内容
  2. 通过文件写入方法将DLL写入目标系统临时目录
  3. 调用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);

防御措施

  1. 限制反序列化操作
  2. 禁止加载非可信的动态链接库
  3. 对文件写入操作进行严格权限控制
  4. 使用安全管理器限制敏感操作

扩展应用

这种技术也可以应用于:

  1. SpEL表达式注入中调用静态方法
  2. 其他能够触发静态方法调用的漏洞场景
  3. 结合其他漏洞链实现更复杂的攻击

总结

Java静态方法System.load()与文件写入的组合利用是一种有效的RCE技术,特别适用于Hessian等不需要序列化接口的反序列化场景。理解这种技术的原理和实现方式,有助于更好地防御相关攻击。

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 ): 编译为DLL: System.load方法分析 System类概述 System类是Java中与系统交互的重要类,提供静态方法和属性用于: 输入输出处理 获取系统信息 管理程序运行 load方法分析 System.load() 是一个静态方法,用于加载动态链接库: 关键点: 必须传入绝对路径,否则抛出异常 最终调用 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.writeBytesToFilename Files.write 各种输出流(FileOutputStream等) 示例代码: 组合利用技术 利用场景 Hessian反序列化漏洞 表达式注入(如SpEL) 其他能够触发静态方法调用的场景 利用步骤 准备恶意DLL文件内容 通过文件写入方法将DLL写入目标系统临时目录 调用 System.load 加载写入的DLL 示例Payload 防御措施 限制反序列化操作 禁止加载非可信的动态链接库 对文件写入操作进行严格权限控制 使用安全管理器限制敏感操作 扩展应用 这种技术也可以应用于: SpEL表达式注入中调用静态方法 其他能够触发静态方法调用的漏洞场景 结合其他漏洞链实现更复杂的攻击 总结 Java静态方法 System.load() 与文件写入的组合利用是一种有效的RCE技术,特别适用于Hessian等不需要序列化接口的反序列化场景。理解这种技术的原理和实现方式,有助于更好地防御相关攻击。