Apache Struts 远程代码执行漏洞,CVE-2016-3081
- 漏洞简介
- 漏洞描述
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进行检测
复现成功
更新以修复漏洞
分析出处:
- 上一篇 »高级PHP应用程序漏洞审核技术
- 下一篇 »PHP常见代码执行后门函数