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