标签归档:nginx

nginx空字节允许执行任意代码漏洞

漏洞描述:
在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问url+%00.php来执行其中的php代码。如:http://local/robots.txt%00.php会把robots.txt文件当作php来执行。

影响版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37

漏洞利用:
1.上传经过处理的包含php一句话木马的图片文件.
2.访问http://target.com/pathtopic/nginx.jpg%00.php获得shell

修复方案:
升级Nginx

 

PHP CGI中fix_pathinfo引起的安全隐患

漏洞测试:

访问http://www.target.com/robots.txt

返回头Content-Type: text/plain

访问http://www.target.com/robots.txt/x.php

返回头Content-Type: text/html

也就是robots.txt被当做PHP解析。那么问题就来了,如果用户上传包含恶意代码的头像文件,然后利用该方法解析为PHP,那么就能轻松拿到shell。

其实该问题的根本原因在于php.ini中的cgi.fix_pathinfo配置,我们来看下cgi.fix_pathinfo配置

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's

; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok

; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting

; this to 1 will cause PHP CGI to fix it's paths to conform to the spec.  A setting

; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.

cgi.fix_pathinfo=0

如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:

/*

 * if the file doesn't exist, try to extract PATH_INFO out

 * of it by stat'ing back through the '/'

 * this fixes url's like /info.php/test

 */

if (script_path_translated &&

     (script_path_translated_len = strlen(script_path_translated)) > 0 &&

     (script_path_translated[script_path_translated_len-1] == '/' ||

....//以下省略.

可以看到如果文件不存在,则会PATH_INFO作为PHP解析。

 

修复方案如下:

1)修改php.ini文件,将cgi.fix_pathinfo的值设置为0,完成后重启PHP-FPM。此操作可能会响应到正常功能。

2)在Nginx配置文件中添加以下代码:

  if ( $fastcgi_script_name ~ \..*\/.*php ) {

           return 403;

  }

另外从5.3.9开始,php官方加入了一个配置”security.limit_extensions”,默认状态下只允许执行扩展名为”.php”的文件。

可以查看/etc/php-fpm.d/www.conf

; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php .php3 .php4 .php5

也就是说如果你的PHP版本高于5.3.9,那么默认配置也不会受到该问题影响。

而如果低于5.3.9,你就需要考虑上述的修复方案。