S2-052 复现学习

S2-052复现学习。

前言

今年Struts爆出了很多的严重漏洞,作为一个安全研究员,总是等到别人的POC和漏洞分析出来后,才能去复现学习。心中好疼,决定自己学习一下之前的漏洞,如何进行分析其中的漏洞原理和POC的编写,然后对新出来的漏洞进行学习。

S2-052 环境搭建

tomcat下载

zip、tar.gz和Windows Service Installer三种安装包,其中:
Zip是Windows下的免安装版本,只需要解压后做一定的手动配置就可以正常的使用;
tar.gz是Linux下的安装包;
Windows Service Installer很明显就是Windows下的Install程序,双击后就可以自动安装了

高级系统设置–>环境变量–>系统变量–>添加 变量名:TOMCAT_HOME
变量值:你的TOMCAT所在目录

从官网下载Struts下载所有源码包,找到struts2-rest-showcase.war直接部署到tomcatwebapps目录下。

访问环境

漏洞分析

官方描述为:

The REST Plugin is using a XStreamHandler with an instance of XStream for deserialization without any type filtering and this can lead to Remote Code Execution when deserializing XML payloads.

其描述信息为,REST插件使用到XStreamHandler处理xml数据,由于未对xml数据做任何过滤,在进行发序列xml数据转换为Object时导致RCE

查看rest插件的相关配置。

\plugins\rest\src\main\resources\struts-plugin.xml

从这个文件中可以看到XStreamHanler就是Content-Type:xml的默认处理语句,而且看到xml是默认支持格式,也就是说存在rest插件就会存在反序列化漏洞。

看官方的补丁。

https://github.com/apache/struts/commit/19494718865f2fb7da5ea363de3822f87fbda264

在官方的修复方案中,主要就是将xml中的数据白名单化,把Collection和Map,一些基础类,时间类放在白名单中,这样就能阻止XStream反序列化的过程中带入一些有害类。

在9月6号的STRUTS_2_3_34版本中的
struts-STRUTS_2_3_34\plugins\rest\src\main\java\org\apache\struts2\rest\handlerorg.apache.struts2.rest.handler包下多了几个类文件。

XStreamHandler类修改了createXStream方法,同时增加了几个方法,作用是拒绝不安全的类执行。

由补丁发现REST插件将XStream处理的数据进行了处理,在调用 “xstream.fromXML(in, target);” 反序列化之前对其进行了检查。

复现

点击编辑,进入修改页面,点击”提交”抓包,然后修改Content-Type: application/xml格式,post数据替换为poc中的data即可弹出计算器了。

#####

参考

S2-052漏洞分析及官方缓解措施无效验证

struts各版本

Struts2 S2-052 RCE分析与利用

Struts2的REST插件

快速搭建Struts2漏洞演示环境(S2-032/033/037/devMode)

struts2漏洞汇总总结