优秀的编程知识分享平台

网站首页 > 技术文章 正文

PHP imap_open函数任意命令执行漏洞

nanyue 2024-11-22 18:35:53 技术文章 2 ℃

1

漏洞描述

PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。

02

漏洞危害

?

攻击者可利用该漏洞在目标系统上执行任意shell命令。

03

相关概念

  • imap_open 函数

PHP函数库中并不包含 imap_open() 函数,只有在 PHP 上安装 imap 扩展后才会激活imap_open() 函数。该函数的结构如下:

resource imap_open ( string $mailbox , string $username , string $password )

函数中的mailbox是执行命令参数的一部分,所以我们可以通过更改邮箱名来进行命令注入执行。

  • IMAP服务器类型及SSH连接

现在有两种基于Unix的IMAP服务器被人们广泛使用,一种为华盛顿大学开发的 imapd ,另一种为Cyrus开发的IMAP服务器。

Cyrus开发的IMAP服务器会将用户邮件存储到内置数据库中,只有通过IMAP协议才能访问Cyrus。因此,当使用Cyrus时,已安装IMAP的Unix系统上的用户账户与IMAP账户之间并没有任何关联。

华盛顿大学开发的 imapd 会将邮箱存储到文件中,而这些文件由Unix系统中邮件用户所有,如 /var/spool/mail ,因此 imapd 对应的用户账户以及访问权限与Unix服务器直接相关。如果邮件存放在我们具备访问权限的 spool 文件中,我们可以通过SSH方式登录系统,验证我们对这些文件的访问权限。

当能够使用SSH时,整个过程并不需要建立 IMAP 连接。 也就是说,imap_open 函数首先会建立SSH连接,如果认证通过,则会在没有 IMAP 连接的情况下继续执行,这就是所谓的 IMAP 预认证模式。且在设置 SSH 连接时, mailbox 参数的值会以参数形式传递给SSH命令。

  • -oProxyCommand 参数

SSH 命令中用到了许多命令,其中我们可以使用 -o 参数来设置连接期间可用的各种选项。在建立SSH连接之前,我们可以设置 ProxyCommand 参数,如下所示:

ssh -oProxyCommand="echo hello|tee /tmp/executed" localhost

当我们执行这条命令时,可以发现即便我们没有建立与 localhost 的SSH连接,也会创建 tmp.txt 文件。

点击添加图片描述(最多60个字)

04

漏洞复现

漏洞复现页面是一个测试邮件服务器能否成功连接的页面,我们需要在此页面填写邮件服务器地址、用户名和密码。

点击添加图片描述(最多60个字)

访问并用burpsuite工具进行抓包:

点击添加图片描述(最多60个字)

修改hostname的内容,如下图所示,发送如下数据包即可成功执行命令`echo '1234567890'>/tmp/test0001`:

点击添加图片描述(最多60个字)

执行docker-compose exec web bash进入容器,可见/tmp/test0001已成功创造:

点击添加图片描述(最多60个字)

05

修复方法

1. 检查传递给 imap_open 的用户输入参数中是否存在任何特殊字符(如斜杠),过滤有效的和净化有害的输入。

2. 在 mailbox 参数中使用某些标志,其中 /norsh 标志可以用来禁用IMAP预身份认证模式。

最近发表
标签列表