一般的作法是网站实施联系表单,反过来将合法用户的电子邮件发送给消息的预期收件人。大多数状况下,这样的联系表单将设置SMTP标头From
,Reply-to
以便让收件人轻松处理联系表单中的通讯,就像其余电子邮件同样。网络
不幸的是,除非用户的输入在插入SMTP头以前被验证,不然联系表单可能容易受到电子邮件头插入(也称为SMTP头注入)的攻击。这是由于攻击者能够将额外的头部注入到消息中,从而指示SMTP服务器执行与预期不一样的指令。app
如下PHP代码是一种易受电子邮件头部注入攻击的典型联系人表单的示例。如下代码将由网站访问者提供的名称和电子邮件地址,并准备电子邮件的标题列表。网站
使用From标题,以便电子邮件的收件人(在本示例中为root @ localhost)将知道电子邮件做者是谁。回复标题容许电子邮件的收件人经过他们的电子邮件客户端中的回复按钮回复发送电子邮件的人。spa
<?php if(isset($_POST['name'])) { $name = $_POST['name']; $replyto = $_POST['replyTo']; $message = $_POST['message']; $to = 'root@localhost'; $subject = 'My Subject'; // Set SMTP headers $headers = "From: $name \n" . "Reply-To: $replyto"; mail($to, $subject, $message, $headers); } ?>
典型的正版POST请求以下。code
POST /contact.php HTTP/1.1 Host: www.example.com name=Joe Bloggs&replyTo=joebloggs@example.com&message=Example message
攻击者能够经过发送如下POST请求来滥用此联系表单。blog
POST /contact.php HTTP/1.1 Host: www.example.com name=Attacker\nbcc: spam@victim.com&replyTo=attacker@attacker.com&message=Attacker message
在此示例中,攻击者正在插入换行符(\n
在\r\n
Windows系统上的大多数UNIX和Linux系统上),并附加一个包含附加电子邮件地址的密码SMTP标头,SMTP服务器将向BCC发送电子邮件。get
攻击者可使用这样的策略匿名发送大量消息,甚至发送网络钓鱼电子邮件,其中接收者认为这些消息源自可信来源。还值得注意的是,此漏洞不限于PHP; 它可能会影响任何基于任意用户输入发送电子邮件的应用程序。it
检测电子邮件头部注入漏洞
为了自动检测电子邮件头部注入,咱们须要依赖中介服务,由于检测到这样一个漏洞须要带外和时间延迟的向量。Acunetix 在自动扫描期间经过使用AcuMonitor做为其中介服务来解决此问题。
在扫描期间,Acunetix将找到联系表单,并注入指向AcuMonitor电子邮件地址的自定义BCC SMTP标头。若是有问题的应用程序致使SMTP服务器发送电子邮件到AcuMonitor,那么AcuMonitor知道它是易受攻击的,它会发送一个通知回到Acunetix,代表它应该提升电子邮件头插入警报。
减轻
减小电子邮件标题注入涉及验证用户输入,不容许输入中的任何换行符,这将致使添加另外一个SMTP标头。通常来讲,当验证用户输入时,实现强输入验证的最简单和最强劲的方法是经过白名单中容许的字符用于SMTP标头。