跳到主要内容

邮件头注入

概述

在Web应用程序中,有些具有向特定电子邮件地址发送用户输入的商品申请和调查等内容的功能。通常,此电子邮件地址是固定的,除了Web应用程序管理员外,其他人无法更改,但是根据实现方式,外部用户可以自由指定此电子邮件地址。这种导致此类问题的漏洞称为“邮件头注入”,并将利用它的攻击称为“邮件头注入攻击”。

可能发生的威胁

如果进行了邮件头注入攻击,则可能发生以下威胁。

  • 第三方中继邮件会被利用发送垃圾邮件

需要注意的网站特征

实现将用户输入的内容以电子邮件发送给管理员的网站将受到“第三方中继邮件”的影响。相关功能包括“联系我们”页面和“调查”等。

根本解决办法

  • 固定邮件头,将所有外部输入输出到电子邮件正文中。

在邮件头中,换行符起到分隔头字段的作用。如果邮件头的内容取决于外部输入,而输出处理又存在问题,攻击者就可以在输入中夹带换行符,从而插入任意邮件头字段、篡改邮件正文,甚至把邮件发送给任意收件人。因此建议固定邮件头内容,不要把外部输入输出到邮件头中,所有外部输入只输出到邮件正文。

  • 如果无法固定邮件头,请使用Web应用程序的执行环境或语言中提供的电子邮件发送API。

例如,当需要根据用户输入更改邮件主题(Subject)时,就无法完全固定邮件头。如果不得不把外部输入输出到邮件头中,建议使用Web应用程序的执行环境或语言中提供的邮件发送API。但要注意,有些API可能存在换行符处理不当的漏洞,或者其规范本身就允许通过参数插入多个邮件头字段。这种情况下,请使用已修复漏洞的版本,或由开发人员自行做适当处理,例如:在换行符后插入空格或水平制表符、将其作为折行(续行)处理;删除换行符及其后面的字符;或在输入包含换行符时直接中止处理。

  • 不要在HTML中指定收件人。

这可以说是本不应出现的实现,但由于确实存在过把收件人地址直接写在hidden参数里的案例,这里特别指出应避免这种实现。把收件人作为参数传递给Web应用程序,参数值就可能被篡改,导致网站被用作第三方邮件中继来滥发邮件。

保险措施

  • 删除所有外部输入的换行符。

删除所有外部输入中的换行符,或者更进一步删除所有控制字符。但需要注意,如果应用本来就要接受可能包含换行符的输入(例如输出到邮件正文的多行文本),对所有输入一律删除换行符会破坏正常功能,应注意处理的范围。