IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    admin发表于 2017-03-07 05:10:59
    love 0

    安恒给官方上报的,然后官方选择了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



沪ICP备19023445号-2号
友情链接