ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SpringBoot Actuator未授权访问漏洞实战:从信息泄露到RCE的利用链与修复

2026/9/19 8:29:10 拓冰建站 浏览量
SpringBoot Actuator未授权访问漏洞实战:从信息泄露到RCE的利用链与修复 1. 从一次内部资产梳理说起Actuator端点为什么会成为突破口很多做Java后端的同行对SpringBoot Actuator的感情是复杂的。它本来是框架自带的一套运维监控能力能暴露健康检查、指标采集、环境变量、Bean列表等信息方便做服务治理和问题排查。但问题恰恰出在方便两个字上——默认情况下只要依赖引入且没有额外做安全隔离这些端点就可能被外部直接访问到。我在一次内部资产梳理的过程中用最普通的路径扫描就命中了多个暴露在公网的Actuator实例。当时的第一反应不是兴奋而是有点后怕这些服务里有的直接把/actuator/env、/actuator/heapdump、/actuator/beans全部开放甚至连/actuator/shutdown都没关。对于运维同学来说这可能只是配置没来得及收口但对于做安全测试的人来说这就是一条从信息泄露直通命令执行的完整链路。这篇文章想聊的不是教科书式的漏洞定义而是把发现—验证—利用—修复这条链路完整走一遍。我会重点讲清楚三件事第一Actuator到底暴露了什么、哪些端点真正危险第二从信息泄露到RCE的常见利用路径是怎么串起来的第三作为开发或运维怎么用最小的改动把风险摁下去。内容偏实战适合有一定SpringBoot基础、想了解安全测试思路的后端同学也适合做资产梳理和应急响应的同行参考。需要先说明一点下面所有操作都应在自己搭建的靶场或获得明确授权的测试环境中进行。未经授权对他人系统进行测试性质完全不同这一点没有商量余地。2. Actuator端点全景哪些是信息哪些是入口2.1 默认暴露与显式暴露的区别SpringBoot 2.x之后Actuator的端点暴露策略发生了明显变化。默认情况下只有/actuator/health和/actuator/info是通过Web暴露的其余端点虽然存在但默认不对外。这个设计本身是合理的问题在于很多项目为了图方便直接写了management: endpoints: web: exposure: include: *这一行配置等于把所有端点全部打开。更麻烦的是有些项目还叠加了management.endpoint.shutdown.enabledtrue把关闭服务的开关也交了出去。所以判断一个Actuator是否危险第一步不是看它有没有暴露而是看它暴露了哪些。我通常会把端点按风险分成三档这样在梳理资产时能快速定位重点风险等级典型端点能拿到什么危害高/env、/heapdump、/threaddump、/shutdown环境变量、堆内存、线程栈、服务开关敏感信息泄露、服务中断中/beans、/mappings、/configprops、/httptraceBean结构、路由映射、配置属性、请求轨迹为后续利用提供情报低/health、/info、/metrics健康状态、基本信息、指标信息收集这张表不是绝对的比如/metrics单独看风险不高但如果结合其他端点做信息拼图价值就上来了。热词里提到的metrics未授权访问漏洞其实就是这个逻辑——单点不致命组合起来很要命。2.2 /env和/heapdump为什么是重灾区/actuator/env会返回应用的环境变量和配置属性。很多项目把数据库密码、Redis密码、第三方API密钥直接写在配置文件里一旦这个端点开放等于把家底摊开给人看。更隐蔽的是Spring的配置属性支持占位符/env返回的可能是******脱敏后的值但通过/actuator/env/{propertyName}这种带路径的访问方式有时能拿到未脱敏的原始值。这个细节在实战中非常关键很多人看到星号就放弃了其实还有下一层。/actuator/heapdump则是另一个维度的危险。它会导出一份JVM堆内存快照文件通常是hprof格式。堆里有什么运行时的对象、字符串常量、连接池里的凭据、甚至某些框架缓存的令牌。拿到heapdump之后用MAT或者JVisualVM打开搜索关键字就能捞出大量敏感信息。我见过最夸张的一次堆里直接躺着明文的数据库连接串和一套内部系统的签名密钥。提示heapdump文件可能很大下载前先确认目标带宽和存储避免把测试环境拖垮。另外堆快照里可能包含他人隐私数据测试时要注意数据处置。2.3 端点发现的实际手法发现Actuator通常不需要多高深的技术。最直接的是访问/actuator根路径如果返回一个包含_links的JSON里面列出的就是当前暴露的端点。如果根路径被禁用可以尝试常见路径字典/actuator/env、/actuator/health、/actuator/beans、/actuator/mappings等。这里有个经验不同SpringBoot版本的端点路径前缀可能不同。1.x时代默认是根路径直接暴露比如/env、/health2.x之后统一加了/actuator前缀。所以扫描时两个前缀都要覆盖。另外有些项目会自定义management.endpoints.web.base-path改成/manage、/monitor之类这时候就需要结合目录扫描工具做更全面的探测。我在实际操作中习惯先请求/actuator看返回的_links结构再根据版本特征判断后续路径。如果_links里出现了env、heapdump这类字段基本可以确定这个实例的暴露面比较大。3. 从信息泄露到命令执行利用链是怎么串起来的3.1 利用链的整体思路很多人以为Actuator漏洞就是看看信息其实真正的风险在于它能作为跳板。一条典型的利用链是这样的先通过/env或/heapdump拿到敏感配置再用这些配置去访问数据库、缓存或内部服务最后在某个环节找到写入或执行的机会。热词里提到的RCE和rce绕过说的就是这条链的终点。需要强调的是Actuator本身并不直接提供命令执行接口。它的危险在于信息和配置的暴露让攻击者能够借助Spring的配置机制或外部依赖完成进一步操作。理解这一点才能明白为什么修复的重点是收口而不是打补丁。3.2 通过/env配合配置注入的经典路径SpringBoot的配置体系支持从环境变量、系统属性、配置文件等多个来源读取属性。/actuator/env不仅能读在某些版本和配置下配合/actuator/refresh需要Spring Cloud Context还能触发配置刷新。如果应用使用了Spring Cloud Config或Nacos这类配置中心并且Actuator的refresh端点开放理论上可以通过修改配置源来影响应用行为。更常见的是利用/env泄露的数据库凭据。拿到数据库账号密码后如果数据库端口对外可达就可以直接连接。如果数据库里存了应用的管理员账号或者有可以写入的文件表利用面就进一步扩大了。热词里出现的mongodb未授权访问漏洞和redis在springboot中的使用其实指向的就是这类组合风险——Actuator泄露了连接信息而下游的MongoDB或Redis本身又没有做认证。3.3 heapdump里的凭据挖掘实操heapdump的利用相对直接。下载到hprof文件后我一般用两种方式处理。第一种是用jhat或MAT做可视化分析搜索password、secret、token、key等关键字。第二种是用命令行工具strings配合grep快速过滤strings heapdump.hprof | grep -iE password|secret|token|accesskey | head -50这种方式虽然粗糙但在应急场景下出结果最快。我实际测试中经常能从中捞出数据库连接串、对象存储的AK/SK、内部服务的调用凭证。拿到这些之后后续能做什么取决于目标环境的网络拓扑和权限设计。注意heapdump分析涉及大量内存数据建议在隔离环境进行分析完成后及时清理文件避免敏感数据二次泄露。3.4 从配置到RCE的几种常见落点把信息泄露转化成RCE通常需要借助应用本身的特性。几种常见的落点包括应用使用了支持动态加载的模板引擎且模板内容可通过配置影响应用连接了存在反序列化风险的中间件应用的文件上传或导入功能可以结合泄露的路径信息做进一步操作。热词里的asp.net viewstate反序列化rce和pcntl_exec函数rce虽然技术栈不同但思路是一致的——都是借助某个可控入口完成代码执行。在SpringBoot场景下如果应用同时引入了某些存在已知问题的组件并且Actuator暴露了足够多的版本和依赖信息攻击者就能精准匹配利用方式。这也是为什么/actuator/beans和/actuator/configprops这类看起来不敏感的端点同样值得关注——它们提供的是地图。4. 实战排查记录一次完整的验证过程4.1 目标确认与信息收集假设我们在授权测试中拿到一个目标http://target.example.com。第一步是确认Actuator是否存在。直接访问/actuator返回了包含_links的JSON里面列出了env、health、beans、mappings、heapdump等端点。这说明暴露面很大。接着访问/actuator/env返回的JSON里能看到activeProfiles、propertySources等字段。在propertySources里我重点关注applicationConfig和systemProperties这两类来源。前者通常包含项目自己的配置后者可能包含启动参数。果然在applicationConfig里看到了数据库连接配置密码字段显示为******。这时候不要急着放弃。尝试访问/actuator/env/spring.datasource.password有些版本会返回未脱敏的值。如果还是星号可以尝试/actuator/env/spring.datasource.password[0]这种带索引的写法或者查看/actuator/configprops那里有时会以不同形式展示配置。4.2 端点逐个验证的优先级在时间有限的情况下我会按这个顺序验证/actuator/heapdump直接下载后续离线分析价值最高。/actuator/env快速浏览找数据库、缓存、第三方服务的连接信息。/actuator/beans了解应用结构找自定义的Controller和Service。/actuator/mappings拿到所有路由为后续测试提供入口清单。/actuator/threaddump看当前线程有时能发现正在处理的敏感任务。/actuator/shutdown仅在明确授权且确认影响可控时验证因为它会直接停服务。这个顺序的逻辑是先拿静态情报再拿动态情报最后才考虑有破坏性的操作。heapdump放第一位是因为它信息密度最高而且下载动作对目标影响最小。4.3 heapdump下载与分析中的坑下载heapdump时我遇到过几个问题。一是文件太大目标返回超时这时候可以尝试用curl带--max-time参数分段下载或者用wget -c断点续传。二是有些目标对/actuator/heapdump做了限流频繁请求会被封IP所以要控制频率。分析阶段用MAT打开大文件很吃内存建议给MAT分配足够的堆空间。如果只是快速找凭据strings加grep的组合更轻量。我一般会先跑一遍关键字过滤把可疑字符串导出到文件再人工筛选。这一步的耐心很重要因为堆里噪音很多真正的凭据往往夹杂在大量正常字符串中间。4.4 验证边界与停止条件实战中最难的不是技术而是判断做到哪一步该停。我的原则是拿到能证明风险存在的证据即可不追求完整利用。比如能从heapdump里找到数据库凭据并且确认该数据库可连接就足以说明问题严重性不需要真的去读写业务数据。再比如/actuator/shutdown只要能证明它是开放的比如通过OPTIONS请求或返回的_links确认就不必真的触发关闭。这个边界意识既是合规要求也是专业素养。测试的目的是帮助修复不是造成破坏。5. 修复方案从配置收口到架构隔离5.1 最小改动的配置收口如果项目暂时没法做大的架构调整最直接的办法是收紧Actuator的暴露范围。在application.yml里明确指定只暴露必要的端点management: endpoints: web: exposure: include: health,info endpoint: health: show-details: when-authorized这几行配置的效果是只保留health和info并且健康详情只在授权时展示。对于绝大多数业务服务来说这已经够用了。如果确实需要metrics做监控可以单独加上但要配合认证。另外management.endpoint.shutdown.enabled一定要保持默认的false除非有非常明确的运维需求并且做了严格的访问控制。5.2 加认证与网络层隔离配置收口解决的是暴露什么认证和网络隔离解决的是谁能访问。Spring Security可以很方便地给Actuator加认证Configuration public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()) .authorizeRequests() .anyRequest().hasRole(ACTUATOR) .and() .httpBasic(); } }这段配置的意思是所有Actuator端点的请求都需要ACTUATOR角色并且走HTTP Basic认证。生产环境中更推荐把Actuator端口和业务端口分开只在内网或管理网段暴露。这样即使认证被绕过外部也无法直接触达。5.3 敏感配置的外部化管理从根子上降低风险是把敏感配置从代码和配置文件中挪出去。数据库密码、密钥这类信息应该通过环境变量、密钥管理服务或配置中心下发而不是硬编码在application.yml里。这样即使/env被访问拿到的也是占位符或引用而不是明文。同时要定期检查配置中心里是否存在过度授权的情况。热词里提到的nacos namespaces未授权访问漏洞就是一个提醒——配置中心本身的安全同样重要不能只顾着应用层。5.4 版本与依赖的持续治理SpringBoot的版本更新会带来Actuator默认行为的变化及时升级能规避一些已知问题。但升级不是万能的关键还是配置。我建议把Actuator的暴露策略纳入代码评审清单任何include: *的写法都要有充分理由并经过安全确认。另外定期用依赖扫描工具检查项目里是否存在已知问题的组件尤其是那些会与Actuator组合放大的依赖。6. 几个容易被忽略的细节与个人体会第一个细节是自定义端点的风险。有些团队会基于Endpoint开发自己的Actuator端点用来暴露内部状态或触发某些操作。这些自定义端点如果没做好权限控制危险程度可能比内置端点更高因为它们往往直接关联业务逻辑。我在评审中见过一个自定义端点调用后能触发数据同步任务且没有任何认证。第二个细节是错误页面的信息泄露。即使Actuator收口了如果应用的错误处理没做好异常堆栈里可能包含类名、路径、甚至配置片段。这些信息单独看价值有限但和Actuator泄露的信息拼在一起就能形成完整画像。所以安全收口要成体系不能只盯一个点。第三个细节是日志。Actuator的/loggers端点在某些版本中可以动态调整日志级别如果开放攻击者可以把某个包的日志级别调到DEBUG从而在日志里看到更多敏感信息。这个端点经常被忽略但它的影响是持续的。我个人在实际操作中的体会是Actuator的安全问题本质上是便利性和安全性的权衡。框架提供这些端点是为了让运维更轻松但默认的宽松策略在公网环境下就是灾难。解决之道不是不用Actuator而是明确谁在什么网络位置、以什么身份、能访问哪些端点。把这三个问题回答清楚配置自然就收紧了。最后分享一个检查习惯每次上线前用curl从外网访问一遍/actuator及其常见子路径确认返回的是404或401而不是200。这个动作花不了两分钟但能挡住绝大多数低级暴露。安全这件事往往就是这些不起眼的小习惯在起作用。