背景
nginx之前被发现alias配置指令使用不当,会导致目录穿越漏洞,参考:https://github.com/yandex/gixy/blob/master/docs/en/plugins/aliastraversal.md
本文针对对此问题进行分析
复现及分析
版本信息:nginx/1.17.10 (Ubuntu)
nginx配置文件增加内容:
|
然后访问http://test.com/hd../sql.conf,会返回服务器上/var/www/html/sql.conf的内容
原因分析:
nginx对request_uri中的/hd进行替换,替换之后为[http://test.com]/var/www/html/dd/../sql.conf,于是发生了目录穿越
若改为alias /var/www/html/dd,删除了最后的斜杠,替换之后为[http://test.com]/var/www/html/dd../sql.conf,访问会出错,不会出现穿越漏洞
危害程度:
1、实测发现仅能向上穿越一级目录,且可能跳出文档根目录(取决于alias是否指向根目录)
访问/hd../..%2f..%2ft.txt会出现400 error
2、文件内容会先解析一遍然后返回,不会出现譬如php源码泄露的问题。主要会泄露敏感的配置信息
意外发现
测试过程发现rewrite规则编写不当,也会导致目录穿越,如下,规则的本意是为了去掉sectest目录(与使用alias类似)
|
访问http://test.com/sectest../sql.conf,会返回服务器上/var/www/html/../sql.conf的内容
原因分析:
^/sectest/?(.*)?$ 匹配之后$1 = ../sql.conf,拼接之后为/var/www/html/../sql.conf(rewrite使用相对路径,从文档根目录),出现穿越
若改为^/sectest/(.*)?$ 匹配/sectest/,访问会出现404,不会出现穿越漏洞
其他错误配置
location / { try_files $uri$args $uri$args/ /index.html; }
同样会出现目录穿越