934
中電雲集
再提供一種解決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