本文转自:http://blog.s135.com/nginx_0day/
昨日,80Sec 爆出Nginx具有严重的0day漏洞 ,详见《Nginx文件类型 错误解析漏洞 》。只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。
其实此漏洞 并不是Nginx的漏 洞,而是PHP PATH_INFO的漏洞 ,详见:http://bugs.php.net/bug.php?id=50852&edit=1
例如用户上传了一张照片,访问地址为http://www.domain.com/images/test.jpg ,而test.jpg文件内的内 容实际上是PHP代码时,通过http://www.domain.com/images/test.jpg/abc.php 就能够执行该文 件内的PHP代码。
网上提供的临时解决方法有:
方法①、修改php.ini,设置 cgi.fix_pathinfo = 0;然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用,例如我以前博文的URL:http://blog.s135.com/read.php/348.htm 就不能访问了。
方法②、在nginx 的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ /..*//.*php ) {return 403;}。该匹配同样会一并干掉类似“/read.php/348.htm”的URI。
方法③、对于存储图片的location{…},或虚拟主机server{…},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛、 SNS上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态PHP配置。各 大网站几乎全部进行了图片服务器分离,因此Nginx的此次漏洞 对大型网站影响不大。
本人再提供一种修改nginx .conf配置文件的临时解决方法,兼容“http://blog.s135.com/demo/0day/phpinfo.php/test ” 的PATH_INFO伪静态,拒绝“http://blog.s135.com/demo/0day/phpinfo.jpg/test.php ” 的漏洞 攻击:
location ~* .*/.php($|/) |
也可将以下内容写在fcgi.conf文件中,便于多个虚拟主机引用:
if
(
$request_filename
~*
.*
/.
(
php|
php5)
$)
{
set $is_path_info
'0'
;
}
if
(
-
e $request_filename
)
{
set $is_path_info
'1'
;
}
if
(
$is_path_info
~ '0'
)
{
return
403
;
}
fastcgi_param GATEWAY_INTERFACE CGI/
1.1
;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string
;
fastcgi_param REQUEST_METHOD $request_method
;
fastcgi_param CONTENT_TYPE $content_type
;
fastcgi_param CONTENT_LENGTH $content_length
;
fastcgi_param SCRIPT_FILENAME $document_root
$fastcgi_script_name
;
fastcgi_param SCRIPT_NAME $uri
;
fastcgi_param REQUEST_URI $request_uri
;
fastcgi_param DOCUMENT_URI $document_uri
;
fastcgi_param DOCUMENT_ROOT $document_root
;
fastcgi_param SERVER_PROTOCOL $server_protocol
;
fastcgi_param REMOTE_ADDR $remote_addr
;
fastcgi_param REMOTE_PORT $remote_port
;
fastcgi_param SERVER_ADDR $server_addr
;
fastcgi_param SERVER_PORT $server_port
;
fastcgi_param SERVER_NAME $server_name
;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200
;