Apache Struts 远程代码执行漏洞,CVE-2016-3081

  1. 洞简介
    1. 漏洞描述

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.

    1. 影响范围

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

    1. 漏洞原理

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.

    1. 环境搭建

下载存在漏洞的structs2版本,本次下载的是struts-2.3.20-apps.zip

解压后将文件struts2-showcase.war拷贝到tomcat目录下webapps

访问http://ip:port/struts2-showcase/home.action,可见:

Apache Struts 远程代码执行漏洞,CVE-2016-3081

  1. 漏洞分析

cleanupActionName这个方法是在对“action:”滥用的问题进行添加的,禁止了绝大多数的特殊字符,但是在后来的版本变更中忽略了之前的问题,将method也引入了Ongl表达式,代码在DefaultAction.java的invokeAction中,

可以看到methodName被带入到getValue了,虽然后面被强制添加了一对圆括号,但是想办法语法补齐就可以

利用方式主要难点在于两个地方,一个是上文提到的对于表达式最后的圆括号给予正确的表达式意义。另一个就是在传输过程中method会经过一次转义,双引号和单引号的没有办法使用了,所以需要找到一个绕过。剩下的就是原来套沙盒绕过

对于圆括号,可以直接使用new java.lang.String这样来拼接成new java.lang.String()构成正确Ognl语法。

至于不能使用引号的话,命令执行我们可以使用引用参数的方法来完成对字符串的提取,例如:使用#parameters.cmd来提取http的cmd参数。

    1. 开始验证

使用Metasploit进行检测

Apache Struts 远程代码执行漏洞,CVE-2016-3081

Apache Struts 远程代码执行漏洞,CVE-2016-3081

复现成功

  1. 漏洞总结及防御方案

更新以修复漏洞

分析出处:

Struts2方法调用远程代码执行漏洞(CVE-2016-3081)分析