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