加入收藏 | 设为首页 | 会员中心 | 我要投稿 | 在线留言 | RSS
成网科技业务包括域名空间企业网站制作
 
国际域名com/net/org仅售80元/年
1G独立空间(PHP+MYSQL)仅售600元/年
您当前的位置:首页 > 技术交流 > 网络安全 > 漏洞分析

PHP邮件注入实战演练

时间:2015-09-30 11:24:22  来源:互联网  作者:佚名  点击:

一、简介nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

如今,互联网的使用急剧上升,但绝大多数互联网用户没有安全知识背景。大多数的人都会使用互联网通过邮件Email的方式和他人进行通信。出于这个原因,大多数网站允许他们的用户联系他们,向网站提供建议,报告一个问题,或者要求反馈,用户将会发送反馈给网站管理员的电子邮件。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

不幸的是,大多数web开发人员对安全编码Code-Security没有足够的认识,其中的一些程序猿使用现成的库或框架,这些库受到许多已知的漏洞。这些漏洞是已经公布,厂商并已经对其进行了修补,并且相应的攻击源代码poc都在互联网上可下载的,但大多数开发人员都懒得升级到最新版本。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

今天我们要谈论电子邮件注射,攻击者可以使用你的邮件服务器来发送垃圾邮件。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

二、邮件注入nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

电子邮件注入是一个安全漏洞,这种漏洞广泛存在于在互联网电子邮件收发应用中。这是电子邮件注射和HTTP头注射类似。和SQL注入攻击类似,这种漏洞是一类常见的的漏洞,发生在当一个编程语言是嵌入到另一个,例如MYSQL嵌入到PHP中。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

当一个可以提交数据到一个Web应用程序表单被添加到一个Web页面,恶意用户可能会利用MIME格式添加额外的信息到要发送的消息中(POST/GET),比如一个新的收件人列表或一个完全不同的消息体。因为MIME格式使用回车分隔在数据包中信息(HTTP数据包中的每一行之间都有一个换行符,在POST和HTTP HEADER之间有两个换行符),通过添加回车提交表单数据(使用FB的一些插件可以很容易的做到),可以允许一个简单的留言板是用来发送成千上万的消息。同样,一个垃圾邮件发送者可以使用这种战术的恶意发送大量的匿名消息。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

电子邮件注入是针对PHP内置邮件功能的一种攻击类型。它允许恶意攻击者注入任何邮件头字段,BCC、CC、主题等,它允许黑客通过注入手段从受害者的邮件服务器发送垃圾邮件。由于这个原因,这种攻击称为电子邮件注入,或者邮件形式滥发。这个漏洞是不限于PHP。它可能会影响任何从用户UI接收消息并发送电子邮件消息的应用程序。这种攻击的主要原因是不适当的用户输入验证或应用程序根本没有验证和过滤机制。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

三、邮件注入的攻击原理nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

中国古话说得好: 知其然才能知其所以然。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

为了解释邮件注入的工作原理,我们必须先了解PHP Email函数的工作原理。下面是从PHP Manual中找到API解释nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

 nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
mail():nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
http://www.php.net/manual/en/function.mail.phpnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
你可以注意到,这需要三个必填参数(”目的地、主题和消息”)和其他一些可选参数和函数返回一个布尔值。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

那么让我们来看看一个带漏洞的代码来演示这个漏洞:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

<?php nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 $to="littlehann@foxmail.com"; nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 if (!isset($_POST["send"])) nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 { nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
?> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   From: <input type="text" name="sender"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   Subject : <input type="text" name="subject"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   Message : nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   <textarea name="message" rows="10" cols="60" lines="20"></textarea> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   <input type="submit" name="send" value="Send"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   </form> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
<?php nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 } nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 else nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 { nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   // the form has been submitted nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   $from=$_POST['sender']; nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   // send mail : nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   { nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
     echo "Your mail has been sent successfully"; nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   } nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   else nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   { nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
     echo "An error has been occured !"; nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
   } nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 } nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 ?> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
前面的代码将用于演示目的和解释我们的攻击原理。我们将前面的代码分成三个部分:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第一部分nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

<?php nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 $to="littlehann@foxmail.com"; nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 if (!isset($_POST["send"])){ nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
?> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
这段代码将检查表单提交或不是。用户点击提交按钮和普通访问这个页面脚本的响应将是不同的,如果这段代码返回True(if语句中的判断最终结果为true)这意味着表单没有提交。表单将出现,等待用户输入。另一方面,如果它返回"False",这意味着表单已经提交,所以电子邮件将被发送。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第二部分nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

<form method="POST" action="<?echo $_SERVER['PHP_SELF'];?>"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
From: <input type="text" name="sender"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Subject : <input type="text" name="subject"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Message : nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
<textarea name="message" rows="10" cols="60" lines="20"></textarea> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
<input type="submit" name="send" value="Send"> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
</form> nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
第二部分是一个HTML表单标记,这要求用户输入。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第三部分nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

PHP Code复制内容到剪贴板
  1. <?php    
  2. }    
  3. else    
  4. {    
  5.    // the form has been submitted    
  6.    $from=$_POST['sender'];    
  7.    // send mail :    
  8.    if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn"))    
  9.    {    
  10.      echo "Your mail has been sent successfully";    
  11.    }    
  12.    else    
  13.    {    
  14.      echo "An error has been occured !";    
  15.    }    
  16. }    
  17. ?>    

