前言
在java项目中,经常会使用一些监控类的组件来监控系统的状态,如果对这些组件没有做好权限控制,公网可以任意访问的话,就会泄露敏感信息,进一步造成更严重的危害。今天就来看一下,都有哪些组件。
关于java安全的系列已经出了10篇,大家感兴趣可以去看一下,后续会继续出关于java安全方面的内容,如java内存马,Weblogic系列,spring框架系统漏洞等。
由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~
java项目中可能造成未授权的组件。
Druid未授权漏洞
Druid是阿里巴巴数据库出品的,为监控而生的数据库连接池,并且Druid提供的监控功能,监控SQL的执行时间、监控Web URI的请求、Session监控,首先Druid是不存在什么漏洞的。但当开发者配置不当时就可能造成未授权访问。
检测与利用:
直接在网站的url中后加上:
/druid/index.html
如果可以无需登录,即可登录到Druid监控界面,则说明该网站存在Druid未授权访问漏洞!
从这里可以看到,Druid数据监控界面,里面存在数据源,sql监控,sql防火墙,web应用,url监控,session监控,spring监控等信息,可以详细监控该网站的情况,获取敏感信息,在web监控中,可以获取整个网站的目录,在session监控中,可以获取网站用户的session,从而伪造用户session进行登录!
修复建议
方法1: 设置StatViewServlet(监控页面)为 false
方法2: 给druid的web页面设置账户密码,增加访问druid的权限。
spring: datasource: druid: max-active: 10 min-idle: 1 stat-view-servlet: # 是否启用StatViewServlet(监控页面),默认true-启动,false-不启动 enabled: true # 禁用HTML页面上的"Reset All"功能 reset-enable: false # 设置账户名称(增加登录权限) login-username: xxxx # 设置账户密码 login-password: xxxxxxxx # IP白名单(没有配置或者为空,则允许所有访问) allow: 127.0.0.1 # IP黑名单(存在共同时,deny优先于allow) deny: 10.0.0.1 # 自定义druid连接 url-pattern: '/druid/*'
SwaggerUI未授权漏洞
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。相关的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger-UI会根据开发人员在代码中的设置来自动生成API说明文档,若存在相关的配置缺陷,攻击者可以未授权翻查Swagger接口文档,得到系统功能API接口的详细参数,再构造参数发包,通过回显获取系统大量的敏感信息。
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
可以添加上述默认路径到dirsearch等目录扫描工具的字典中,再对目标网站进行扫描测试。
如下图显示的页面
漏洞修复
- 配置Swagger开启页面访问限制。
- 排查接口是否存在敏感信息泄露(例如:账号密码、SecretKey、OSS配置等),若有则进行相应整改。
Spring boot Actuator未授权漏洞
Actuator 是 Spring Boot 提供的服务监控和管理中间件。当 Spring Boot 应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些系统信息泄露、XXE、甚至是 RCE 等安全问题。
端点描述
路径 | 描述 |
/autoconfig | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
/beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
/env | 获取全部环境属性 |
/configprops | 描述配置属性(包含默认值)如何注入Bean |
/dump | 获取线程活动的快照 |
/health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/info | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
/mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
/metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
/shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true |
/trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
漏洞发现
一般分为两步
1. 识别当前 web 应用使用的框架为 springboot 框架;
2. 枚举执行器端点路径;
1. 识别当前 web 应用使用的框架为 springboot 框架。主要有两个方法判断:
①通过 web 应用程序网页标签的图标(favicon.ico);如果 web 应用开发者没有修改 springboot web 应用的默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:
该绿色小图标是 spring 框架下的一个默认图标,尽管不能百分百就此图标确认当前 web 应用使用的是 springboot 框架,但是基本上也能百分之八十确认该 web 应用是使用 springboot 框架开发的了(毕竟 springboot 框架确实是太流行了)。
②通过 springboot 框架默认报错页面;如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下(此处仅以 404 报错页面为例):
当出现如上报错页面,就能确定当前 web 应用是使用了 springboot 框架的。
那么综合以上两个途径来判断当前 web 应用是否是 springboot 框架,就是通过访问不同的目录,看是否有小绿叶图标,然后就是想办法在不同目录下触发应用程序的 4xx 或 5xx 错误,看是否有 Whitelabel Error Page 报错。
2. 枚举执行器端点路径。这个其实很简单,在确认当前 web 站点是 springboot 框架后,枚举当前站点的所有一级、二级甚至三级目录,然后写脚本对每个目录进行探测,查看目录下是否存在 actuator 执行端点路径即可。也可以将这些路径放到目录扫描工具去扫描。
尽管这些监控信息的泄露已经足够高危了,但是还有一些提高漏洞危害性的利用方式。
①认证字段的获取以证明可影响其他用户;这个主要通过访问/trace 路径获取用户认证字段信息,比如如下站点存在 actuator 配置不当漏洞,在其 trace 路径下,除了记录有基本的 HTTP 请求信息(时间戳、HTTP 头等),还有用户 token、cookie 字段:
trace 路径下用户认证字段泄露:
②数据库账户密码泄露;由于 actuator 会监控站点 mysql、mangodb 之类的数据库服务,所以通过监控信息有时可以拿下 mysql、mangodb 数据库;这个主要通过/env 路径获取这些服务的配置信息,比如如下站点存在 actuator 配置不当漏洞,通过其/env 路径,可获得 mysql、mangodb 的用户名及密码:
③git 项目地址泄露;这个一般是在/health 路径,访问其 health 路径可探测到站点 git 项目地址
④后台用户账号密码泄露;这个一般是在/heapdump 路径下,访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储文件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台用户的账号密码,通过泄露的账号密码,可以进入后台进行一波测试。
Spring Eureka未授权访问漏洞
Spring Eureka是一个服务注册和发现的组件,他提供了一个web页面用于展示注册的服务信息。如果没有做好权限控制,可能会导致未授权访问漏洞。
漏洞利用方式
直接访问路径/eureka/,看是否可以访问
或者添加消息头X-Forwarded-For:127.0.0.1看是否可以绕过
漏洞危害
1.泄露敏感信息:如果公网可以访问,会把注册信息泄露
2.与其它漏洞进行利用:如spring boot actuator+eureka+xstream可以导致RCE漏洞。该漏洞可以看下面的链接:https://blog.csdn.net/qq_18980147/article/details/128041932
web页面如何访问
server: port: 8801 # 服务端口号 spring: application: name: lovineurkaclient # 服务名称 eureka: client: serviceUrl: defaultZone: http://localhost:8881/eureka/ # 注册到的eureka服务地址
如上面的配置,web页面的访问链接就是http://localhost:8881/eureka/
修复方式
1. 启用Spring Security进行身份验证,在Eureka Server的配置文件中添加如下配置,启用Spring Security进行身份验证,需要在Eureka Server中配置用户名和密码。
``` security: basic: enabled: true user: name: admin password: password ```
2. 配置Eureka Server的防火墙,可以配置防火墙,只允许指定IP地址或者网段访问管理界面。在Eureka Server的配置文件中添加如下配置:
``` eureka: server: # 允许访问Eureka Server的IP地址或网段 allow-registry-override: true enable-self-preservation: false # 禁止修改Eureka Server的注册信息 disable-self-registration: true # 配置Eureka Server的防火墙规则 firewall: # 允许的IP地址或网段 allow: - 192.168.1.0/24 - 127.0.0.1 ```
3. 对于生产环境中的Eureka Server,建议使用VPN等安全通道进行访问,避免直接暴露在公网上。
总结
上面介绍了java项目中一些常见组件的未授权漏洞,这些往往是由于配置的问题导致的,在测试的时候一定要注意这些组件的权限问题。