PHP-FPM提权是CTF渗透测试及Web全领域的常用技术,其核心是绕过Web服务器直接与PHP-FPM通信实现权限突破。
一、PHP-FPM基础说明
PHP-FPM(FastCGI Process Manager)是PHP的一种运行方式,用来提高PHP在高并发Web环境中的性能和稳定性。
它负责管理多个PHP进程,接收Web服务器(如Nginx)发来的请求,并完成PHP代码解析,最终把结果返回给Web服务器。
访问流程
用户浏览器
↓
Nginx
↓ FastCGI(通过Unix socket或TCP)
PHP-FPM
↓
PHP代码
配置文件位置
/etc/php/7.x/fpm/php-fpm.conf
/etc/php/7.x/fpm/pool.d/www.conf
提权思路
正常的访问流程是:浏览器→Nginx(或Apache)→PHP-FPM→执行PHP文件
PHP-FPM默认监听9000端口,若Web服务器没有加限制,就可以绕过Nginx,通过FastCGI协议和FPM通信,就像模拟"Web服务器"一样,直接让FPM执行PHP文件
二、前提条件
1.指定一个"存在"的PHP文件(通过SCRIPT_FILENAME)
因为FPM接收请求时,需要你告诉它:要执行哪个PHP文件?
这就是SCRIPT_FILENAME参数的作用:
如果这个参数指向的文件不存在,FPM就直接返回404
所以你必须找到目标服务器上已经存在的PHP文件
技巧:
有时候服务器上会预装一些PHP示例文件,攻击者可以利用这些
2.只能执行这个PHP文件?不能运行任意代码?
仅控制SCRIPT_FILENAME,只能执行服务器上已有的PHP文件
那如何实现"执行任意代码"呢?
可以利用PHP的配置项:auto_prepend_file。
这个配置项可以让你在执行目标PHP文件前,自动包含(include)一个你指定的文件
如果我们设置它为:php://input,那就表示在执行目标文件前,先执行我们POST进来的PHP代码!这就相当于远程执行了任意代码
3.PHP默认禁止了这种用法,怎么办?
PHP有一个配置叫:
allow_url_include = Off
如果它是Off,你就不能用php://input或远程URL做include
解决办法:
FastCGI协议里有两个关键字段:
PHP_VALUE:设置普通的php.ini配置项
PHP_ADMIN_VALUE:设置一些高级(受限制)的php.ini配置项
所以我们可以直接在FastCGI请求中设置:
PHP_VALUE: allow_url_include=On
再加上:
PHP_VALUE: auto_prepend_file=php://input
这样,PHP就会在执行前自动执行我们构造的payload,从而实现远程代码执行。
三、实操
在蚁剑中,FPM/FCGI地址这里localhost和127.0.0.1都试一试
-END-


