javascript
我滴个乖乖,我复现了Spring的漏洞,害怕!
我真的復(fù)現(xiàn)了這次 Spring 的漏洞。
昨天晚上我正在家里悄悄卷你們的時(shí)候,突然有人給我發(fā)來(lái)這樣的一個(gè)鏈接:
https://sizeof.cat/post/springcore-rce/
然后只配上了四個(gè)字:
于是我趕緊點(diǎn)進(jìn)去看了一下。
很明顯這個(gè)文章最開始的時(shí)候應(yīng)該也是和我一樣一起吃瓜的。
因?yàn)樗铋_始的描述是用的這樣的詞匯:
可能、據(jù)說(shuō)、大概...
然后在某個(gè)時(shí)間點(diǎn)變成了這樣:
簡(jiǎn)單來(lái)說(shuō)就是:實(shí)錘了!
而文章中提到的這個(gè)地方是一個(gè) PDF 文件:
這個(gè) PDF 文件就是本文的核心了。
但是,我想先拐個(gè)彎讓你看看這個(gè)地方:
https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement
這里才是 Spring 關(guān)于這個(gè)漏洞的官宣。我強(qiáng)烈建議你自己去讀一讀這個(gè)官宣,里面內(nèi)容比較多,我就不給大家一一翻譯了。
只是給大家看看這個(gè)地方:
這里說(shuō)了兩件事,相當(dāng)于“辟謠”。
第一個(gè)是關(guān)于我之前文章中提到的廢棄 SerializationUtils 方法。
你看我之前的文章說(shuō)的還是“疑似瓜”,說(shuō)明我還是比較嚴(yán)謹(jǐn)?shù)摹?/p>
官方的博客說(shuō):
The deprecation is unrelated to this vulnerability.
棄用與此漏洞無(wú)關(guān)。
幸好我在之前的文章里面說(shuō)了:
這不,打臉來(lái)的那么快。但是沒(méi)關(guān)系,吃瓜嘛,開心最重要,挨幾巴掌,不寒磣。
第二個(gè)事情是說(shuō)這段時(shí)間 Spring Cloud Function 也爆出了一個(gè)高危漏洞,但是這個(gè)漏洞是在 Spring 漏洞之前爆出來(lái)的。
官方的說(shuō)法是:
It is also unrelated.
這兩者之間這也是不相關(guān)的。
所以,大家在吃瓜的時(shí)候要看準(zhǔn)方向,被別一些司機(jī)帶錯(cuò)路了,假瓜吃的津津有味,自己還不知道。
然后,在我寫文章的時(shí)候,這個(gè)官方博客也在不斷的更新:
可以看到在 14:00 更新了這個(gè)漏洞報(bào)告:
https://tanzu.vmware.com/security/cve-2022-22965
在這個(gè)報(bào)告里面,再次明確了這個(gè)漏洞的先決條件:
必須是 JDK 9+ 的版本。
必須是 Apache Tomcat 作為 Servlet 容器。
必須是以 war 的形式打包。
必須是依賴了 spring-webmvc 或 spring-webflux。
我想第一個(gè)條件,就讓一大批人放心了。
至少這波,不用加班加點(diǎn)的升級(jí)修復(fù)了。
可以安心吃瓜。
開始復(fù)現(xiàn)
額,這么寫到這里了都還沒(méi)有進(jìn)入正題呢。
好吧,我想閑扯的基本上也就扯完了,下面開始搞事情。
讓我們回到這個(gè)地方:
你訪問(wèn)下面這個(gè)鏈接,可以直接拿到這個(gè) pdf:
https://sizeof.cat/post/springcore-rce/files/readme.pdf
打開這個(gè) PDF 之后,你可以看到如果要復(fù)現(xiàn)漏洞,要求條件是這樣的:
你仔細(xì)思考,其實(shí)這些條件都在 Spring 官宣的先決條件內(nèi)。
先不必糾結(jié)于此,主要記住我框起來(lái)的這兩個(gè)點(diǎn),然后直接看下面的重點(diǎn)。
在漏洞分析里面,他提到了一句話,是重中之重:
因?yàn)槲矣X(jué)得需要使?的參數(shù)內(nèi),存在?個(gè) Class 類型的屬性。
什么意思呢?
就是假設(shè)我們定義一個(gè)請(qǐng)求對(duì)象,叫做 UserReqDto,是這樣定義的:
里面有一個(gè) Class 類型的屬性,就是這個(gè)意思。
確實(shí),我縱橫開發(fā)界這么久,就沒(méi)有見過(guò)請(qǐng)求對(duì)象里面要求傳 Class 的。
但是他給出了這樣的一個(gè)示例:
分別有兩個(gè)對(duì)象,EvalBean 和 CommonBean。
其中 CommonBean 是 EvalBean 的一個(gè)屬性。
這樣的定義就非常的常見了吧,項(xiàng)目里面一抓一大把。
然后還記得我前面框起來(lái)的兩個(gè)點(diǎn)嗎?
這啥意思?
上個(gè)代碼你就看的明明白白的:
這寫法就是“Spring 的參數(shù)綁定”,這不就是我們常規(guī)的寫法嗎?沒(méi)有看到任何不妥的地方呀?
是的,沒(méi)有看到任何不妥的地方。
但是,如果你這樣的代碼對(duì)應(yīng)的運(yùn)行環(huán)境和方式,滿足了前面官方提到的先決條件。
那么恭喜你,就是有漏洞的。
你就仔細(xì)想想,是不是細(xì)思極恐?
那么對(duì)應(yīng)的原理是啥呢?
大佬在 PDF 里面指了個(gè)路:
意思就是在前面的示例代碼中,請(qǐng)求對(duì)象中雖然沒(méi)有 class 熟悉,但是在 Spring 進(jìn)行參數(shù)綁定的時(shí)候會(huì)憑空多出一個(gè) “class” 屬性。
那么為什么會(huì)多出來(lái)呢?
我不知道,我也沒(méi)去深入研究。大概是因?yàn)榉瓷涞臅r(shí)候獲取 bean 信息會(huì)處理所有以 get 開頭的方法,所以 getClass 方法被映射成了 class 屬性。
然后再想一想為什么是 JDK 9+ 以后才有這個(gè)問(wèn)題呢?
我也不知道,但我盲猜一波是因?yàn)檫@個(gè)東西,模塊化:
但是我也沒(méi)有具體的依據(jù),都說(shuō)了是盲猜了。
反正路指給你了,你想深入的話,可以從這條路走。
那么到底怎么發(fā)起攻擊呢?
PDF 里面也寫了。
你只要把代碼打個(gè) war 包,然后運(yùn)行在對(duì)應(yīng)的環(huán)境中,并執(zhí)行下面這五個(gè)請(qǐng)求:
就能在項(xiàng)目的 out 文件夾中寫入一個(gè) jsp:
寫入 jsp 文件啊!
老鐵,這可是寫入了一個(gè) jsp 文件啊!
我不知道你有沒(méi)有經(jīng)歷過(guò) jsp 文件寫頁(yè)面的那個(gè)時(shí)代,我以前寫過(guò)。
我當(dāng)年特別喜歡這個(gè)東西,因?yàn)樗С譄岵渴?#xff0c;修改了 jsp 頁(yè)面的內(nèi)容,都不用重啟的。
所以,我喜歡通過(guò) jsp 頁(yè)面留下一點(diǎn)方便我對(duì)項(xiàng)目進(jìn)行運(yùn)維的后門操作。
后門是啥,具體就不詳說(shuō)了。
如果你知道 jsp 的威力,你就能明白這句話的分量是多大:
這可是由別人通過(guò)構(gòu)造特定的請(qǐng)求寫入了一個(gè) jsp 文件在你的項(xiàng)目里面啊!
而且,我能寫 jsp 了,難道我就不能多寫點(diǎn)其他的什么東西....
但是我必須要補(bǔ)充一句,如果你也想復(fù)現(xiàn)這個(gè)漏洞,最關(guān)鍵的是前面提到的“五個(gè)請(qǐng)求”。
然而在 pdf 里面,這五個(gè)請(qǐng)求的內(nèi)容其實(shí)是不全的,大概缺失了 30% 的內(nèi)容。
我不知道為什么,但是我猜測(cè)是作者故意的。
但是,憑借我超強(qiáng)的悟(瞎)性(猜),我花了一點(diǎn)時(shí)間,補(bǔ)全了這部分的請(qǐng)求。
所以,經(jīng)過(guò)一番折騰,我本地也成功寫入了這個(gè) jsp 文件:
萬(wàn)事俱備,只需要觸發(fā)一下了。
怎么觸發(fā)呢?
jsp 頁(yè)面還能怎么觸發(fā),簡(jiǎn)單的很嘛。
直接訪問(wèn)對(duì)應(yīng)鏈接就可以了:
我能調(diào)起計(jì)算器,我就能接管你的機(jī)器。
而在這個(gè)過(guò)程中,控制臺(tái)不會(huì)有任何輸出:
但是還是能處理正常的請(qǐng)求,且打印日志:
潛入細(xì)無(wú)聲,我就問(wèn)你,怕不怕!
p1n93r
從 PDF 上看,是一個(gè)叫做 p1n93r 寫的這個(gè) PDF,并且把相關(guān)測(cè)試代碼開源了:
但是在我看到這篇文章并點(diǎn)擊這個(gè)開源項(xiàng)目的時(shí)候,發(fā)現(xiàn)已經(jīng) 404 了:
甚至,p1n93r 也已經(jīng) 404 了:
然后我搜索了一下這個(gè)關(guān)鍵詞:
確認(rèn)這是一個(gè)安全大佬,但是不知道是紅是黑。
我的搜索也就止步于此了,很明顯,他主動(dòng)刪除了相關(guān)的項(xiàng)目,甚至主動(dòng)讓自己在 github 上消失,就是不想引起關(guān)注。
對(duì)于一個(gè)安全大佬來(lái)說(shuō),靜默,就是最好的生存之道。
這讓我想起了和另外一個(gè)安全大佬的對(duì)話:
就到這。
技術(shù)交流群
最近有很多人問(wèn),有沒(méi)有讀者交流群,想知道怎么加入。
最近我創(chuàng)建了一些群,大家可以加入。交流群都是免費(fèi)的,只需要大家加入之后不要隨便發(fā)廣告,多多交流技術(shù)就好了。
目前創(chuàng)建了多個(gè)交流群,全國(guó)交流群、北上廣杭深等各地區(qū)交流群、面試交流群、資源共享群等。
有興趣入群的同學(xué),可長(zhǎng)按掃描下方二維碼,一定要備注:全國(guó) Or 城市 Or 面試 Or 資源,根據(jù)格式備注,可更快被通過(guò)且邀請(qǐng)進(jìn)群。
▲長(zhǎng)按掃描
往期推薦 不要簽字!不要簽字!不要簽字!最近違法裁員猖獗,這里單獨(dú)給大家一些應(yīng)對(duì)參考!重磅!俄羅斯將與全球互聯(lián)網(wǎng)斷開,啟用本國(guó)互聯(lián)網(wǎng)“Runet”!問(wèn)八股文的公司都是垃圾!?如果你喜歡本文,
請(qǐng)長(zhǎng)按二維碼,關(guān)注?Hollis.
轉(zhuǎn)發(fā)至朋友圈,是對(duì)我最大的支持。
點(diǎn)個(gè)?在看?
喜歡是一種感覺(jué)
在看是一種支持
↘↘↘
總結(jié)
以上是生活随笔為你收集整理的我滴个乖乖,我复现了Spring的漏洞,害怕!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 感谢前任程序员赏饭吃!
- 下一篇: 新入职了一个卷王 , 天天加班12点!张