近期,国外安全研究人@dawid_golunski曝光了多个使用PHP mail函数引发命令执行的漏洞。众多使用php内置mail函数的第三方邮件库,如phpmailer,SwiftMailer 纷纷中招,
主要有:
这些漏洞的成因和之前曝光的Roundcube命令执行漏洞如出一辙,都是由于其在调用php内置mail函数时,没有恰当过滤第5个参数,可以被注入恶意参数,引发命令执行漏洞。
php的mail函数声明如下:
其参数含义分别表示如下:
在Linux系统上,mail函数在底层实现中,默认调用Linux的sendmail程序发送邮件。在sendmail程序的参数中,有一个-X
选项,用于记录所有的邮件进出流量至log文件中。
1 2 3 4 |
> -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代码
1 2 3 4 5 6 7 |
$subject = 'Hello Alice!'; $message=‘<?php phhpinfo(); ?>’; $options = '-OQueueDirectory=/tmp -X/var/www/html/rce.php'; mail($to, $subject, $message, $headers, $options); ?> |
执行后,查看log文件/var/www/html/rce.php
1 2 3 4 5 6 7 |
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
参数,执行命令。
在近期@dawid_golunski曝光phpmailer和SwiftMailer这些第三方php邮件库漏洞中,同样是由于对mail函数的第5个参数additional_parameters
没有过滤,或过滤不当可被绕过,导致漏洞。
在phpmailer的漏洞CVE-2016-10033中,使用mailSend
发送方式时,通过设置
1 |
`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
函数检验参数安全性,才彻底堵住了漏洞。
SwiftMailer的情况的也类似,在拼接参数时缺乏对参数的过滤,导致恶意参数-X
注入mail函数。
上述漏洞的产生都是没有正确过滤mail函数的参数,导致sendmail被调用时可被恶意利用。
目前phpmailer和SwiftMailer均已发布补丁修复了上述漏洞,升级到最新版本即可。
当然,如果用户在使用phpmailer和SwiftMailer时,不是通过mail函数的方式发送的邮件,而是通过直接和SMTP服务器协议交互的方式发送邮件,因底层未调用sendmail,则不受上述漏洞的影响。
如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669