閱讀934 返回首頁    go 中電雲集


再提供一種解決Nginx文件類型錯誤解析漏洞的方法

[文章作者:張宴 本文版本:v1.2 最後修改:2010.05.24 轉載請注明原文鏈接:https://blog.s135.com/nginx_0day/]

注:2010年5月23日14:00前閱讀本文的朋友,請按目前v1.1版本的最新配置進行設置。

昨日,80Sec 爆出Nginx具有嚴重的0day漏洞,詳見《Nginx文件類型錯誤解析漏洞》。隻要用戶擁有上傳圖片權限的Nginx+PHP服務器,就有被入侵的可能。

其實此漏洞並不是Nginx的漏洞,而是PHP PATH_INFO的漏洞,詳見:https://bugs.php.net/bug.php?id=50852&edit=1

例如用戶上傳了一張照片,訪問地址為https://www.domain.com/images/test.jpg,而test.jpg文件內的內容實際上是PHP代碼時,通過https://www.domain.com/images/test.jpg/abc.php就能夠執行該文件內的PHP代碼。

網上提供的臨時解決方法有:

方法①、修改php.ini,設置cgi.fix_pathinfo = 0;然後重啟php-cgi。此修改會影響到使用PATH_INFO偽靜態的應用,例如我以前博文的URL:https://blog.s135.com/read.php/348.htm 就不能訪問了。

方法②、在nginx的配置文件添加如下內容後重啟:if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}。該匹配會影響類似 https://www.domain.com/software/5.0/test.php(5.0為目錄),https://www.domain.com/goto.php/phpwind 的URL訪問。

方法③、對於存儲圖片的location{…},或虛擬主機server{…},隻允許純靜態訪問,不配置PHP訪問。例如在金山逍遙網論壇、SNS上傳的圖片、附件,會傳送到專門的圖片、附件存儲服務器集群上(pic.xoyo.com),這組服務器提供純靜態服務,無任何動態PHP配置。各大網站幾乎全部進行了圖片服務器分離,因此Nginx的此次漏洞對大型網站影響不大。


本人再提供一種修改nginx.conf配置文件的臨時解決方法,兼容“https://blog.s135.com/demo/0day/phpinfo.php/test”的PATH_INFO偽靜態,拒絕“https://blog.s135.com/demo/0day/phpinfo.jpg/test.php”的漏洞攻擊:

location ~* .*\.php($|/)
{
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}

fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

也可將以下內容寫在fcgi.conf文件中,便於多個虛擬主機引用:

if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
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;


附:文章修改曆史

● [2010年05月21日] [Version 1.0] 新建

● [2010年05月23日] [Version 1.1] 針對網友michael提出的“如果構造一個形如/..trojan.jpg/dummy.php/?abcd=1,似乎可以繞過防範的nginx配置”,進行了配置修改,防範了此類情況發生。提供測試的URL如下,拒絕漏洞訪問:
https://blog.s135.com/demo/0day/phpinfo.jpg (裏麵是PHP代碼)
https://blog.s135.com/demo/0day/phpinfo.jpg/.php
https://blog.s135.com/demo/0day/phpinfo.jpg/dummy.php
https://blog.s135.com/demo/0day/phpinfo.jpg/dummy.php/?abcd=1

同時兼容正常的PATH_INFO偽靜態請求,測試URL如下:
https://blog.s135.com/demo/0day/phpinfo.php (這是正常的PHP文件)
https://blog.s135.com/demo/0day/phpinfo.php/test
https://blog.s135.com/demo/0day/phpinfo.php/news123.html
https://blog.s135.com/read.php/348.htm

● [2010年05月24日] [Version 1.2] 修正文字描述錯誤。

最後更新:2017-01-04 22:34:32

  上一篇:go CentOS 5上安裝mrtg
  下一篇:go 新注冊的域名備案時提示域名衝突如何處理?