SSRF漏洞之FastCGI利用篇
SSRF–(Server-side Request Forge, 服务端请求伪造)
定义:由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务
SSRF漏洞思维导图如下,本篇主要介绍利用SSRF漏洞攻击FastCGI
0x00.PHP-FPM FastCGI 未授权利用
首先我们使用Vulhub漏洞靶场快速搭建漏洞环境进行复现,感受一波漏洞的危害
# 保证实验vps具有git、docker、pip、docker-compose、python基础环境
## 下载vulhub靶场资源
git clone https://github.com/vulhub/vulhub.git
## 找到fpm Fastcgi目录,一键搭建漏洞环境
docker-compose up -d
环境搭建完成,如下图可以看到,FPM Fastcgi未授权漏洞 docker镜像正在运行,且监听在本地9000端口
执行P牛漏洞EXP,Exp见 https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
python3 fpm.py 118.24.127.188 /usr/local/lib/php/PEAR.php -c "<?php echo `id`; ?>"
# 其中/usr/local/lib/php/PEAR.php 为安装php时默认自带的php文件
成功执行构造的任意PHP代码,拿到vps运行FPM的Web权限
看到这里,相比同学们都很好奇为何只是开启9000端口就造成任意命令执行了呢?
啥是PHP-FPM,FastCGI又是啥(大佬请略过0x01章节~)
接下来,我们一起探究漏洞的原理和具体的利用过程吧~
0x01.CGI、FastCGI、PHP-FPM
我们知道,在网站架构中,Web Server(如Nginx)只是内容的分发者
当客户端请求的是index.php,根据配置文件Web Server辨别不是静态文件,此时就需要去找 PHP解析器来处理
当Web Server收到 index.php 这个请求后,会启动对应的CGI 程序,也就是PHP解析器
接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规范的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程
这其中,引出如下概念:
- CGI:是 Web Server 与 Web Application 之间数据交换的一种协议
- **FastCGI:**同 CGI,是一种通信协议,对比 CGI 提升了5倍以上性能
- **PHP-CGI:**是 PHP(Web Application)对 Web Server 提供的 CGI 协议的接口程序
- **PHP-FPM:**是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能的任务管理功能
PHP默认提供了很多种SAPI(服务器端应用编程端口),常见的提供给apache和nginx的php5_module
、CGI
、FastCGI
,给IIS的ISAPI
,以及Shell的CLI
经过不断的技术升级,目前搭建高性能的PHP Web服务器,最佳的方式是Apache/Nginx + FastCGI + **PHP-FPM(PHP-CGI)**方式
FastCGI工作原理
Web 服务器启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM)
- FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接
- Web 服务器与 FastCGI 进程管理器进行 Socket 通信,选择一个CGI 解释器进程,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 这个CGI 解释器进程
- CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web 服务器
- CGI 解释器进程接着等待并处理来自 Web 服务器的下一个连接
由此,PHP-FPM 就是一个FastCGI进程管理器,是对于 FastCGI 协议的具体实现,它负责管理一个进程池,来处理来自Web服务器的请求。
PHP-FPM通信方式
在PHP使用FastCGI连接模式的情况下,Web服务器中间件如Nginx和PHP-FPM之间的通信方式又分为两种,TCP模式和套接字(unix socket)模式
- TCP模式即是PHP-FPM进程会监听本机上的一个端口(默认为9000),然后Nginx会把客户端请求数据通过FastCGI协议传给9000端口,PHP-FPM拿到数据后会调用CGI进程解析
- Unix套接字模式是Unix系统进程间通信(IPC)的一种被广泛采用方式,以文件&#x