当通过 SMTP 发送邮件时,此类信息有两个不同的位置,信封(使用 SMTP 命令设置的内容)和标题(SMTP 数据命令下的第一个文本块,以空行结尾) . 因此,例如,这是一个信封与标头不一致的 SMTP 事务。邮件将按信封传递,但收件人将看到标题。
mail from: <evil@evil.com>
250 2.1.0 Ok
rcpt to: <victim@example.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: "Apple Store" <apple@apple.com>
To: orders@apple-store.com
Subject: We just received your purchase...
Mail body goes here.
.
250 2.0.0 Ok: queued as C5E251FFE2
quit
221 2.0.0 Bye
Connection closed by foreign host.
假收件人进入标题“To:”行,但邮件是根据 SMTP“RCPT TO”命令中设置的值传递的。事实上,收件人看到了攻击者希望他们看到的 Header:
现在,有一些针对这种情况的保护措施。如果您告诉您的邮件客户端您想要查看完整的邮件标头,您会注意到邮件服务器注入了几个标明真实故事的标头:
From evil@evil.com Fri Jul 27 14:45:21 2018
Return-Path: <evil@evil.com>
X-Original-To: victim@example.com
Delivered-To: victim@example.com
但是,当然,邮件客户端在默认情况下总是隐藏这个级别的细节,正确解释标题可能很困难。要记住的关键是它们在运行时由服务器预先添加,因此顶部的那些是由您的服务器放入的;如果您在标头底部看到“返回路径”,则可能是攻击者伪造并试图误导您……由于原始消息“数据”包含发送客户端制作的标头,因此他们可以放入任何他们想要的东西在服务器开始前置之前。
按照怎么做-
伪造电子邮件收件人的第一条规则是,预计它会惨遭失败。
第二条规则是,使用密件抄送:对于您想要获取它的收件人,并使用收件人:对于您希望被看到获取它的收件人。这是使用邮件客户端执行此操作的标准方式,通常适用于从 mailx 到 gmail 的所有内容。
但是里程可能会发生不可预测的变化。例如,如果您将To:留空,许多邮件服务器会将Bcc:的内容填充到To:中以弥补它。20 年前,我用这种方式向成千上万的“隐藏收件人”发送了垃圾邮件,向申请人列表发送了竞赛更新。哎呀。