很久没有曝出什么持久性很长的严重漏洞或重大新技术了,今天80sec暴出一个广泛影响各种web服务平台的重大安全问题,跟php配置方式有关:
http://www.80sec.com/nginx-securit.html
http://www.80sec.com/iis-cgifastcgi-security-hol.html
漏洞分析: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.80sec.com/80sec.jpg,我们以如下的方式去访问
http://www.80sec.com/80sec.jpg/80sec.php
将会得到一个URI
/80sec.jpg/80sec.php
经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为
/scripts/80sec.jpg/80sec.php
而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为
/scripts/80sec.jpg
所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不 对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚 本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为
/scripts/80sec.jpg和80sec.php
最后,以/scripts/80sec.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。
POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:
访问http://www.80sec.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.80sec.com/robots.txt/80sec.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的变化说明了后端负责解析的变化,该站点就可能存在漏洞。
漏洞厂商:http://www.nginx.org
解决方案:
我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失
关闭cgi.fix_pathinfo为0
或者
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
IIS也支持以CGI的方式运行PHP,但是此种模式下,IIS处理请求的时候可能导致一些同80sec提到的nginx安全漏洞一样的问题,任何 用户可以远程将任何类型的文件以PHP的方式去解析,你可以通过查看Phpinfo中对php的支持方式,其中如果为CGI/FAST-CGI就可能存在 这个问 题。
黑盒访问
http://www.80sec.com/robots.txt/1.php
查看文件是否存在和返回的HTTP头就可以知道是否存在此漏洞。
同时,如果服务器支持了PHP,但应用中使用的是asp就可以通过如下方式来直接查看服务端asp源码
http://www.80sec.com/some.asp/1.php
解决方案:
关闭cgi.fix_pathinfo为0
实验:
访问http://www.baoji360.com/1.jpg
显示:
404 Not Found
——————————————————————————–
nginx/0.7.63
web是nginx 0.7.63,符合测试条件。接下来寻找图片上传,注册登录后发现有用户头像上传,经过手工测试发现上传程序检查了文件头和文件后缀,只允许传 jpg/jpeg/png/gif格式的文件,并且上传的图片会强制压缩成尺寸100 *100的图片。实验中我用ue以十六进制方式打开一张正常的图片,在其末尾加入phpinfo代码,虽然上传成功但是不显示,把jpg下载至本地打开发 现php代码完全丢失。应该是图片压缩的原因,首先要绕过图片尺寸的压缩,我把上传成功后自动转化为100*100的图片下载本地,用ue打开加入 phpinfo()的代码,因为本身符合标准尺寸所以程序就不会再进行压缩裁减了,虽然上传成功而且代码也没被破坏,但却只显示图片,可能是ie显示的问 题。于是我加入php一句话,再用客户端连接。结果成功返回了webshell……….
例子:http://www.baoji360.com /dat/upload/member_logo/201005/sex.jpg
http://www.baoji360.com/dat/upload/member_logo/201005/sex.jpg/a.php
真实案例:
黑客大牛superhei的著名黑客站点80vul这两天被黑了,他个人的常用密码也被盗了,就是利用的此漏洞。具体原因是他的一些文章里包含 php执行命令的代码,而所有文章都是以txt后缀保存的,也就是xxxx/xx.txt/a.php。想不到啊,原以为很安全的txt居然也被利用了。 可怕的漏洞,可怕的web黑客。