利用PHP-FPM实现open_basedir绕过
利用PHP-FPM实现open_basedir绕过
原创:Mr.zhang合天智汇
原创投稿活动:重金悬赏 | 合天原创投稿等你来
0X00 安装模式
在PHP中有以下几种常见的安装模式:
1. CGI模式
CGI是通用网关接口,HTTP服务器使用这样的接口程序来调用外部程序,外部程序可以使用任何计算机语言来编写,例如C,C++,Perl,Visual Basic,Shell等等,历史上用来编写CGI程序使用最广泛的是Perl语言。
服务器在认为这是一个CGI请求时,会调用相关CGI程序,并通过环境变量和标准输出将数据传送给CGI程序,CGI程序处理完数据,生成html,然后再通过标准输出将内容返回给服务器,服务器再将内容交给用户浏览器,CGI进程退出。
CGI的出现让WEB从静态变为为动态,随着Web的越来越普及,很多的网站的都需要有动态的页面,以便与浏览者互交。CGI方式的缺点也越来越突出。因为HTTP要生成一个动态页面,系统就必须启动一个新的进程以运行CGI程序,CGI采用fork and execution方式,每次请求都需要新建立CGI程序来进行处理,不断地fork是一项很消耗时间和资源的工作,导致性能的低下。这就出现了FastCGI。
2. FastCGI模式
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用。FASTCGI快速通用网关接口是常驻内存的CGI,实际上是对CGI程序的进程管理,FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
相关的Fastcgi学习可到合天网安实验室操作实验——Fastcgi安全:实验:Fastcgi安全(合天网安实验室)本实验介绍了fastcgi安全,是以nginx+php+fastcgi为环境,在多台fastcgi服务器做负载均衡的情况下,容易出现的错误。
3. Module模式
Module模式就是把php作为apache的一个子模块来运行,使用LoadModule来加载php模块,比如在apache的配置文件中
//httpd.conf LoadModule php7_module "${INSTALL_DIR}/bin/php/php7.2.13/php7apache2_4.dll"当web访问php文件时,apache会调用php模块来解析,phpmodule通过sapi来把数据传递给php解析器进行解析。
4. PHP-FPM模式
最后是本篇文章的主角PHP-FPM,FPM是一个FastCGI协议解析器,Nginx等服务器中间件将用户请求按照FastCGI的规则打包好发送给PHP-FPM,再由PHP-FPM来将打包的数据进行解析并与FastCGI进行通信,PHP-FPM就是为了实现和管理FastCGI协议的进程(fastcgi进程管理器),管理一个进程池,处理来自于web服务器的请求。其中,Ngnix与PHP-FPM有两种通信方式,分别是TCP与Unix domain sockets模式。在windows系统中只能使用tcp socket的通信方式。
TCP模式
TCP模式是PHP-FPM进程监听本机上端口(默认为9000),Ngnix将用户请求按照fastcgi的规则打包好发送给php-fpm,由PHP-FPM调用cgi进行解析。TCP通信模式允许通过网络进程之间的通信,也可以通过loopback进行本地进程之间通信。
Unix domain sockets模式
Unix socket 又叫 IPC (inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 Ngnix配置文件中填写 PHP-FPM 的 socket 文件位置。