Struts2再爆遠(yuǎn)程代碼執(zhí)行漏洞
摘要
Apache官方的struts2產(chǎn)品,最近出了一個(gè)遠(yuǎn)程代碼執(zhí)行漏洞,編號(hào)“S2-013”,目前是0DAY,官方?jīng)]有修補(bǔ)方案出現(xiàn)。
http://struts.apache.org/development/2.x/docs/security-bulletins.html — (公告)
官方安全公告給出了編號(hào)和簡(jiǎn)要介紹,“A vulnerability, present in the includeParams attribute of the URL and Anchor Tag, allows remote command execution”。
但是并沒(méi)有說(shuō)原理,也沒(méi)有發(fā)布任何補(bǔ)丁。
分析
事實(shí)上,這次struts2官方一共發(fā)了兩個(gè)漏洞,還有個(gè)叫s2-012,但是這個(gè)漏洞,看題目,應(yīng)該是我之前在《Xcon2012 攻擊JAVA WEB》時(shí)的已經(jīng)爆出來(lái)了,所以本文只說(shuō)另一個(gè)。
struts2官方的開(kāi)發(fā)傻乎乎的,比如這個(gè)漏洞,要么官方就不要發(fā)出來(lái),既然發(fā)出來(lái)了,就應(yīng)該發(fā)補(bǔ)丁,但是官方僅僅發(fā)了這段話,對(duì)于詳細(xì)內(nèi)容,普通用戶不開(kāi)放訪問(wèn)。
從這段話可以大致總結(jié)一下幾點(diǎn):
1、未修補(bǔ)的遠(yuǎn)程代碼執(zhí)行漏洞
2、includeParams參數(shù)在URLTAG中出現(xiàn)了問(wèn)題。
僅根據(jù)這兩點(diǎn),熟悉struts2運(yùn)行機(jī)制和之前漏洞原理的人,都可以輕易分析出具體利用POC。
漏洞觸發(fā):
由于官方?jīng)]有發(fā)補(bǔ)丁,所以最新版本的struts2還是有漏洞的,可以下載最新:Apache Struts 2.3.14 GA的示例應(yīng)用。
經(jīng)過(guò)簡(jiǎn)單測(cè)試,就看到了想要的結(jié)果。
根據(jù)官方給的信息,問(wèn)題出在a標(biāo)簽,所以寫個(gè)jsp頁(yè)面,內(nèi)容如下:
Click here.
這個(gè)是struts2標(biāo)簽庫(kù)的a標(biāo)簽,該標(biāo)簽會(huì)在頁(yè)面上顯示當(dāng)前URL,當(dāng)includeParams=all時(shí),就會(huì)顯示具體參數(shù)內(nèi)容。
唯一需要解的迷,就是如何讓參數(shù)內(nèi)容作為OGNL表示試執(zhí)行,但是這個(gè)迷未免太好猜了,我隨手測(cè)試就出結(jié)果。
訪問(wèn)url:
http://localhost:8080/blank/error.jsp?aaa=${struts2的常用POC,你懂得}
就可以直接彈計(jì)算器,POC代碼大家都有的,我只截個(gè)圖:
幾乎沒(méi)有什么分析過(guò)程,就拿到了POC,最終為了研究修補(bǔ)方案,只好被迫研究了漏洞原理。
漏洞原理:
Struts2標(biāo)簽庫(kù)中的url標(biāo)簽和a標(biāo)簽的includeParams這個(gè)屬性,代表顯示請(qǐng)求訪問(wèn)參數(shù)的含義,一旦它的值被賦予ALL或者GET或者POST,就會(huì)顯示具體請(qǐng)求參數(shù)內(nèi)容。按照正常的需求,把參數(shù)urlEncode一下也就夠了, 問(wèn)題在于,struts竟然多做了一步,這丫把參數(shù)做了OGNL解析!
代碼:
最終TextParseUtil.translateVariables會(huì)直接調(diào)用OGNL解析執(zhí)行。