天融信.阿尔法实验室 李喆,雨夜,张伟业
一、漏洞或事件描述
1.1漏洞背景
2017年9月5日,Apache官方发布了一则公告,该公告称Apache Struts2的REST插件存在远程代码执行的高危漏洞,CVE编号为CVE-2017-9805。
1.2漏洞概述
Struts2 REST插件的XStream组件存在反序列化漏洞,使用带有 XStream实例的 XStreamHandler进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
二、漏洞复现
点击edit然后submit抓包
修改包内容注意事项:
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>
成功写入
同样在linux中也测试了一下
三、漏洞分析
通过发送payload请求后,返回报错信息,可以看到关键的调用栈位置,
在ContentTypeInterceptor.intercept之后,再将reader中的数据通过XStreamHandler中的toObject方法进行实例化,
然后接着调用了poayload中的unmarshaller对xml数据进行反序列化,
最终执行了payload中java.lang.ProcessBuilder进程生成器中的command方法来执行系统程序和参数。
四、修复建议
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” />