Nginx配置不当导致的安全问题 taro Posted on Mar 17 2021 Nginx 漏洞 不安全的配置 # SSRF 反向代理将变量传入`proxy_pass` ```conf location /([a-zA-Z0-9.:%]+) { proxy_pass http://$1; } ``` # 目录穿越 ## alias 由nginx来处理静态文件 当使用`alias`来对文件路径进行配置时,有可能会造成目录穿越漏洞 ```conf location /files/ { alias /etc/nginx/txtpath/; } ``` > 当alias指定的文件目录足够上层(例如在/home,/usr等)时,我们就可以穿梭到根目录,读取到所有文件。因为配置错误而导致了任意文件读取漏洞 ## rewrite rewrite规则编写不当,也会导致目录穿越 ```conf rewrite ^/sectest/?(.*)?$ /$1 last; ``` 访问http://test.com/sectest../sql.conf,会返回服务器上/var/www/html/../sql.conf的内容 **原因**: ^/sectest/?(.*)?$ 匹配之后$1 = ../sql.conf,拼接之后为/var/www/html/../sql.conf(rewrite使用相对路径,从文档根目录),出现穿越 **解决**: 改为^/sectest/(.*)?$ 匹配/sectest/,访问会出现404,不会出现穿越漏洞 # 目录遍历 在server块加入`autoindex on`;可以添加目录浏览功能,但是也会导致安全问题 ```conf server { autoindex on; ... } ``` # CRLF注入 当一个网站使用https协议的时候,很多站点会强制用户使用https进行访问。当用户访问http的时候会302跳转到https页面。 如果使用了 \$uri来进行配置,可能会导致CRLF注入漏洞 ```conf location /302 { return 302 https://$host$uri; } ``` `nginx`中`$uri`指的是请求的文件和路径,不会包含后面请求的数据(即?和#后面的数据) nginx服务器会对`$uri`进行解码。当我们在传入的参数后面加入`urlencode`之后的换行符%0d%0a,我们就可以污染HTTP头的数据 例如,访问`http://your_ip/302/123`会302跳转到`https://your_ip/302/123`。这是正常的跳转。 但是由于配置文件里面使用的是`$uri`,会对我们传入的参数进行转码,当我们访问`http://your_ip/302/123%0d%0a%0d%0atest=1`时,302跳转会指向`https://your_ip/302/123`并且POST一个参数 test=1 > 原文: https://xz.aliyun.com/t/4855 中关村CTFwriteup ptrace (一) 所需基础知识