这个漏洞开始已经是之前的事情了,今天有时间复现了一下。一般漏洞复现需要环境和exp,这次我们从搭建环境开始,不要去网上直接搞。
环境搭建
操作系统我们使用了Winxp,
大家都知道struts2是基于java的,首先我们需要java环境,具体就是jdk和jre的安装。具体网上都可以找到。最后有如下效果。
接下来需要下载tomcat,http://tomcat.apache.org/download-70.cgi 这里可以下载到。解压下载的zip,运行bin/startup.bat,tomcat就运行起来了。效果如下
接下来我们需要下载struts2,http://mirrors.opencas.org/apache/struts/2.3.32/struts-2.3.32-apps.zip
只要是2.3.*版本就可以,apps版本可以快速配置。将zip解压到tomcat的webapps目录下,运行tomcat,webapps下的war包就会自动解压。
访问http://192.168.198.129:8080/struts2-showcase/index.action 效果如下
漏洞的攻击
访问http://192.168.198.129:8080/struts2-showcase/integration/editGangster.action
开启burp抓包,表单随便输入一点,提交。请求头如下
我们修改请求头,如下图
得到回显,已经命令执行了,如下图
具体的exp,poc可以通过github搜索,如下图
漏洞成因
漏洞出在org.apache.struts2.s1.Struts1Action类的execute方法中,
首先这里ActionForward forward = action.execute(mapping, actionForm, request,
response);会把表单的请求处理回显给客户端,
然后addActionMessage(getText(msg.getKey(),Arrays.asList(msg.getValues())));
这里又调用了getText方法会把action messages传递给com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage ,
最后在其中又调用了com.opensymphony.xwork2.util.TextParseUtil.translateVariables,它用来调用OGNL 表达式用处理字符串表达式。漏洞利用OGNL表达式执行任意命令。
解决方案
不启用struts2-struts1-plugin插件
建议升级到最新版本2.5.10.1
开发者通过使用resource keys替代将原始消息直接传递给ActionMessage的方式。如下所示
messages.add(“msg”, newActionMessage(“struts1.gangsterAdded”, gform.getName()));
一定不要使用如下的方式
messages.add(“msg”, newActionMessage(“Gangster ” + gform.getName() + ” was added”));
漏洞影响
影响Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本,某云的检测系统在1902个网站中只检查出8个
如果想要了解更多网络空间安全知识,请访问 网络安全通,或者搜索 SecTown 。