Author: p0wd3r, dawu (知道创宇404安全实验室)
Date: 2016-12-27
0x00 漏洞概述
1.漏洞简介
Dawid Golunski 在圣诞节当天发布了一个漏洞报告,报告中表明 PHPMailer 小于5.2.18的版本存在远程代码执行漏洞。成功利用该漏洞后,攻击者可以远程任意代码执行。许多知名的 CMS 例如 Wordpress 等都是使用这个组件来发送邮件,影响不可忽视。
2.漏洞影响
漏洞触发条件:
PHP 没有开启 safe_mode(默认)
攻击者需要知道 Web 服务部署的路径
成功利用该漏洞后,攻击者可以远程任意代码执行。
3.影响版本
PHPMailer < 5.2.18
0x01 漏洞复现
1.环境搭建
Dockerfile:
FROMphp:5.6-apache
RUN apt-get update && apt-get install -y sendmail
RUN echo 'sendmail_path = "/usr/sbin/sendmail -t -i"' > /usr/local/etc/php/php.ini
提前下载好源码,在源码根目录下添加测试文件 1.php:
require('PHPMailerAutoload.php');
$mail = new PHPMailer;
$mail->setFrom($_GET['x'], 'Vuln Server');
$mail->Subject = 'subject';
$mail->addAddress('c@d.com', 'attacker');
$mail->msgHTML('test');
$mail->AltBody = 'Body';
$mail->send();
?>
shell:
docker build -t CVE-2016-10033 .
docker run --rm --name vuln-phpmail -p 127.0.0.1:8080:80 -v /tmp/PHPMailer-5.2.17:/var/www/html CVE-2016-10033
2.漏洞复现
我们首先看补丁:
这里使用escapeshellarg来处理$this->Sender,可见是为了防止注入参数,我们跟随$param的走向可知$param最终会被用于mail函数中,在class.phpmailer.php的mailPassthru函数中:
private function mailPassthru($to, $subject, $body, $header, $params)
{
//Can't use additional_parameters in safe_mode
//@link http://php.net/manual/en/function.mail.php
if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {