Apache Struts2 远程代码执行漏洞

漏洞描述

    Struts2 是全球使用最广泛的 Java web 服务器框架之一。

    S2-029 漏洞产生原因主要在于,Struts2 的标签库使用 OGNL 表达式来访问 ActionContext 中的对象数据,为了能够访问到 ActionContext 中的变量,Struts2 将 ActionContext 设置为 OGNL 的上下文,并将 OGNL 的跟对象加入 ActionContext 中。

    用户可以控制特定标签的属性,通过 OGNL 二次计算可以执行任意命令。

    例如:

    blob.png

    这个标签就调用了 OGNL 进行取值,Struts2 会解析 value 中的值,并当作 OGNL 表达式进行执行。

    OGNL第一次计算:

    String name = findString(this.name, “name”, “Resource bundle name is required. Example: foo or foo_en”);

    OGNL表达式为 #parameters.msg,计算后得到 parameters的属性,并将其属性值赋值给 value。

    OGNL第二次计算:

    ResourceBundle bundle = (ResourceBundle)findValue(“getTexts(‘” + name + “‘)”);

    对上面获取的属性值继续做 OGNL表达式执行。

检测方案

检测工具:struts29.jsp

检测说明:在使用struts2框架的网站上使用上述工具

检测方法:

将上述工具struts29.jsp放在网站根目录下

打开浏览器访问上述文件,如http://example.com/struts29.jsp

看网站服务器/tmp目录下是否生成了sangfor_test,如果生成了此文件,证明网站存在struts02-029漏洞

解决方案

1、严格验证新添加的 Struts 标签参数的属性;

2、建议用户将Struts升级至 2.3.26版本;