23日,struts2 S2-020漏洞补丁被绕过,昨天写了篇报告,放出来,写的比较着急~
关于struts2 S2-20漏洞及其补丁绕过的简要分析
一、漏洞爆出
http://struts.apache.org/release/2.3.x/docs/s2-020.html
是两个CVE-2014-0050(DoS), CVE-2014-0094(ClassLoader manipulation)
(1)其中0050这个漏洞的利用POC在
http://www.exploit-db.com/exploits/31615/
据说这个漏洞只会造成CPU的运行缓慢,不会有大影响,有兴趣的可以复现下这个DOS
(2)其中0094漏洞是由于classLoader的属性可更改所致,class.classLoader允许对象赋值
Object是java的基础类,所有的class生成的对象,都会继承Object的所有属性和方法,因此当前action无论是什么代码,必须有Object自带的getClass方法,这个方法会返回一个Class对象,Class对象又一定会有getClassLoader方法
由于OGNL是通过class.xxx的形式来遍历属性,得到的也是动态class,在不同容器中也各不相同,有人写过枚举代码,可以遍历出好几百出来
二. 漏洞的验证
大部分都是针对tomcat8的POC,这里我们举个通杀的例子
比如对Tomcat的docBase属性直接赋值,
class.classLoader.resources.dirContext.docBase=x
/*docbase
是
Tomcat进行应用目录映射路径配置的,也就是说只是指向了你某个应用目录
Appbase是指该目录下的自动部署为应用
*/
由于
docbase
属性被允许赋值,假设如果
docbase后边的是一个不存在路径,那么你将会更改掉docbase的属性,会返回一个404的错误
然后你打开当前任何struts2应用,都会是404
这样也就是造成了DOS的效果
命令执行那个功能可以参考这个分析报告
也就是说同样是利用了class.Loader的属性可更改漏洞,更改文件属性,然后进行请求写入类webshell,进行命令执行,这里就不再多做介绍
三.S2-20漏洞补丁被绕过
在4月23日晚上,众多绕过该补丁的情况出现
补丁如下:
https://github.com/apache/struts/commit/aaf5a3010e3c11ae14e3d3c966a53ebab67146be
但是这个补丁的关键如下,是一个正则的,但是是可以被绕过的
(.*\.|^)class\..*
比如
class.classLoader.resources.xxx
如果:class[“classLoader”][“resources”]
或者 class[“classLoader”].resources
或者把把双引号换成单引号,
或者是class-->Class大小写,都可以绕过补丁
可参考下面补救方式,类似下面这种:
class\[[‘”]classLoader[‘”]\]\[[‘”]\],nocase
可参考:
http://drops.wooyun.org/papers/1377