【Security】我如何窃取每一位 Yahoo 用户的身份?

【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

本文所述漏洞均已修复,未经许可不得进行非法渗透测试。
原文出处:https://samcurry.net/how-i-stole-the-identity-of-every-yahoo-user

在这里插入图片描述

前言

在观察长期运行的漏洞赏金项目时,我们应当先假设每一个对外页面都已被自动化扫描多次。尽管在许多情况下这一假设并不完全成立——因为使用的扫描工具不同、扫描范围偏好不同,或扫描器会失效或产生误报——但以现实的思路去分析,仍然能发现许多价值。

像 Burp Professional、Acunetix、Nessus 这样的漏洞扫描器功能强大,但它们有时也会忽略一些细节。对于正在接受渗透测试的 Web 应用而言,邮件系统往往是被忽视的服务之一,而邮件的影响面很广。很少有自动化扫描器会去检查网站发送的邮件内容,因此在这些“不被关注”的地方常存在可利用的空间。

如果你长期观察 Yahoo 的幻想体育平台,会发现邮件在其中扮演了重要角色。

要开启幻想联赛吗?为什么不邀请一些朋友。想更好地管理联赛?邀请一个联合管理员!

下图为邀请表单示例:

在这里插入图片描述

所有这些表单都会触发 Web 服务发送邮件。其逻辑流程大致如下。

发送邮件的逻辑顺序

1.用户在表单中输入要邀请的人的姓名和邮箱地址并提交。

2.相关 HTML 示例代码如下:

<form method="POST" action="inviteUser">
    <input type="text" id="email" value="samwcurry@gmail.com">
    <input type="text" id="name" value="Sam Curry">
</form>

3.Yahoo 处理姓名和邮箱,并将其写入变量。如果使用 PHP,代码可能如下:

$email = $_POST['email']; //samwcurry@gmail.com
$fullname = $_POST['fullname']; //Sam Curry

4.当 Yahoo 完成字符串处理后,会将这些值传给实际负责发送邮件的函数(例如 PHP 的 mail 函数)。

下面是示例代码:

<?php
    $to      = $email; //samwcurry@gmail.com
    $subject = 'Hi '.$fullname; //Hi Sam Curry!
    $message = 'n/a'; //this header is not being addressed currently
    $headers = 'From: someone@yahoo.com' . "\r\n" .
               'Reply-To: someone@yahoo.com';
    mail($to, $subject, $message, $headers);
?>

5.用户最终会收到一封包含下列信息的邮件:

From: <samwcurry@gmail.com>
Subject: Hi Sam Curry!

我会如何利用这一点?

在多数应用和系统中,用于标识行结束的符号与平台有关。在 Windows 中,换行通常使用 \r\n;在早期的 Mac OS(如 Mac OS 9)中使用 \r;在 Unix 或现代 Mac(macOS)中使用 \n。

这些换行符有点类似于 HTML 中的
标签,因为它们都用于分行。

下例对比了“换行标签”和“回车换行符”的区别:

<!DOCTYPE HTML>
Hi! I'm sam! This is my sloppy HTML!<br>
Instead of chunking both of these lines as a paragraph I split them where the "br" tag was!

而含有回车换行符的文本文件则如:

Hi! I'm a standard Windows text file! I was created in notepad.\r\n
Woah! The text just split into two lines instead of staying on one because of the symbols \r\n!

如果在请求中插入这些回车换行符(CRLF),攻击者就可以添加额外的 HTTP 头,这些头会覆盖注入点后原本的头部声明。

以下是一个示例场景:

POST /invitation
Host: vulnerable.com

email=samwcurry@gmail.com>\r\nSubject: you have been hacked!\r\nCookie:

在该请求中我们可以看到:

  • 已提供 to 邮件地址,因此受害者会收到消息(示例中 > 用于关闭 <…> 格式化,效果可以在下面的响应中看到)。

  • Subject 被篡改以展示概念验证。

  • 注入了 Cookie 头,以收集通常在标准邀请请求之后会被输出的数据。

响应将类似于:

To: <samwcurry@gmail.com>
Subject: you have been hacked!
Cookie: >

