一、关闭swagger
1、关闭swagger v3
# 需同时设置auto-startup=false,否则/v3/api-docs等接口仍能继续访问
springfox:
documentation:
enabled: false
auto-startup: false
swagger-ui:
enabled: false
2、关闭swagger v2
# 只要不是true就不启用
swagger:
enable: false
# 如不起作用,查看项目中的config,是否配置开关
@Configuration
@EnableSwagger2
@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx.controller"))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数,注意这里的注解引用的是哪个
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger2 构建RESTful API")
.description("API 描述")
.contact(new Contact("xx", "", "xx@xxx.com"))
.version("1.0")
.build();
}
}
二、关闭SpringBoot actuator
management.endpoints.enabled-by-default = false
三、HTTP头信息泄露
为了隐藏这些不必要的头信息,有各种可能的方法:
1.如果是经源代码编译而来的,可改源代码中的版本信息,具有一定的难度;
2.通过配置对版本信息进行修改或者不显示,达到以假乱真的目的,比较简单;
3.在服务器前加上反向代理软件,过滤掉这些会显示服务器版本信息的头,有些复杂。
以下主要就第2种方法,分别介绍一下常用的Web服务器如何去掉或修改Server头信息。
1>.Apache Web服务器版本号隐藏
# 找到配置文件apache2.conf或httpd.conf,修改其中的标记为:
ServerTokens ProductOnly
ServerSignature Off
# 重启apache服务
# curl -I localhost
HTTP/1.1 200 OK
Server: Apache
Accept-Ranges: bytes
Content-Length: 97
Connection: close
Content-Type: text/html
2>.Nginx服务器版本号隐藏
# 修改nginx.conf
# 在其中的http节加上server_tokens off;
http {
……省略配置
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
server_tokens off;
…….省略配置
}
# 重启Nginx后测试
四、敏感信息明文传输
1.网站负责人将网站地址提交到Gworg进行SSL证书认证。
2.然后将SSL证书配置到网站,并且开启强制HTTPS访问。
3.查看网站源码是否存在http地址调用的资源,例如:图片、视频、CSS、JS代码等,将这些代码地址改成https或者下载到本地网站服务器调用。
4.对于敏感信息,例如密码、秘钥进行加密;例如:前端md5加密传给服务端,服务端再次md5加密存入数据库;
五、重放攻击
短信轰炸
暴力破解
重放支付
如何防御
加随机数
加时间戳
加流水号
其他方法
1)挑战/应答:每次数据传输时,发送端都给接收端发送一个不同的“挑战”字串,接收端收到这个“挑战”字串后,做出相应的“应答”。
2)一次性口令:每次数据传输时,发送端都给接收端发送一个不同的“口令”,通信双方通过消息中的口令来判断消息的新鲜性。
3)页面可以编写防重复提交、后端自定义注解防止表单重复提交(RepeatableFilter);
六、敏感信息泄漏
1.不当的日志记录:如果日志文件中包含了敏感数据,比如用户密码、身份证号码等,且这些日志文件未经适当的保护,那么黑客可以随意访问这些文件来获取敏感数据
2.SQL注入攻击:如果应用程序的数据库查询语句是通过拼接字符串的方式构建的,存在SQL注入的风险。黑客可以通过输入特殊字符来修改或者获取数据库中的数据。
3.不正确的加密和解密:如果应用程序使用不安全的加密算法,或者密钥管理不当,黑客可以通过解密数据来获取敏感信息。
解决方案:
1.应用程序层面的解决方案
a. 合理使用访问控制机制:对敏感数据的访问进行严格的认证和授权,确保只有授权用户能够访问敏感数据。
b. 数据存储安全:将敏感数据以加密形式存储,确保数据在存储过程中不被黑客获取。
c. 前端安全:编写安全的前端代码,对用户输入进行有效的验证和过滤,防止恶意代码注入。
d. 安全的数据传输:使用安全的传输协议(如HTTPS)来传输敏感数据,确保数据在传输过程中不被黑客截取。
2.数据库层面的解决方案
a. 使用参数化查询或预编译语句:确保输入的数据能够正确转义,防止SQL注入攻击。
b. 数据库访问控制:对数据库的访问进行严格的认证和授权,只允许授权用户访问敏感数据。
c. 定期备份和监控数据库:确保数据库备份完整可用,及时发现和处理异常访问行为。
3.加密和解密层面的解决方案
a. 使用安全可靠的加密算法:确保加密算法足够强大,如AES、RSA等。
b. 密钥管理:妥善管理密钥,确保密钥不泄露,定期更换密钥以提高安全性。
实战:
XssFilter 过滤sql参数;
七、账号枚举漏洞
1.对接口登录页面的判断回显提示信息修改为一致:账号或密码错误(模糊提示);不要精确报账号不存在、密码错误等提示语。
2.增加动态验证码机制,避免被探测工具批量枚举用户名。
八、CORS 信任任意来源漏洞
1 如果返回头是以下情况,那么就是高危漏洞,这种情况下漏洞最好利用:
Access-Control-Allow-Origin: https://www.attacker.com
Access-Control-Allow-Credentials: true
2 如果返回头是以下情况,那么也可以认为是高危漏洞,只是利用起来麻烦一些:
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
3 如果返回以下,则不存在漏洞,因为Null必须是小写才存在漏洞:
Access-Control-Allow-Origin: Null
Access-Control-Allow-Credentials: true
4 如果返回以下,可认为不存在漏洞,因为CORS安全机制阻止了这种情况下的漏洞利用,也可以写上低危的CORS配置错误问题。
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
5 如果返回以下,可认为不存在漏洞,也可以写上低危的CORS配置错误问题。
Access-Control-Allow-Origin: *
解决办法:
1. Access-Control-Allow-Origin中指定的来源只能是受信任的站点,避免使用Access-Control-Allow-Origin: *,避免使用Access-Control-Allow-Origin: null,否则攻击者可以伪造来源请求实现跨域资源窃取。
2. 严格校验“Origin”值,校验的正则表达式一定要编写完善,避免出现绕过的情况。
3. 减少“Access-Control-Allow-Methods”所允许的请求方法。
4. 除了正确配置CORS之外,Web服务器还应继续对敏感数据进行保护,例如身份验证和会话管理等。
5.后端服务禁止使用下边代码,使用nginx代理配置跨域:
@Bean
public CorsFilter corsFilter()
{
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOrigin("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 对接口配置跨域设置
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
九、未授权访问
【网络安全】常见未授权访问漏洞汇总
十、默认口令漏洞
所有中间件、组件密钥都不得使用默认,修改为复杂的随机密码;
后端对新增、修改密钥前,可以加入PasswordCheckUtil,进行复杂校验:
检测密码中字符长度
检查密码中是否包含数字
检查密码中是否包含字母(不区分大小写)
检查密码中是否包含特殊字符
键盘规则匹配器 横斜向规则检测
评估a-z,z-a这样的连续字符
评估aaaa, 1111这样的相同连续字符
检测常用词库
用户名校验(LeetSpeak字符)