Menu

Nginx解析漏洞的利用和修复方法

2015-09-02 - Linux运维安全, Nginx

Nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发,可以稳定地运行在Linux、Windows等操作系统上,其特点是占用内存少,并发能力强。
同其他软件一样,Nginx也出现过一些安全漏洞,利用这些漏洞可以对Web服务器进行渗透攻击。
下面我们通过实例来介绍几个关于Nginx的安全漏洞,以及相应的漏洞利用方法。

 Nginx漏洞分析实例
Nginx文件类型错误解析漏洞
在2010年的时候,国内安全组织80Sec发现了一个Nginx文件类型解析漏洞,但实际上这个并非Nginx本身的漏洞,而是由于配置导致的安全问题。下面我们详细分析一下这个漏洞。
漏洞分析:Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。配置文件中会有类似如下内容。
location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME是由 Nginx生成的$fastcgi_script_name来决定的。而通过分析可以看到$fastcgi_script_name是直接由URI环境变 量控制的,这里就是产生问题的点。当访问http://192.168.1.103/phpinfo.jpg/1.php这个URL 时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给 PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?
这就要说到fix_pathinfo这个选项了。
如果开启了这个选项,那么就会触发在PHP中的如下逻辑。
到这里,PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。
漏洞危害:利用该漏洞,攻击者可以将任意文件类型作为PHP文件解析,攻击者通常利用该漏洞来获取到一个WebShell。
漏洞利用:假设某一服务器存在该漏洞,攻击者可以通过上传一张包含PHP后门代码的图片来获取WebShell,这是一种常见的攻击方式。

解决方案:这里介绍两种解决方案:
一、修改php.ini文件,将cgi.fix_pathinfo的值设置为0;

二、在Nginx配置文件中添加以下代码:
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。
Nginx配置错误而导致目录遍历漏洞
在Nginx的配置文件中如果开启了autoindex选项,并采用类似下面的配置时会造成目录遍历漏洞,。
当访问http://192.168.1.103/test/这个URL时,正常情况应该遍历html/test/这个目录,但是如果访问http://192.168.1.103/test../这个URL时,则会遍历上一级目录(html/)了。

通过所示的返回结果,我们可以看到利用该漏洞我们成功遍历到了其上一级目录。
下面提供两种方法来解决这个问题,从中选择一种即可。
现在我们再来验证下当采用上面的代码加固Nginx以后,服务器是否还存在漏洞。
返回结果可以看到漏洞没有被触发,而是返回了404页面,说明漏洞被修复。

20150902_1