繆卓潔 羅海波 鄒煒成 洪家豪
摘 ?要:文章介紹了 Struts 2.3.x 系列中 Struts2 -048 號(hào)漏洞的背景、漏洞影響、對(duì)于漏洞的分析和漏洞復(fù)現(xiàn)的操作示例。為了了解在漏洞暴露而且被利用時(shí)對(duì)于企業(yè)利益的嚴(yán)重危害,本文通過(guò)在 Struts 2.3.x 系列其中的 Struts 2.3.32 的 showcase 應(yīng)用中演示對(duì) Struts2 整合 Struts1 的插件中存在一處任意代碼執(zhí)行漏洞的攻擊行為并且從 Struts(Struts2-048)遠(yuǎn)程命令執(zhí)行漏洞還原的過(guò)程中,分析出漏洞產(chǎn)生原因是由于啟用了插件 struts2-struts1-plugin 而且在其插件內(nèi)部(struts2-struts1-plugin-2.3.x.jar)中的代碼存在不受信任的輸入并傳入到 ActionMessage 類中導(dǎo)致惡意命令執(zhí)行的過(guò)程。在漏洞問(wèn)題下羅列出現(xiàn)有的解決方案,并簡(jiǎn)述其補(bǔ)救措施和其他相關(guān)技術(shù)概念。從而表明了該漏洞的危害性和需盡快修復(fù)的緊急程度。
關(guān)鍵詞:Struts2漏洞;Struts2;S2-048;OGNL;Webwork
1 ?原理技術(shù)概要
1.1 Webwork
它是Struts系列的前身,來(lái)源于一個(gè)開源組織 opensymphony,且是從Xwork項(xiàng)目的基礎(chǔ)上發(fā)展而來(lái),Webwork簡(jiǎn)潔且功能強(qiáng)大,完全從web層脫離,它提供了包括前端攔截、表單屬性驗(yàn)證、類型轉(zhuǎn)換以及強(qiáng)大的表達(dá)式語(yǔ)言O(shè)GNL等核心功能。Webwork在處理http請(qǐng)求和響應(yīng)時(shí)使用Servlet Dispatcher將http請(qǐng)求轉(zhuǎn)化為業(yè)務(wù)層、會(huì)話層和應(yīng)用層范圍的映射,請(qǐng)求參數(shù)映射為Webwork2支持的多視圖表示,視圖部分可以使用JSP、Velocity、Free Marker、Jasper Repots、XML等。
1.2 Struts2
Struts2架構(gòu)繼承了Webwork的架構(gòu)流程,而并未沿用Struts1的設(shè)計(jì)核心,但從處理流程上看,Struts2還是以控制器為重點(diǎn),包括核心控制器和業(yè)務(wù)邏輯控制器。
處理流程簡(jiǎn)述為:客戶端提交一個(gè) HttpServletRequest 請(qǐng)求,接著請(qǐng)求被提交到一系列的過(guò)濾器,然后經(jīng)過(guò) FilterDispatcher 時(shí)會(huì)詢問(wèn) ActionMapper 是否需要調(diào)用某個(gè)Action來(lái)處理這個(gè)請(qǐng)求,如果 ActionMapper 決定需要調(diào)用某個(gè) Action,F(xiàn)ilterDispatcher 則把請(qǐng)求的處理交給 ActionProxy。
ActionProxy 通過(guò)Configuration Manager向文件struts.xml查詢框架的配置文件,找到需要調(diào)用的Action類。ActionProxy 創(chuàng)建一個(gè) ActionInvocation 實(shí)例,同時(shí) ActionInvocation 通過(guò)代理模式調(diào)用Action。但在調(diào)用之前,ActionInvocation 會(huì)根據(jù)配置加載 Action 相關(guān)的所有Interceptor。
Action執(zhí)行完畢后,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result。
1.3 OGNL
OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,通過(guò)它簡(jiǎn)單一致的表達(dá)式語(yǔ)法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能。它使用相同的表達(dá)式去存取對(duì)象的屬性。這樣可以更好的取得數(shù)據(jù)。
Webwork2和現(xiàn)在的Struts2.x系列中使用OGNL取代原來(lái)的EL來(lái)做界面數(shù)據(jù)綁定,所謂界面數(shù)據(jù)綁定,也就是把界面元素(例如一個(gè)textfield,hidden)和對(duì)象層某個(gè)類的某個(gè)屬性綁定在一起,修改和顯示自動(dòng)同步。
2 ?漏洞復(fù)現(xiàn)和分析
2.1 復(fù)現(xiàn)環(huán)境準(zhǔn)備和工具介紹
步驟1:準(zhǔn)備Struts 2.3.x 的項(xiàng)目文件;步驟2:部署showcase和MAVEN并啟動(dòng)項(xiàng)目;步驟3:準(zhǔn)備exp漏洞利用shell腳本或者poc,下載地址為:。步驟4:在虛擬機(jī)驗(yàn)證漏洞。
2.2 漏洞復(fù)現(xiàn)和分析
(1)漏洞分析
漏洞產(chǎn)生的原因是在struts2-struts1-plugin包中Struts1Action.java中execute函數(shù)調(diào)用了getText函數(shù),這個(gè)函數(shù)會(huì)執(zhí)行OGNL表達(dá)式,更加增大該漏洞級(jí)別的是getText的輸入內(nèi)容還是攻擊者可控的,即可以構(gòu)造后臺(tái)服務(wù)器的執(zhí)行指令通過(guò)該方法去執(zhí)行,相當(dāng)于直接使用后臺(tái)服務(wù)器賬號(hào)直接登入執(zhí)行命令操作。
(2)漏洞復(fù)現(xiàn)
開啟showcase服務(wù)并啟動(dòng)虛擬機(jī),發(fā)送exp的shell腳本到虛擬機(jī)中,打開命令行先ping一下與部署應(yīng)用的主機(jī)網(wǎng)絡(luò),無(wú)異常則執(zhí)行exp腳本。依次輸入 3,http://192.168.122.1:8080/integration/saveGangster.action,ipconfig 這三個(gè)參數(shù)。結(jié)果如圖1:
第一個(gè)參數(shù)3代表選擇驗(yàn)證第三個(gè)漏洞 Struts2-048;第二參數(shù)是一個(gè)鏈接,代表著你想驗(yàn)證的showcase應(yīng)用的訪問(wèn)地址;第三個(gè)參數(shù)為注入的執(zhí)行命令,可以寫如ipconfig,netstat -ano等windows命令。執(zhí)行腳本后發(fā)現(xiàn)部署著showcase應(yīng)用的服務(wù)器的IP,網(wǎng)關(guān)等信息全都顯示出來(lái)。是一個(gè)十分危急的漏洞,需要盡快修復(fù)。
3 結(jié)論
本文在簡(jiǎn)單介紹Struts2框架的基本概念和知識(shí)之后,基于Struts2框架存在的各類缺陷和漏洞,以及各類web開發(fā)框架被廣泛應(yīng)用的事實(shí),對(duì)應(yīng)用程序開發(fā)使用Struts2開發(fā)框架的安全升級(jí)進(jìn)行總結(jié)和給出解決方案,并指出在使用這個(gè)框架時(shí),應(yīng)對(duì)其進(jìn)行更多的安全考量和評(píng)估,其中重點(diǎn)闡述了Struts2-048漏洞,并通過(guò)源碼詳細(xì)分析了它的調(diào)用過(guò)程和簡(jiǎn)單闡述了這個(gè)漏洞的利用方式,同時(shí)給出了針對(duì)存在該漏洞的某站點(diǎn)的實(shí)際利用結(jié)果示例。
參考文獻(xiàn)
[1] ?廖文軍,朱曉乾,萬(wàn)開. 淺析Struts2兩個(gè)安全漏洞的原理、利用與防范[C]. 電子測(cè)試:上海通用識(shí)別技術(shù)研究所,2014,61 - 63.
[2] ?天融信科技. Struts(S2-048)遠(yuǎn)程命令執(zhí)行漏洞分析[J]. 搜狐科技,2017-07-08.
[3] ?Struts2漏洞[J]. 中國(guó)信息安全,2013-08-15.
[4] ?360:Struts2漏洞拉響網(wǎng)站安全紅色警報(bào)[J]. 計(jì)算機(jī)與網(wǎng)絡(luò). 2012-07-26