Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

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

0
0

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

阅读: 8

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

主要有:

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

文章目录

漏洞成因

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

php的mail函数声明如下:


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

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

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

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

> -X logfile > Logalltrafficin and outofmailersin theindicatedlog > file. This shouldonlybeusedas a lastresortfor debugging > mailerbugs. Itwilllog a lotofdataveryquickly.

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

例如,如下php代码

$to = 'Alice@example.com'; $subject = 'Hello Alice!'; $message = ''; $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: HelloAlice! 17220 <<< X-PHP-Originating-Script: 0:test.php 17220 <<< CC: somebodyelse@example.com 17220 <<< 17220 <<< 17220 <<< [EOF]

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


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

因此,对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 参数


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

mailSend函数又调用mailPassthru。


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

最终传递给mail函数。


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

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


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

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


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

上述漏洞的产生都是没有正确过滤mail函数的参数,导致sendmail被调用时可被恶意利用。

目前phpmailer和SwiftMailer均已发布补丁修复了上述漏洞,升级到最新版本即可。

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

如果您需要了解更多内容,可以

加入QQ群:570982169、486207500

直接询问:010-68438880-8669


Viewing all articles
Browse latest Browse all 12749