# 网络安全-记录web漏洞修复
# 背景介绍
最近政府部门都在组织网络系统安全检测,我们公司开发的某一个系统前端也被检出了漏洞,需要解决一下
前端使用vue框架开发,使用nginx进行部署
# 漏洞
如图所示总共被扫描出了八个漏洞,其中两个中度危险

# 解决问题
# CORS信任任意来源漏洞
# 危害
可能造成用户信息被窃取,攻击者可以构造其他站点,通过跨域资源访问的形式,读取用户在本站点上的任意信息;
攻击者可以通过一连串的跨域资源访问请求,伪造用户的身份私自操作本站点的内容。
# 修复
漏洞未修复前,请求响应如下

这里是由于我nginx配置了允许跨域请求,默认nginx是不允许
错误配置如下
server {
listen 8071 ;
listen [::]:8071 ;
server_name test; # 这里是网站的域名
location / {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
root E:/data/vue/zrzy; # /vue/dist/ 打包后的dist目录
try_files $uri $uri/ @router; # 指向下面的 @router否则会出现 404
index index.html index.htm;
}
# 对应上面的 @router,主要Vue请求并不是真实路径,无法找到文件,需要重定向到 index.html 中,然后交给路由处理
location @router {
rewrite ^.*$ /index.html last;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
修改配置如下
server {
listen 8071 ;
listen [::]:8071 ;
server_name zrzyweb; # 这里是网站的域名
location / {
root E:/data/vue/zrzy; # /vue/dist/ 打包后的dist目录
try_files $uri $uri/ @router; # 指向下面的 @router否则会出现 404
index index.html index.htm;
}
# 对应上面的 @router,主要Vue请求并不是真实路径,无法找到文件,需要重定向到 index.html 中,然后交给路由处理
location @router {
rewrite ^.*$ /index.html last;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改后如下

# SourceMap文件泄露漏洞
# 危害
- 可能导致网站源代码泄露
- 可能导致敏感信息泄露
- 可能导致攻击者得到更多信息,扩大攻击者的攻击面

# 解决
这是因为我们在vue打包的时候,没有关闭SourceMap,一般SourceMap是在开发的时候方便程序员调试。
这里我们修改一下项目中的vue.config.js配置即可,添加 productionSourceMap: false。
module.exports = {
productionSourceMap: false,
}
2
3
修改后如下,我们打包部署就看不见源码了,都是混淆过的

# Host头注入漏洞
# 危害
Host 头指的是 HTTP Header 中的 Host 项,在开发 WEB 应用时,为了方便的获得网站域名,开发人员可能会直接使用该值带入到应用上下文中,如果该值可以被攻击者控制,且 web server 没有对 host header 进行校验,则在部分攻击场景下可能导致用户信息泄露、XSS 等。

# 解决
在nginx的server中配置拦截策略,指定只有特定host才能访问
set $flag 0;
if ( $host = "192.168.1.249"){
set $flag 1;
}
if ( $flag = 0){
return 403;
}
2
3
4
5
6
7
# HTTP响应头Server 泄露框架信息漏洞

# 危害
HTTP头部信息泄露,通常会导致网站的框架信息、编程语言、Web 容器等信息泄露
攻击者可以根据敏感信息对网站或服务器发起进一步攻击
# 解决
nginx的http中添加如下配置
server_tokens off;
# 响应头漏洞
# 危害
Web 服务器对于 HTTP 请求的响应头中缺少 detail.header_name,这将导致浏览器提供的安全特性失效,更容易遭受 Web 前端黑客攻击的影响。

# 解决
server中添加
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection 1;
2
3

# OPTIONS方法漏洞
昨天(20220722)相关系统在网络安防测试中被监测出OPTIONS方法漏洞,吐槽一句这个漏洞在别人那都是低危漏洞,到“他们”这就变成中危漏洞了。。。,让人有点无语。
# 危害
如下所示

# 解决
这个问题是由于我们的系统框架是前后分离的,前台使用VUE,这样前台请求后台接口时就会出现跨域问题。
浏览器在针对我们系统的这种请求方式“复杂跨域”会发送一个预检请求options。这样在请求是就会发送两次请求,第一次是options请求第二次是真实请求。为此我们后台开放了options请求允许访问,这就是这次漏洞的原因。
解决这个问题并不复杂,首先后台禁用options请求,这时前台的所有接口就会报跨域问题,然后对前台的请求方式进行修改,具体步骤如下:
# 后台禁用options请求
这里我们的后台用java开发,使用spring cloud gateway进行路由管理,我们只需要修改网关的过滤器即可,添加如下代码
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置你要允许的网站域名,如果全允许则设为 *
//config.addAllowedOrigin("http://localhost:4200");
config.addAllowedOrigin("*");
//自定义可选:Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie,token
//String allowHeaders = "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Authorization";
config.addAllowedHeader("*");
config.addExposedHeader("Authorization");
//以下或者用config.addAllowedMethod("*"); 禁用了options以及put,deleted方法
// config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
// config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
// config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
// return new CorsFilter(source);
final FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
// 设置执行顺序优先级
bean.setOrder(0);
return bean;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# vue使用代理
这里我们解决的逻辑就简单了,报错是因为跨域,那我就对后台地址做代理,让它和前台在同一个域下就行
- 配置vue.config.js,添加proxy代理,代理后台接口
module.exports = {
productionSourceMap: false,
devServer: {
open: true,
host: '0.0.0.0',
port: 8081,
https: false,
hotOnly: false,
proxy: {
'/api': {
target: 'http://192.168.1.1:8080',//请求地址
ws: true,
changeOrigin: true,
pathRewrite: {
'^/api': '' //请求地址
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 接口使用时配置如下
// 我们通过这个实例去发请求,把需要的配置配置给这个实例来处理
import axios from "axios";
const request = axios.create({
baseURL: '/api', // 请求的基础路径
timeout: 30000,
// headers:{
// 'Content-Type': 'application/json'
// },
// 定义后端返回的原始数据的处理
// 参数 data 就是后端返回的原始数据(未经处理的 JSON 格式字符串)
transformResponse: [function (data) {
return data
}]
})
// 导出请求方法
export {request}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# NGINX部署配置
上面配置是在开发环境生效的,使用NGINX进行部署的时候需要对后台的接口同样的做一下代理设置
配置如下:
server {
listen 8204 ;
listen [::]:8204 ;
server_name linkageupdate_web; # 这里是网站的域名
set $flag 0;
if ( $host = "192.168.1.1"){
set $flag 1;
}
if ( $flag = 0){
return 403;
}
location / {
if ($allow_cros = 0){
return 403;
}
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection 1;
root D:/code/dist; # 打包后的dist目录
try_files $uri $uri/ @router; # 指向下面的 @router否则会出现 404
index index.html index.htm;
}
# 添加后台代理
location /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.1:8080/;
}
# 对应上面的 @router,主要Vue请求并不是真实路径,无法找到文件,需要重定向到 index.html 中,然后交给路由处理
location @router {
rewrite ^.*$ /index.html last;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36