转自:http://www.safe.sh/security/?type=detail&id=1606
php
另参考:http://hi.baidu.com/higkoo/item/ed1e0cc9b9d7b3d6964452f1
html
影响版本:
Igor Sysoev nginx 0.8.x
Igor Sysoev nginx 0.7.x
Igor Sysoev nginx 0.6.x
漏洞描述:
nginx是多平台的HTTP服务器和邮件代理服务器。
nginx能够被配置为以CGI的方式支持PHP的运行,nginx在处理PHP脚本文件路径的解析时存在问题。若是网站容许上传文件,并且上传文件路径可获得,远程***者能够利用此漏洞上传包含恶意代码的文件并获得执行,实现以Web进程权限执行任意命令。
问题出如今nginx传递访问的URL和后续的脚本路径提取过程当中,***者能够上传容许上传的文件类型,文件中包含恶意代码,获得上传文件经过Web可访问的URL后,在其后添加任意php后缀的文件名进行访问,存在漏洞的处理过程会把上传的文件做为CGI脚本执行。
nginx默认以cgi的方式支持php的运行,譬如在配置文件当中能够以
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而经过分析能够看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP 的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.xxx.com/xxx.jpg,咱们以以下的方式去访问
http://www.xxx.com/xxx.jpg/xxx.php
将会获得一个URI
/xxx.jpg/xxx.php
通过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为
/scripts/xxx.jpg/xxx.php
测试方法:
[www.Safe.sh]
本站提供程序(方法)可能带有***性,仅供安全研究与教学之用,风险自负!
访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/xxxx.php,这个时候你能够看到以下的区别:
访问http://www.xxxx.com/robots.txt
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes
访问访问http://www.xxxx.com/robots.txt/xxxx.php
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6
其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。
Safe.sh安全建议:
临时解决方法:
用户能够采用下面的临时解决方案来避免漏洞的威胁:
* 修改运行配置
修改配置文件PHP的配置文件php.ini,把默认的以下行:
cgi.fix_pathinfo=1
修改成:
cgi.fix_pathinfo=0
重启nginx服务器。
nginx