电子邮件正文中是不是存在任何注入漏洞?
Posted
技术标签:
【中文标题】电子邮件正文中是不是存在任何注入漏洞?【英文标题】:Is there any injection vulnerability in the body of an email?电子邮件正文中是否存在任何注入漏洞? 【发布时间】:2011-07-17 12:59:58 【问题描述】:AFAIK 只有在使用用户数据时,电子邮件的 HEADERS 中存在漏洞?
我正在使用下面的函数来清理我的数据,但是我在页面上有一些 textarea 字段,因此这些字段可能包含换行符.. 所以想知道用户数据是否只会放在电子邮件的正文中,它可以不用担心被清理——当然除了剥离 html 吗?
函数如下:
function is_injected($str)
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if (preg_match($inject,$str))
return true;
else
return false;
顺便说一句,很惊讶目前没有邮件注入/电子邮件注入的标签。
【问题讨论】:
您是在页面上显示来自电子邮件的数据,还是制作允许发送的表单? 不... 制作表格以发送电子邮件。 :) 我认为您可以对电子邮件正文进行 base64 编码(通过 MIME)以避免任何形式的注入攻击。 【参考方案1】:如果您对邮件服务器使用本地 SMTP,则正文中可能存在注入。
单个.
会自行终止 SMTP 中的当前正文,因此理论上您可以让用户提供如下输入:
some body text
.
MAIL FROM: <...>
RCPT TO: <...>
DATA
Subject: here's some spam
here's a new body
并且 SMTP 服务器可能允许第二条消息通过。
某些 SMTP 服务器可以配置为通过不允许 SMTP 命令流水线化来防止这种情况发生(即要求客户端在允许下一个命令之前读取响应)。
【讨论】:
那么我应该检查什么?一行有一个“。”在上面吗? @Brett - 是的。如果找到,ISTR 认为约定是将其替换为两个点。 另见:software-security.sans.org/blog/2011/01/14/… 或 projects.webappsec.org/w/page/13246948/… 您提到的是点填充和处理它似乎是底层 smtp 客户端和服务器的责任(您确实提到了“如果您使用的是本地 SMTP”)。说本地 SMTP 是典型的吗? 我能想到的检查漏洞的简单方法是在电子邮件正文的中心制作带有终止序列(一行上的单点)的电子邮件,然后查看收件人是否收到它作为一个整体或只有一半的电子邮件正文。例如。你好\r\n。\r\n世界【参考方案2】:如果电子邮件是 HTML 邮件,特别是如果接收者将在基于 Web 的电子邮件(Hotmail、Gmail、Yahoo 等)或支持 HTML 视图的电子邮件客户端中查看它,则注入身体绝对是一个问题 - XSS 可能发生在任何地方。
【讨论】:
大多数客户端不允许包含诸如javascript/flash/css之类的东西,因此就在远程客户端显示电子邮件而言,没有威胁。 大多数邮件客户端声称他们不会允许这样做 - 但您真的希望依靠 Hotmail/Yahoo/Gmail 的组权限来捕获包含恶意内容的所有可能方式吗?总会有另一个洞。 那么你有什么建议来解决这个问题? 在邮件生成之前进行剥离。像将任何用户提供的文本/html 放入常规网页一样,对其进行清理。盲目地将其插入正文并假设远程邮件服务器和/或客户端将为您过滤它是一种不好的方式。【参考方案3】:也可能发生动态 MIME 更改。 当我们发送邮件时,我们通常会在脚本中定义 Content-type,例如:
Content-type: text/html;charset=UTF-8
关键是 - “Content-Type”标头可以重新定义为 multipart/mixed(或 multipart/alternative 或 multipart/related),即使它之前已定义。
示例 - 假设有人在您的联系页面上的电子邮件正文字段中键入此内容:
haxor@attack.com%0AContent-Type:multipart/mixed;%20boundary=frog;%0A--frog%0AContent-Type:text/html%0A%0AMy%20Message.%0A--frog--
这将做什么 - 当用户收到此消息时,他只会看到垃圾邮件发送者的消息(由“--frog”分隔的消息),根据 mime multipart/mixed 规范。开发人员可能硬编码的原始“联系人”消息 - 也将包含在电子邮件中,但不会显示给收件人。
这样垃圾邮件发送者就可以从其他人的域发送垃圾邮件。 特别是如果它是某种形式的:“发送给你的朋友。”表格。
另外 - 在过滤邮件标题时,我使用(我猜比你那里的短一点):
preg_replace( '/\s+/', "", $text )
【讨论】:
【参考方案4】:如果边界不是随机的,您还可以将 MIME 边界注入到多部分消息中。这样您就可以注入任意内容(例如带有恶意软件的附件)。
示例(不直接与电子邮件相关,但仍然):https://bugzilla.mozilla.org/show_bug.cgi?id=600464
【讨论】:
以上是关于电子邮件正文中是不是存在任何注入漏洞?的主要内容,如果未能解决你的问题,请参考以下文章