0x01:PHP 的4种常见运行方式

SAPI: Server Application Programming Interface 服务器应用编程端口。他就是PHP与其他应用交互的接口,PHP脚本重要执行很多种方式,通过web 服务器,或者直接在命令行下,也可以嵌入其他程序重。SAPI提供了一个与外部通信的接口,常见的SAPI有:CGI 、FAST-CGI、CLI、WEB 模块模式等。

(1)CGI:通用网关接口(common gatewag interface)

CGI即通用网关接口(common gatewag interface),他是一个程序,通俗得到讲CGI就像时一座桥,把网页和web 服务器中的执行程序连接起来,他把html接收的指令传递给服务器的执行程序,再把服务器的执行程序的结果返还给html网页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。CGI已经是比较老的模式了,这几年都很少使用了。

CGI方式在遇到连接请求(用户请求)先要创建cgi的子进程,激活一个CGI 进程,然会请求处理,处理完后结束这个子进程。这就是 fork-and-execute 模式。所以用CGI方式的服务器有多少连接请求就会有多少个 CGI 子进程,子进程反复加载是 CGI 性能低下的主要原因。当用户请求数量非常多时,会大量的占用系统的资源如:内存,CUP时间等,造成效率低下。

(2)FAST-CGI:

FAST-CGI 是CGI 的升级版本,FAST-CGI就是像一个常驻(long—live)型的CGI ,它可以一直执行着,只要激活后,不会每次都花费时间去fork 一次。PHP 使用 PHP-FPM (FAST-CGI Process Manager),全程PHP FAST-CGI 进程管理器进行管理。

Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

当客户的请求到达 Web Server 时,FAST-CGI进程管理器选择并连接到到一个CGI解释器。Web Server 将CGI 环境变量和标准输入发送到FAST-CGI 子进程 PHP-CGI。

FAST-CGI 子进程完成处理后将便准输出和错误信息从同一连接返回Web Server。当FAST-CGI 子进程关闭连接时,请求便告知处理完成。FAST-CGI子进程接着等待并处理来自于FAST-CGI进程管理器(运行在Web Server中)的下一个连接。在Fast-CGI 模式中,PHP-CGI再此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。

(3)Apache 2.0 Handler:

PHP 作为Apache 模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦又请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户端浏览器的请求反应更快,性能更高。

(4)CLI

CLI 是 PHP 的命令行模式,大家经常使用它,但是可能并没有注意到(例如:我们在LInux 下经常使用 “ php -m ” 查找安装了那些扩展就是PHP 命令运行模式)。

0x02:CGI环境利用

phpinfo 查看 SAPI
image.png

利用条件:

1、PHP以 CGI 方式运行,这样environ 才会保存UA头
2、environ 文件存储位置已知,且environ文件可读

利用姿势:

proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再包含它,即可。