在前面的代码中我们可以特别注意这一行mail($to,$_POST['subject'],$_POST['message'],”From: $fromn”), PHP的mail()函数需要subject, message, from 这些参数。如果函数执行成功,由PHP引擎发送邮件后,将打印出成功提示 "Your mail has been sent successfully"。如果出现错误,将提示相应信息 "An error has been occurred"nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

但是有朋友要问了,问题在哪里?主要的问题对用户的输入没有做必要的验证和过滤,正如《白帽子讲web安全》里说到的,任何的安全问题可以归结为信任的问题,这里存在的问题就是程序代码对用户的输入无限制的信任。正如你所看到的在第三部分代码,发送邮件功能代码从用户接收输入(包括邮件主题、消息和来源等),参数没有过滤和验证。因此,恶意攻击者可以任意控制这些参数的值,用户发送inject攻击。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

四、邮件注入示范nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

notice:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

为了使用PHP作为邮件发送代理,我们需要对PHP.INI进行简单的配置:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

[mail function]nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
; For Win32 only.nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
; http://php.net/smtpnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
SMTP = smtp.qq.comnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
; http://php.net/smtp-portnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
smtp_port = 25nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
出于演示目的,我们将使用前面的带漏洞的代码。此外,我们将提交下列值作为发送邮件的参数:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

mail("littlehann@foxmail.com", "Call me urgent", "Hi,nPlease call me ASAP.nBye", "From: littlehann@foxmail.comn")nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
表单发送的HTTP数据包:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

从攻击者的角度来看,有许多额外的字段,可以被注入在邮件标题。更多信息见RFC 822。例如,CC(抄送)或者BCC(密送)允许攻击者插入更多的消息。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

但要注意的是,我们在添加一个新的参数之前,我们必须增加一个换行符分隔每个字段。换行符的16进制值为"0x0A"。下面是一个demo code。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

1) Cc/Bcc注入nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

在发送者字段(sender)后注入Cc和Bcc参数nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

From:sender@domain.com%0ACc:recipient@domain.com%0ABcc:recipient1@domain.comnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

所以现在,消息将被发送到recipient和recipient1账户。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

2) 参数注射nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

From:sender@domain.com%0ATo:attacker@domain.comnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

现在消息将被发送到原来的收件人和攻击者帐户。注意,这里的攻击者的账户是我们通过注入额外传入的。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

3) 邮件主题注入nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

From:sender@domain.com%0ASubject:This’s%20Fake%20SubjectnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

攻击者注入的假的主题subject将被添加到原来的主题中并且在某些情况下将取代原本的主题subject。这取决于邮件服务行为。即代码编写的容错性,当参数中出现两个subject的时候代码是选择丢弃还是后者覆盖。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

4) 改变消息的主体bodynCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

要注意SMTP的Mail格式,消息主题和头部Header之间有两个换行符(和HTTP是一样的)。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

假消息将被添加到原始消息中。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

五、实战演示nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

这里提示一下,直接配置php.ini原生的email功能可能不太好用,配置起来也麻烦,建议采用一些第三方的Email系统(WP就挺不错的)进行发送,这个模块已经把相关的交互和HTTP数据包的构造封装好了。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

附带上一些实验截图:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

1) 正常发送nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

2) Cc/Bcc注入nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

在From字段添加Inject PayloadnCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

发送邮件后,增加了抄送的功能:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

3) 邮件主题注入nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

我们在from的参数加添加subject字段:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

接收邮件后:nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

可以看到,原本的subject被注入语句覆盖了一部分内容,但是具体是覆盖还是附加和具体的PHP代码编写逻辑有关,因为现在CMS对Email发送的普通做法就是利用PHP进行HTTP/HTTPS数据包的构造,先在本地构造好数据包后,再想服务器发送。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

所以不同的系统对email注入的效果会有所不同。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

4) 改变消息的主体bodynCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

这里要注意的的,SMTP区分消息头部和消息主题是依据%0A%0A双换行符决定的。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

发送邮件后,我们发现消息的消息体已经被修改了。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

以上就是我在本地的PHP环境中模拟实验的结果,因为环境和程序代码处理逻辑的差异,可能在不同的环境下实验会有差异,我的经验是根据不同的PHP CMS系统的Email源代码进行分析,理清发送Email数据包的代码逻辑,有针对性的进行email 注入。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

六、解决方案nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

1. 永远不要信任用户的输入字段。所有用户输入应该被认为是不可信的和潜在的恶意。应用程序不受信任的输入过程可能会变得容易受到诸如缓冲区溢出攻击、SQL注入,OS指令注入、拒绝服务和电子邮件注入。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

2. 使用正则表达式来过滤用用户提交的数据。例如,我们可以在输入字符串中搜索(r 或 n)。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

3. 使用外部组件和库,提供防范这个问题像 ZEND mail、PEAR mail和swift mailer。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

4. ModSecurity可以阻止服务器级别的电子邮件注入。利用ModSecurity,我们可以检测通过POST或GET提交的CC, BCC或目的地址,并且拒绝任何包含这些字母请求。nCS成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

成网科技 www.it28.com竭诚为您服务!
开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设_成网科技

更多
 


来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门