继 3 月 7 日爆发的 S2-045 远程命令执行漏洞风波之后,今日 Struts2 官方发布另一个高危漏洞 S2-046,CVE 编号依然是 CVE-2017-5638,据官方披露,最新的漏洞与 S2-045 类似,只是攻击字段发生变化。修复方案依然与 S2-045 相同,升级至 2.3.32 或者 2.5.10.1 版本即可防御针对这两个漏洞攻击。
Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器 (Controller) 来建立模型与视图的数据交互。Struts2 的使用范围及其广泛,国内外均有大量厂商使用该框架。
漏洞描述:
据漏洞提交者纰漏,S2-046 的利用条件有以下三个方面:
1、系统必须使用 Jakarta 插件,检查 Struts2 配置文件中是否有以下配置:<constant name =“struts.multipart.parser”value =“jakarta-stream”/>
2、上传文件的大小(由 Content-LSength 头指定)大于 Struts2 允许的最大大小(2GB)
3、文件名内容构造恶意的 OGNL 内容。
如果满足以上要求,Struts2 受影响版本将创建一个包含攻击者控制的异常文件名,使用 OGNL 值堆栈来定位错误消息,OGNL 值堆栈将插入任何 OGNL 变量($ {}或%{})作为 OGNL 表达式,然后实现任意代码执行。
目前网络上已披露出针对 S2-046 的 POC
漏洞复现:
我们在本地搭建环境进行测试:
查看 Struts2 的配置文件,发现存在
<constant name =“struts.multipart.parser”value =“jakarta-stream”/>
下面进行网站上传测试,构造数据包如下,设定 Content-LSength 值大于 2GB,并构造恶意文件名,如下图所示:
通过响应数据包可看到恶意代码成功执行,攻击成功,如下图所示:
友情提示:
1.请升级到 Apache Struts 2.3.32 或 2.5.10.1 版本,下载地址:
http://archive.apache.org/dist/struts/2.3.32/
http://archive.apache.org/dist/struts/2.5.10.1/
2.测试的时候设定 Content-LSength 值不大于 2GB也可以利用成功,原因未知。