Struts2 S2-052远程代码执行漏洞分析

天融信.阿尔法实验室 李喆,雨夜,张伟业

一、漏洞或事件描述

1.1漏洞背景

2017年9月5日,Apache官方发布了一则公告,该公告称Apache Struts2的REST插件存在远程代码执行的高危漏洞,CVE编号为CVE-2017-9805。

 

1.2漏洞概述

Struts2 REST插件的XStream组件存在反序列化漏洞,使用带有 XStream实例的 XStreamHandler进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

 

二、漏洞复现

点击edit然后submit抓包

52-1

修改包内容注意事项:

Windows,Content-Type要修改成 application/xml,command中写执行命令,string中是用来分割参数的。

正确写法:

Content-Type: application/xml

<command>

<string>c:\windows\system32\cmd.exe</string>

<string>/c echo  topsec> c:/topsec.txt</string>

</command>

错误写法

<string>c:\windows\system32\cmd.exe /c echo  topsec> c:/topsec.txt</string>

52-2

成功写入

52-3

同样在linux中也测试了一下

52-4

52-5

三、漏洞分析

 

通过发送payload请求后,返回报错信息,可以看到关键的调用栈位置,

52-6

在ContentTypeInterceptor.intercept之后,再将reader中的数据通过XStreamHandler中的toObject方法进行实例化,

52-7

然后接着调用了poayload中的unmarshaller对xml数据进行反序列化,

52-8

最终执行了payload中java.lang.ProcessBuilder进程生成器中的command方法来执行系统程序和参数。

52-9

四、修复建议

 

4.1影响版本

Struts 2.5 – Struts 2.5.12

4.2官方公告

http://struts.apache.org/docs/s2-052.html

4.3修复建议

1. 升级到 Apache Struts版本 2.5.13.

2. 在不使用时删除StrutsREST插件,或仅限于服务器普通页面和JSONs

<constantname=”struts.action.extension” value=”xhtml,,json” />

Written by lizhe