前言
今天依旧是SpringBoot框架,估计还要一篇文章才能把它写完,没办法,Java安全的内容太多了。
Actuator
SpringBoot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用,简单来说就是一个监控的模块。
项目搭建
同样还是先来搭建一个项目,新建一个项目叫Actuator-demo,注意这里第三方引用还是阿里云。

选择依赖项。

可以查看一下配置文件。

我们把项目运行一下,控制台可以看到默认访问路径。

访问可以看到一堆接口。

直接找了一张图片,可以对照各接口是干啥的。

Actuator的安全问题主要是信息泄露这一块,从上图不难发现如果没有做限制,那么我们访问的信息是很多的。
比如我访问http://127.0.0.1:8081/actuator/env,可以看到我整个环境的配置信息。

现在搞个图形化的界面就一目了然了,新建一个项目叫Actuator-client,依赖选择客户端的。

客户端配置文件如下,防止端口冲突,所以我改为8089。

接着再新建一个服务端的项目,叫Actuator-server,依赖项选择服务端的。

服务端的配置端口为改为8888,要和我们客户端的访问端口一样。

服务端启动文件这里要引入依赖。

把客户端项目和服务端项目都启动一下,访问127.0.0.0:8888,是一个图形化页面。

点击进去可以看到监控信息的图形化页面,

安全问题
很多的SpringBoot框架都会用到Actuator这个监控组件,首当其冲的安全问题就是heapdump泄漏,这是由于开发者不正确的配置所导致的。我们回答Actuator-demo这个项目,把它运行起来。
访问 http://127.0.0.1:8081/actuator/heapdump 把文件下载下来。

这个heapdump直接打开是查看不了滴,我们要用专门的查看工具,这里用jdk自带的工具jvisualvm.exe,在jdk的bin目录下面。
打开之后就可以看到一堆的配置信息。

这个自带的工具不会给你自动的提取信息,比如账号密码啥的,我们可以用JDumpSpider这个工具去帮助我们提取一些有用的信息。
https://github.com/whwlsfb/JDumpSpider/releases
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump
自动提取信息,比如什么OSS资源,账号密码等,因为我这里没有配置所以啥也没。

我们可以再新建一个项目去配置一些信息去验证一下,选择依赖项。

项目配置文件写入如下代码,配置一下数据库。
server.port=8888
spring.datasource.url=jdbc:mysql://localhost:3306/demo1
spring.datasource.name=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
访问http://127.0.0.1:8888/actuator/heapdump 把heapdump文件下载下来,此时我们再用工具去提取信息,便可以看到数据库的密码和配置等。

只要我们在配置文件加入这两个行代码,那么env和heapdump就不再可以被访问。
management.endpoint.heapdump.enabled=false
management.endpoint.env.enabled=false

Swagger
这是SpringBoot框架的一个接口系统,可以理解为它管理框架的所有接口,方便开发人员测试。
还是老规矩,新建一个项目叫swagger-demo,添加依赖。

由于SpringBoot并没有自带swagger的依赖,我们需要自己引入,分别有2版本和3版本的。二者并无太大的区别,如果你用的SpringBoot版本比较高,就可能会出现兼容性问题,我这里用的SpringBoot版本是阿里云的2.6.13,对于2和3版本的swagger都适用,如果你用3.x的SpringBoot可能会出现不兼容2版本的swagger。
可参考文章:https://blog.csdn.net/lsqingfeng/article/details/123678701
<--2.9.2版本-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
可以看到导入的依赖。

如果有端口冲突就修改一下配置文件,并且加一句代码,不然会报错。

访问http://127.0.0.1:8002/swagger-ui.html。

我这里写了一些接口,比如什么hello、user、theonefx。

在swagger页面我们都可以看到。

为了更加直观,我们新建一个Java类,叫Testcontroller,并且写入以下代码,一个是POST传那么参数,一个是get传name参数。
@Controller
public class TestController {
@GetMapping("/getdata")
@ResponseBody
public String getdata(@RequestParam String name){
return "get have data " +name;
}
@PostMapping("/postdata")
@ResponseBody
public String postdata(@RequestParam String name){
return "post have data " +name;
}
}
此时我们再重新运行项目,可以看到多了个test-controller的测试接口。

点开确实是我们写好的接口,参数也帮你写好了。

我们随便填个参数测试一下,也是没问题的。

在实战中往往会有很多的接口,几百上千个,我们不可能一个一个地去提交数据测试,那咋办呢,这里用到我们之前说过的一个工具postman,去实现自动化测试。
首先复制我们的api。

点击API,选择Import导入。

选择链接导入。

可以看到有啥接口都给我们显示出来了。


点击Run会帮你全部测试一遍,不知道为啥我这里只有一个返回,可能配置啥的不对。

对于这个swagger一般都是接口泄露,比如什么登录接口、文件上传接口。
总结
本次主要讲了Actuator和swagger这两个常见的SpringBoot组件,主要的利用点都是信息泄露。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。