近期,国外安全研究人@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 logfile > Log all traffic in and out of mailers in the indicated log > file. This should only be used as a last resort for debugging > mailer bugs. It will log a lot of data very quickly.
通过-X
指定log文件记录邮件流量,实际可以达到写文件的效果。
例如,如下php代码
$to = 'Alice@example.com'; $subject = 'Hello Alice!'; $message=‘<?php phhpinfo(); ?>’; $headers = "CC: somebodyelse@example.com"; $options = '-OQueueDirectory=/tmp -X/var/www/html/rce.php'; mail($to, $subject, $message, $headers, $options); ?>
执行后,查看log文件/var/www/html/rce.php
17220 <<< To: Alice@example.com 17220 <<< Subject: Hello Alice! 17220 <<< X-PHP-Originating-Script: 0:test.php 17220 <<< CC: somebodyelse@example.com 17220 <<< 17220 <<< <?php phpinfo(); ?> 17220 <<< [EOF]
发现被写入了包含在邮件标题或正文中的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
发送方式时,通过设置
`this->Sender`为`'"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php some"@email.com';`,
经过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