在一些安全扫描中,经常会遇到提示系统中存在bak备份文件或者压缩文件的安全漏洞,实际可能文件根本不存在,只是因为系统统一对不存在的资源定向到了一个提示资源不存在的页面,但是http状态码是200,导致安全扫描工具误报,这时候可以向安全测试人员说明情况,或者通过Nginx配置禁止对特定后缀资源的访问,这儿就介绍禁止访问的配置方式。
从网上搜索到的大部分都是如下这种千篇一律的配置
location ~ .*\.(rar|zip|gz|tar|7z|xz|bz2|bak)?$
{
return 403;
}
这种配置使用了正则的匹配方式,location的优先级是比较低的。如果应用使用了更高优先级的配置,这个配置是不起作用的,例如应用实际使用如下配置
location ^~ /demo/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header REMOTE-HOST $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://om_demo_pool/demo/;
}
因为^~的优先级高于正则,所以访问http://127.0.0.1/demo/a.zip时,会直接转发到demo这个应用,而不会返回403。
location优先级请自行百度或者参考https://blog.csdn.net/xy2204/article/details/47749405
这时候有两种解决方式:
1)降低实际应用location配置的优先级,使应用location配置的优先级抵御正则,比如去掉^~,变成 location /demo/ { 。但是这种方式有一定的风险,在访问应用中一些资源的时候因为优先级问题匹配了其他高优先级路径而导致访问不到目标资源
2)不使用统一的location配置,而是在各个应用的location下通过正则过滤url路径,如果以特定字符结尾,返回403,配置如下
location ^~ /demo/ {
if ($request_uri ~ .*\.(rar|zip|gz|tar|7z|xz|bz2|bak|svn-base)?$) {
return 403;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header REMOTE-HOST $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://om_demo_pool/demo/;
}