多个PHP mail函数引发的命令执行漏洞分析

近期,国外安全研究人@dawid_golunski曝光了多个使用PHP mail函数引发命令执行的漏洞。众多使用php内置mail函数的第三方邮件库,如phpmailer,SwiftMailer 纷纷中招,

主要有:

  • CVE-2016-10033
  • CVE-2016-10045
  • CVE-2016-10074

漏洞成因


这些漏洞的成因和之前曝光的Roundcube命令执行漏洞如出一辙,都是由于其在调用php内置mail函数时,没有恰当过滤第5个参数,可以被注入恶意参数,引发命令执行漏洞。

php的mail函数声明如下:

其参数含义分别表示如下:

  • to,指定邮件接收者,即接收人
  • subject,邮件的标题
  • message,邮件的正文内容
  • additional_headers,指定邮件发送时其他的额外头部,如发送者From,抄送CC,隐藏抄送BCC
  • additional_parameters,指定传递给发送程序sendmail的额外参数。

在Linux系统上,mail函数在底层实现中,默认调用Linux的sendmail程序发送邮件。在sendmail程序的参数中,有一个-X选项,用于记录所有的邮件进出流量至log文件中。

通过-X指定log文件记录邮件流量,实际可以达到写文件的效果。
例如,如下php代码

执行后,查看log文件/var/www/html/rce.php

发现被写入了包含在邮件标题或正文中的php代码,通过访问此log文件可以执行预先可控的php代码。

因此,对php mail函数使用时,应该特别注意第5个参数additional_parameters的使用,防止被攻击者可控,注入-X参数,执行命令。

CVE-2016-10033/CVE-2016-10045


在近期@dawid_golunski曝光phpmailer和SwiftMailer这些第三方php邮件库漏洞中,同样是由于对mail函数的第5个参数additional_parameters没有过滤,或过滤不当可被绕过,导致漏洞。

在phpmailer的漏洞CVE-2016-10033中,使用mailSend发送方式时,通过设置

经过sprintf字符拼接后,可以注入额外的的-X参数

mailSend函数又调用mailPassthru。

最终传递给mail函数。

phpmailer的作者随后通过增加escapeshellarg($this->Sender)进行过滤,但又可被新的方式绕过(CVE-2016-10045)。最终通过增加一个isShellSafe函数检验参数安全性,才彻底堵住了漏洞。

CVE-2016-10074


SwiftMailer的情况的也类似,在拼接参数时缺乏对参数的过滤,导致恶意参数-X注入mail函数。

 

修补防御


上述漏洞的产生都是没有正确过滤mail函数的参数,导致sendmail被调用时可被恶意利用。
目前phpmailer和SwiftMailer均已发布补丁修复了上述漏洞,升级到最新版本即可。

当然,如果用户在使用phpmailer和SwiftMailer时,不是通过mail函数的方式发送的邮件,而是通过直接和SMTP服务器协议交互的方式发送邮件,因底层未调用sendmail,则不受上述漏洞的影响。

如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669

发表评论