javascript
Spring4Shell的漏洞原理分析
Spring框架最新的PoC
這兩天出來的一個RCE漏洞,但是有以下的條件限制才行:
必須是jdk9及以上
必須是部署在tomcat的應用
是springmvc的或者webflux的應用
具體的可以查看spring官方:
https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement
我看到這個漏洞的時候,就去查了以下怎么利用的,github一搜很多py腳本。
但是我沒找到漏洞利用的原理,所以我就自己做了個demo,然后debugger了一下,原來是這樣~
漏洞利用的原理
我們都知道,我們在springmvc的時候經常會這么寫代碼來接收前端傳來的參數
@RequestMapping(value?=?"/register",?method?=?RequestMethod.GET) public?String?register(@RequestParam?Map<String,?String>?requestparams,?Model?model)?throws?Exception?{String?email?=?requestparams.get("email");String?username?=?requestparams.get("username");model.addAttribute("data",?"email:"?+?email?+?"?username:"?+?username);return?"index"; }如果我們這么訪問:
http://localhost:8080/vulnerable_war/register?email=11&username=b
那么返回的結果就是這樣:
image那么如果我們把接收的類型從Map轉成一個POJO的話,就像這樣:
@RequestMapping(value?=?"/register2",?method?=?RequestMethod.GET) public?String?register2(HelloWorld?obj,?Model?model)?throws?Exception?{model.addAttribute("data",?obj.toString());return?"index"; }訪問一下:
image這說明了,springmvc框架幫我們做了一個很重要的事情:
通過我們請求的數據,轉成了POJO對象。
恰巧就是這個非常好用的封裝導致了這個POC
解析POC第一步:到底構造了一個什么數據會引發(fā)呢?
跑的環(huán)境是:
jdk11
tomcat8.5.58
spring-webmvc5.3.15
將上面的數據用下面post的方式調用下面的接口
image@RequestMapping(value?=?"/rapid7") public?void?vulnerable(HelloWorld?model)?{}注意header里面的值是需要的,目的是為了迎合tomcat日志的pattern(下面會講到)
%i 這個語法是從請求的header里面拿xxx
就會在tomcat的Root目錄下生成一個jsp文件
image內容如下:
image計息POC第二步:jsp文件是怎么生成的?
方法接收的class:HelloWorld,我這么傳,spring框架是怎么來處理的呢?
image根據HelloWorld的實例
結合傳過來屬性路徑:class.module.classLoader.resources.context.parent.pipeline.first.pattern
然后一步步的運用反射來去拿屬性對應的值,這個例子的話就是
調用HelloWorld的getClass() 拿到Class對象
通過class對象調用getModule()
通過Module調用getClassLoader()
通過ClassLoader拿resources
context是Tomcat的StandardContext
parent拿到的是StandardEngine
pipeline拿到的是StandardPipeline
first拿到的是AccessLogValve
可以在下圖所示設置斷點:就可以看到上面說的每一步了
主角上場:
AccessLogValve是tomcat記錄日志的,
pattern是日志格式
suffix是日志文件的后綴
prefix是日志文件的前綴
fileDateFormat是日期文件的時間格式
謎底揭曉
根據以上分析,我們知道,傳過去的data由對象的class作為引子,然后springmvc會一步步反射拿屬性的方式最終是給AccessLogValve對象的幾個屬性的賦值操作
經過對tomcat的處理請求的日志管道(AccessLogValve)的改寫,導致當前請求會被觸發(fā)記錄日志,日志會按照我們想要的方式生成了一個jsp文件。
image為啥是jdk9及以上版本呢,因為module的概念是從jdk9開始的~
為啥是得部署到tomcat里的應用呢,因為只有這樣才會利用它的日志功能~
spring是咋修復的
image我是正東,學的越多不知道也越多。一個漏洞引發(fā)的思考~收獲挺大!
總結
以上是生活随笔為你收集整理的Spring4Shell的漏洞原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何获取当前C#程序所有线程的调用栈信息
- 下一篇: JS实现上下左右四方向无间隙滚动