展示一:mailed-by 与 signed-by

在这里插入图片描述

“mailed-by”和“signed-by”字段用来表明消息的发送来源。如果你不确定某封邮件是否为垃圾邮件,通常会查看:
(1)消息是否经过加密;
(2)消息是否由受信任的域发送;
(3)邮件内容的来源。

既然我们能够在 Yahoo 平台内自由发送邮件,除了修改头部之外,我们还可以插入任意内容(不过无法删除注入点之前已存在的内容)。

这就意味着,如果攻击者愿意,可以插入多个换行并注入 From: admin@[发送域],Gmail 等服务会因此更倾向将其视为合法邮件。这样的邮件在许多用于验证邮件完整性的启发式规则下都能显得非常真实。

展示二:攻击 multipart

--YYY_MESSAGE_YYY
Content-Type: text/plain; charset=UTF-8;
Content-Transfer-Encoding: 8bit

如上所示:multipart 邮件由若干部分组成,每个部分之前都有一个“边界字符串”(例如 --YYY_MESSAGE_YYY),随后是该部分的头部(如 Content-Type、Content-Transfer-Encoding 等),然后是该部分的实际内容。邮件客户端根据这些边界和头部来区分不同部分,并按相应类型渲染或处理。

如果应用把用户输入直接拼接到邮件的某一部分(例如本应仅为纯文本的部分),且未对 CRLF 做过滤或转义,那么这些输入就可能包含额外的换行与边界标记,从而提前终止原有的纯文本部分,随后插入一个新的 MIME 部分(例如 Content-Type: text/html)或 Content-Disposition(指示附加文件)。结果是接收端会将攻击者提供的 HTML 或附件当作合法邮件内容来呈现或下载。

Sam 曾发送如下内容以示范这一点:

Hello \r\n
\r\n
--YYY_MESSAGE_YYY\r\n
Content-Type: text/html; charset=UTF-8;\r\n

<a href='malicious.com'>Click me!</a>

展示三:伪装成管理员

某些邮件客户端会自动检查邮件是否为垃圾邮件。例如 Gmail 会检查是否存在多个 From 头。如果注入点位于原始 From 头之前,或者攻击者能够控制 From 头,那么这些检查可能会被绕过。这是因为 From 头在注入之后仍可能被取消或修改——攻击者可以将另一个 From 当作有效的头部声明。

要“取消”一个 From 头,攻击者可以把该 From 作为隐藏的 HTML 内容注入、通过 Content-Disposition 将其以 base64 编码,或采用其他方法把 From 标签以非头部的形式包含进邮件内容中。

如果攻击者想冒充他人,需要满足这些前置条件。一旦满足,攻击者只要声明自己为 admin@[发送域],邮件就可能被验证并以管理员身份发送。

下面例子显示一个不可利用的尝试(在试图绕过 Gmail、Yahoo、AOL 或其他主流邮件客户端的过滤时通常无效):

From: notadmin@yahoo.com
Subject: injectable content.. but I can't pretend to be an admin due to filtering in most mail clients! damn.

而下面的例子展示了一个更接近可利用的注入方式:

Subject: injectable content! woo! \r\n
From: admin@yahoo.com \r\n
[additional headers] \r\n
\r\n
<style>#hidden{}</style><a href='malicious.com'>Click me!</a><div id="hidden">

该示例说明攻击者如何冒充管理员(或其他用户)。请注意——原始的 From 标签在 div 之后被追加。

特定于 Yahoo 的后果

在 Yahoo 的邮件客户端中加载邮件时,通常会询问用户是否要加载邮件中的图片。但在 Yahoo 中,部分发件人被列入白名单以允许自动加载图片。如果邮件来自明确指定的地址(例如 admin@yahoo.com),图像会被自动加载而无需用户确认。

在这里插入图片描述

通过以 Yahoo 中任意用户的身份发送邮件,攻击者就能对使用不安全浏览器的受害者发动基于图像的 HTTP 401 攻击(即通过图像触发的认证请求)。

奖励:$1,250
CVSS 分数:6.5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值