繆卓潔 羅海波 鄒煒成 洪家豪

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