首页 > 渗透测试 > [紧急预警]Struts2 基于Jakarta的远程命令执行漏洞
2017
03-07

[紧急预警]Struts2 基于Jakarta的远程命令执行漏洞

安恒给官方上报的,然后官方选择了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的值来触发该漏洞,进而执行命令获取更高的系统权限。
如图所示:

[紧急预警]Struts2 基于Jakarta的远程命令执行漏洞 - 第1张  | 阿德马Web安全

上图是使用了测试用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常量的:

  • struts-default.xml配置文件
  • struts-plugin.xml配置文件
  • struts.xml配置文件
  • struts.properties配置文件
  • web.xml配置文件

就是按照顺序搜索配置的常量,如果在多个文件中配置了同一个Struts2常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

参考文档:

Struts2学习之初见Struts2

最后编辑:
作者:admin
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。