前言
很多小伙伴对Nginx并不陌生,来代理网站页面或者代理文件资源,配置简单,灵活。但是若出现像带权限的来访问Nginx的静态资源时,那简单的配置将不生效。
需求
公司渗透测试扫描发现了一个未授权访问文件的问题,即外网可以通过文件地址直接访问文件服务器中文件,无需任何认证,造成公司敏感数据泄露。
需要分析
我们的文件地址形如:http://y.y.y.y/video/2022/11/26/video_202211260104258u6j16128.mp4(y.y.y.y是应用服务器IP或域名)
1、请求地址到应用服务器
2、应用服务器(x.x.x.x)再通过nginx转发到文件服务器,获取到对应文件。
3、获取到文件后直接返回,如果是返回前端,即可做图片预览,文件下载,视频播放等功能。此外中台应用功能,如发送邮件时,也是直接调用的文件地址获取附件。
该地址是在应用服务器通过nginx直接转发到文件服务器的,没有经过应用系统鉴权,好处就是获取文件无需暂用应用服务器带宽,速度较快。但也产生了未授权访问的问题。
流程如下:
准备
需要用到的只是,工具
thinkphp
nginx
一些文件
具体实现
应用服务器Nginx配置
server{ listen 80; listen [::]:80; . . . # 视频地址前缀 location /file { proxy_redirect off; 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://x.x.x.x/index/auth; } # 静态资源前缀 location /resource{ internal; proxy_pass http://y.y.y.y/; }}
业务代码
path), rand(0, 24), 8) . "-" . substr(md5($this->path), rand(0, 28), 4) . "-" . substr(md5($this->path), rand(0, 28), 4) . "-" . substr(md5($this->path), rand(0, 28), 4) . "-" . substr(md5($this->path), rand(0, 20), 12); }// 获取视频地址接口 public function getFilePath(): string { $str = $this->random(); $this->app->cache->set($str, $this->path); $result = $this->local_domain . 'video?path=' . $str; return ""; }// 判断当前视频是否访问过,访问过“地址失效”,否则可以访问 public function auth(Request $request) { $path = $request->get('path'); if (!empty($request->header('referer'))) { $res = $this->app->cache->get($path); if ($res) { header('X-Accel-Redirect: ' . $this->route . $res); } else { echo "地址失效"; } } else { echo "地址失效"; } }}
请求
http://x.x.x.x/index/getFilePath#生成临时视频地址,返回给前端视频播放标签#前端视频渲染自动请求server里 /file# nginx代理到authhttp://x.x.x.x/index/auth# 检测当前视频链接是否被访问过,访问过,连接失效,否则,正常执行# 注意:此处为重点 header内X-Accel-Redirect 就是回调Nginx静态前缀的关键所在前面所提到的允许内部访问,即此处处理# header('X-Accel-Redirect: ' . $this->route . $res); ; 内连接请求server里面的/resource# 然后跳转到文件服务器http://y.y.y.y/video/2022/11/26/video_202211260104258u6j16128.mp4'
来源地址:https://blog.csdn.net/weixin_44961480/article/details/128074005