# 漏洞简介Nginx 是一款轻量级的 web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。Nginx 中存在解析漏洞,使得攻击者可以使用任意格式的文件获取网站权限。
提示
该漏洞与版本无关,是配置错误导致的。
# 漏洞复现使用 docker 搭建环境:
创建一个 shell.jpg 文件,文件内容如下:
GIF89
phpinfo();
?>
通过返回的路径访问该文件,利用解析漏洞,在路径的后面加上 /xxx.php:
可以看到 jpg 文件被解析成了 php 格式的文件。
# 漏洞原理在 php 中,有一个选项,叫做 cgi.fix_pathinfo:
这个选项开启之后,php 会执行路径解析,举个简单的例子:在 php 中,如果收到一个文件的路径为: /test1.aa/test2.bb/test3.cc,那么 php 会先从最后开始解析,也就是说如果 test3.cc 不存在,那么会往前解析 test2.bb,如果 test2.bb 存在的话,那么会按照 test3.cc 的文件格式去解析 test2.bb。为什么说是 Nginx 中的漏洞?因为 Nginx 拿到 URL 的时候,会先去解析里面的文件路径,如果发现文件格式是 php 的话,会直接交给 php 去处理。
Apache
与 Nginx 不同的是,Apache 会先验证路径存不存在再交给 php 处理,所以就不存在上述的问题。
# 漏洞修复将 php.ini 文件中的 cgi.fix_pathinfo 的值设置为 0。php-fpm.conf 中的 security.limit_extensions 后面的值设置为 .php。