安恒给官方上报的,然后官方选择了1个对国内来说比较敏感的时期发了公告出来,好蛋疼。
该漏洞的CVE编号是CVE-2017-5638(s2-045),攻击者利用该漏洞可以进行远程命令执行,从而获取更高的服务器权限。
查了点资料,发现跟struts2配置中常量的配置有关,以struts-2.3.4版本为例,涉及到的常量配置文件有:
struts-2.3.4/src/core/src/main/resources/org/apache/struts2/default.properties
struts.multipart.parser=jakarta
struts-2.3.4/src/core/src/main/resources/struts-default.xml
<constant name="struts.multipart.handler" value="jakarta" /> 注:在部分高版本中,该文件中struts.multipart.handler变成了struts.multipart.parser.
该漏洞跟struts.multipart.handler的设置有关,默认使用的就是Jakarta对应类org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest。根据struts2加载常量的顺序(参考后文引用内容),struts-default.xml中的配置会覆盖掉default.properties的配置。因此只要struts.multipart.handler使用了默认的配置都会产生该漏洞。攻击者通过修改http请求头中的Content-Type的值来触发该漏洞,进而执行命令获取更高的系统权限。
如图所示:
上图是使用了测试用poc对被攻击服务器执行了”whoami”的命令。
漏洞影响范围:
Struts 2.3.5 – Struts 2.3.3
Struts 2.5 – Struts 2.5.10
修复建议:
升级到Struts 2.3.32 或者 Struts 2.5.10.1(稳妥方法)
或者在struts2配置中修改struts.multipart.handler的配置(个人理解,未测试)
修改相关配置为:
# struts.multipart.parser=cos # struts.multipart.parser=pell
上面配置是在default.properties文件中,将jakarta修改成使用pell或者cos插件,对应的要注释掉struts-default.xml中的内容。
参考引用内容如下:
在阅读接下来内容之前,可能要了解一下struts2的相关配置文件,参考某篇文章中总结如下:
struts-default.xml 默认的配置文件,也是基本的配置文件,很多配置项的默认值以及很多框架最基本的配置都在改文件中。比如Action的默认处理类就是在该配置文件中。
struts-plugin.xml Struts2框架插件的配置文件。Struts2框架有很多丰富的插件,所以很多配置在struts-default.xml中已经无法胜任了,因此每个插件都需要1个独立的配置文件,也就是struts-plugin.xml,该文件路径../struts-2.3.4/plugin/插件名/src/main/resources/下。
struts.xml,该文件配置开发的Action类,配置逻辑视图和物理视图的映射,配置常量值等。
struts.properties,也是常量配置文件。
在基于struts2框架开发时,需要配置很多常量,并且很多常量都有默认的值,这些常量默认值的配置是在default.properties文件中,也可以根据自己的应用情况覆盖default.properties中定义的常量值。如何覆盖呢?可以在struts.properties配置文件中定义常量,从而实现覆盖;也可以在struts.xml配置文件中定义常量,实现覆盖,又或可以在struts-plugin.xml配置文件中进行覆盖;这么多配置文件都可以定义常量,那么又以谁的为准呢?
最后,就是关乎哪个配置文件中的常量配置才是最后有效的。通常,在struts2框架中是按照如下顺序加载struts2常量的:
就是按照顺序搜索配置的常量,如果在多个文件中配置了同一个Struts2常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。
参考文档: