热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP邮件注入攻击技术(1)

大多数的人都会使用互联网通过邮件Email的方式和他人进行通信。出于这个原因,大多数网站允许他们的用户联系他们,向网站提供建议,报告一个问题,或者要求反馈,用户将会发送反馈给网站管理员的电子邮件
1. 简介

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

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

今天我们要谈论电子邮件注射,攻击者可以使用你的邮件服务器来发送垃圾邮件。

2. 邮件注入

From Wikipedia:

电子邮件注入是一个安全漏洞,这种漏洞广泛存在于在互联网电子邮件收发应用中。这是电子邮件注射和HTTP头注射类似。和SQL注入攻击类似,这种漏洞是一类常见的的漏洞,发生在当一个编程语言是嵌入到另一个,例如MYSQL嵌入到PHP中。

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

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

3. 邮件注入的攻击原理

中国古话说得好: 知其然才能知其所以然。

为了解释邮件注入的工作原理,我们必须先了解PHP Email函数的工作原理。下面是从PHP Manual中找到API解释

  1. mail(): 
  2.  
  3. http://www.php.net/manual/en/function.mail.php 
  4.  
  5. bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) 

你可以注意到,这需要三个必填参数(”目的地、主题和消息”)和其他一些可选参数和函数返回一个布尔值。

 
那么让我们来看看一个带漏洞的代码来演示这个漏洞:


						
  1.  $to="littlehann@foxmail.com"
  2.  if (!isset($_POST["send"])) 
  3.  { 
  4. ?> 
  5.    "POST" action=""
  6.    From: "text" name="sender"
  7.    Subject : "text" name="subject"
  8.    Message : 
  9.    "message" rows="10" cols="60" lines="20"
  10.    "submit" name="send" value="Send"
  11.     
  12.  } 
  13.  else 
  14.  { 
  15.    // the form has been submitted 
  16.    $from=$_POST['sender']; 
  17.    // send mail : 
  18.    if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
  19.    { 
  20.      echo "Your mail has been sent successfully"
  21.    } 
  22.    else 
  23.    { 
  24.      echo "An error has been occured !"
  25.    } 
  26.  } 
  27.  ?> 

前面的代码将用于演示目的和解释我们的攻击原理。我们将前面的代码分成三个部分:

第一部分

																																				
  1. php 
  2.  $to="littlehann@foxmail.com"
  3.  if (!isset($_POST["send"])){ 
  4. ?> 

这段代码将检查表单提交或不是。用户点击提交按钮和普通访问这个页面脚本的响应将是不同的, 如果这段代码返回True(if语句中的判断最终结果为true)这意味着表单没有提交。表单将出现,等待用户输入。另一方面,如果它返 回"False",这意味着表单已经提交,所以电子邮件将被发送。

第二部分

																																									
  1. <form method="POST" action=""> 
  2.  From: <input type="text" name="sender"> 
  3.  Subject : <input type="text" name="subject"> 
  4.  Message : 
  5.  <textarea name="message" rows="10" cols="60" lines="20">textarea> 
  6.  <input type="submit" name="send" value="Send"> 
  7.  form> 

第二部分是一个HTML表单标记,这要求用户输入。

第三部分

																																																	
  1. else 
  2.    // the form has been submitted 
  3.    $from=$_POST['sender']; 
  4.    // send mail : 
  5.    if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
  6.    { 
  7.      echo "Your mail has been sent successfully"
  8.    } 
  9.    else 
  10.    { 
  11.      echo "An error has been occured !"
  12.    } 
  13. ?> 

在前面的代码中我们可以特别注意这一行 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

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


4. 邮件注入示范

notice:

为了使用PHP作为邮件发送代理,我们需要对PHP.INI进行简单的配置:

																																																																		
  1. [mail function] 
  2. ; For Win32 only. 
  3. ; http://php.net/smtp 
  4. SMTP = smtp.qq.com 
  5. ; http://php.net/smtp-port 
  6. smtp_port = 25 

出于演示目的,我们将使用前面的带漏洞的代码。此外,我们将提交下列值作为发送邮件的参数:

																																																																									
  1. mail("littlehann@foxmail.com", "Call me urgent", "Hi,nPlease call me ASAP.nBye", "From: littlehann@foxmail.comn") 

表单发送的HTTP数据包:

从攻击者的角度来看,有许多额外的字段,可以被注入在邮件标题。更多信息见RFC 822。例如,CC(抄送)或者BCC(密送)允许攻击者插入更多的消息。

但要注意的是,我们在添加一个新的参数之前,我们必须增加一个换行符分隔每个字段。换行符的16进制值为"0x0A"。下面是一个demo code。

1) Cc/Bcc注入

在发送者字段(sender)后注入Cc和Bcc参数
From:sender@domain.com%0ACc:recipient@domain.com%0ABcc:recipient1@domain.com
所以现在,消息将被发送到recipient和recipient1账户。

2) 参数注射
From:sender@domain.com%0ATo:attacker@domain.com
现在消息将被发送到原来的收件人和攻击者帐户。注意,这里的攻击者的账户是我们通过注入额外传入的。

3) 邮件主题注入
From:sender@domain.com%0ASubject:This’s%20Fake%20Subject
攻击者注入的假的主题subject将被添加到原来的主题中并且在某些情况下将取代原本的主题subject。这取决于邮件服务行为。即代码编写的容错性,当参数中出现两个subject的时候代码是选择丢弃还是后者覆盖。

4) 改变消息的主体body
要注意SMTP的Mail格式,消息主题和头部Header之间有两个换行符(和HTTP是一样的)。
From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.
假消息将被添加到原始消息中。

5. 实战演示

这里提示一下,直接配置php.ini原生的email功能可能不太好用,配置起来也麻烦,建议采用一些第

推荐阅读
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
  • 本文详细解析了 SUCTF 2019 中的 EasySQL 题目,重点探讨了堆叠注入与 UNION 注入的区别及其应用条件。 ... [详细]
  • 本文详细介绍了 phpMyAdmin 的安装与配置方法,适用于多个版本的 phpMyAdmin。通过本教程,您将掌握从下载到部署的完整流程,并了解如何根据不同的环境进行必要的配置调整。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 本文详细介绍了如何解决 Microsoft SQL Server 中用户 'sa' 登录失败的问题。错误代码为 18470,提示该帐户已被禁用。我们将通过 Windows 身份验证方式登录,并启用 'sa' 帐户以恢复其访问权限。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • MySQL 'Too Many Connections' 错误处理及优化方案
    本文详细介绍了如何诊断和解决MySQL数据库中出现的‘Too Many Connections’错误,包括查看当前连接状态、调整配置文件以及优化应用代码等方法。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
author-avatar
mobiledu2502898543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有