漏洞简介 漏洞描述
Apache Struts 2.3.19 to 2.3.20.2, 2.3.21 to 2.3.24.1, and 2.3.25 to 2.3.28, when Dynamic Method Invocation is enabled, allow remote attackers to execute arbitrary code via method: prefix, related to chained expressions.
影响范围Apache Struts 2.3.19 to 2.3.20.2, 2.3.21 to 2.3.24.1, and 2.3.25 to 2.3.28
漏洞原理A remote user can supply a specially crafted expression containing a 'method:' prefix to a target server that has enabled Dynamic Method Invocation to execute arbitrary code on the target system.
环境搭建下载存在漏洞的structs2版本,本次下载的是struts-2.3.20-apps.zip
解压后将文件struts2-showcase.war拷贝到tomcat目录下webapps
访问http://ip:port/struts2-showcase/home.action,可见:
漏洞分析
cleanupActionName这个方法是在对“action:”滥用的问题进行添加的,禁止了绝大多数的特殊字符,但是在后来的版本变更中忽略了之前的问题,将method也引入了Ongl表达式,代码在DefaultAction.java的invokeAction中,
可以看到methodName被带入到getValue了,虽然后面被强制添加了一对圆括号,但是想办法语法补齐就可以
利用方式主要难点在于两个地方,一个是上文提到的对于表达式最后的圆括号给予正确的表达式意义。另一个就是在传输过程中method会经过一次转义,双引号和单引号的没有办法使用了,所以需要找到一个绕过。剩下的就是原来套沙盒绕过
对于圆括号,可以直接使用new java.lang.String这样来拼接成new java.lang.String()构成正确Ognl语法。
至于不能使用引号的话,命令执行我们可以使用引用参数的方法来完成对字符串的提取,例如:使用#parameters.cmd来提取http的cmd参数。
开始验证使用Metasploit进行检测
复现成功
漏洞总结及防御方案更新以修复漏洞
分析出处:
Struts2方法调用远程代码执行漏洞(CVE-2016-3081)分析