Nginx不安全配置可能导致的安全漏洞
KanEff
7年前
<h2>前言:</h2> <p>Nginx (engine x) 是一个高性能的http和反向 服务器,也可以作为IMAP/POP3/SMTP服务器。t engine是由淘宝网发起的Web服务器项目。它在 <a href="/misc/goto?guid=4958187734501359851" rel="nofollow,noindex">Nginx</a> 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。</p> <p>在渗透测试过程中发现很多网站使用了nginx或者tenginx来做反向代理,ningx的配置文件nginx.conf的一些错误配置可能引发一些安全漏洞。下面是总结的一些可能引发安全问题的错误配置,并且推荐了github上一款用于检测nginx安全配置的工具。</p> <p>Ningx.conf配置一共分为4部分: 1.顶级配置 2. Events 模块 3.http部分 4.server部分</p> <h2>0×00任意文件读取</h2> <p>这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。 假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名:</p> <p>location /files {</p> <p>alias /home/;</p> <p>}</p> <p>此时访问 <a href="/misc/goto?guid=4959754989330910187" rel="nofollow,noindex">http://127.0.0.1:8080/files/1.txt</a> , 就可以获取 /home/1.txt 文件。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/30877753df0b7a38c6f1201d8348aa44.jpg"></p> <p>我们发现,url上 /files 没有加后缀 / ,而alias设置的 /home/ 是有后缀 / 的,这个 / 就导致我们可以从 /home/ 目录穿越到他的上层目录,造成任意文件下载:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/e2c087656f82f703dbc277d969d38d38.jpg"></p> <p>修复方法: 不写成上面那种有漏洞的形式,比如可以写成结尾都带着 / 字符。</p> <h2>0×01$uri导致的CRLF注入</h2> <p>在实际业务场景中经常需要在nginx中配置路径跳转。</p> <p>比如用户访问http://x.com 自动跳转到https://x.com 或者是访问 <a href="/misc/goto?guid=4959754989425158985" rel="nofollow,noindex">http://x.com</a> 自动跳转到 <a href="/misc/goto?guid=4959754989519022953" rel="nofollow,noindex">http://www.x.com</a></p> <p>在跳转的过程中,我们需要保证用户访问的页面不变,所以需要从Nginx获取用户请求的文件路径,有三个可以表示uri的变量:</p> <p>$uri</p> <p>$document_uri</p> <p>$request_uri</p> <p>$uri 和 $document_uri表示的是解码以后的请求路径,不带参数,$request_uri表示的是完整的URI(没有解码),如果在nginx.conf中配置了下列的代码:</p> <pre> location /test { return 302 http://$host:81$uri; }</pre> <p>因为 $uri 是解码以后的请求路径,所以可能就会包含换行符,也就造成了一个CRLF注入漏洞。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/27e8a2293311bcdfc70c5bb9a47c217e.jpg"></p> <p>该漏洞除了发生在 return后面,也可能发生在r ewrite、 a dd_header、p roxy_set_header、p roxy_pass之后。</p> <p>修复方式: 将 $uri或者$document_uri 改为 $request_uri 。</p> <h2>0×02 SSRF</h2> <p>SSRF(服务端请求伪造)漏洞常出现在反向代理的配置中,反向代理的语法如下:proxy_pass http ://IP</p> <p>如果攻击者可以操控IP, 将其修改成内网IP地址即可造成SSRF漏洞。</p> <h2>0×03目录遍历</h2> <p>autoindex off; #是否开启目录列表访问,默认关闭。</p> <p>若设置成 autoindex on;</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/96ae74f37203d9056ead7ddf3ce48018.jpg"> <img src="https://simg.open-open.com/show/925d2302f97a83c9eeb20657750e0e8d.jpg"></p> <p>0x04nginx版本泄露</p> <p>对于nginx服务器,之前曾爆出过不同版本的解析漏洞,比如 nginx 0.7.65以下(0.5.*, 0.6.*, 0.7.* )全版本系列和0.8.37(0.8.*)以下8系列受影响。 下面假设在存在漏洞的站点上有一张图片url地址为: <a href="/misc/goto?guid=4959754989603545769" rel="nofollow,noindex">http://x.x.x.x/logo.jpg</a> 而当我们正常访问图片时,nginx会把这个当作非脚本语言直接读取传送会客户端(也就是浏览器),但是</p> <p>存在解析漏洞的nginx会把如下连接解析并且当作php文件执行~:</p> <p><a href="/misc/goto?guid=4959754989688764860" rel="nofollow,noindex">http://x.x.x.x/logo.jpg/x.php</a></p> <p><a href="/misc/goto?guid=4959754989688764860" rel="nofollow,noindex">http://x.x.x.x/logo.jpg%00x.php</a></p> <p>因此 隐藏 Nginx 的版本号,提高安全性。</p> <p>在配置文件nginx.conf里面,设置如下: server_tokens off;</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/ee0f48864158d918eca25431839dd688.jpg"></p> <p style="text-align:center"><img src="https://simg.open-open.com/show/ec1da2dd1bc48dc3da2e116454d39b2f.jpg"></p> <p>Nginx配置安全检查的工具</p> <p>Github上开源了一款Nginx配置安全检查的工具,叫做gixy,可以覆盖以上的部分问题。</p> <p>项目地址: <a href="/misc/goto?guid=4959749667589734929" rel="nofollow,noindex">https://github.com/yandex/gix</a> y</p> <p>工具是用python编写的,python2.7和3.5+版本都支持。可以直接用pip来安装:pip install gixy。</p> <p>使用起来也很简单,直接将 gixy 命令后面加上 ningx.conf 文件的具体位置即可。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/f0bbd5ca63695a2eb9ba28a5b04bedff.jpg"></p> <p> </p> <p>来自:http://www.freebuf.com/articles/web/149761.html</p> <p> </p>