故事的起因是,我正在测试一款预订应用程序,商家可以注册并向客户提供服务,供客户浏览和预订。测试开始几分钟后,一个奇怪的行为引起了我的注意。该应用程序根据免费试用申请表中提供的邮箱地址创建了一个账户,而没有验证所有权。这是什么意思?我可以用任何邮箱地址创建账户吗?这听起来像是预授权接管吗?我测试了这种可能性,每次都能成功接管。
现在怎么办?这会带来什么影响?即使我能抢在受害者之前接管账户,一次密码重置就足以让我失去访问权限,我还能做什么呢?我们沿着这个兔子洞往下钻,于是我开始深入挖掘。我试图以某种方式扩大它的影响。这种挖掘让我发现了另一个影响更大的漏洞。我利用邀请功能中的一个逻辑缺陷,阻止了用户访问平台。
发现这一点后,我了解到业务门户中存在多个角色。出于好奇,我开始测试授权。我尝试添加成员作为所有者,并尝试使用低权限 cookie 执行相同的功能,我以经理身份启动了一项服务,然后尝试从基本员工帐户执行相同的操作。在所有这些与授权相关的功能中,有一项特别的功能引起了我的注意。所有者和经理可以删除其他类别的帐户,所有者可以删除经理的帐户,但所有者不能删除自己的帐户。是的,一般来说没有自我帐户删除功能。但是,其他所有者帐户可以删除我的帐户吗?平台上没有邀请其他人作为所有者的选项。可以邀请的角色包括:经理、接待员、职员和基本职员。
但是没有邀请业主的选项。因此我开始测试。
staff_access_level
我以管理员身份邀请了一封电子邮件,并捕获了它的 HTTP 请求。请求中包含一个字符串,该字符串决定了受邀用户的访问级别。
POST /core/v2/business_api/me/businesses/ 1380404 /resources
主机: subdomain.redacted.com
{
“name” : “Attacker2ndEmail” ,
“staff_cell_phone” : “” ,
“staff_email” : “[email protected]” ,
“staff_access_level” : “manager” ,
“description” : “” ,
“position” : “” ,
“send_invitation” : true,
“services” : [ ] ,
“staff_user_exists” : false,
“photo” : null,
“type” : “S”
}
staff_access_level
我将字符串的值替换为owner
并转发了请求
令我惊讶的是,它真的有效!邀请限制只在前端实现,后端没有这样的预防。但主要问题仍然没有答案:你能用另一个所有者账户删除一个所有者账户吗?
答案是否定的。这款应用原本设计为每家企业由一位所有者运营。但当同一家企业有几位所有者时,应用逻辑就被破坏了。应用里没有删除按钮。
这一切和预授权接管升级有什么关系?如果你可以给企业添加另一个所有者,而该所有者自己事后无法删除,这意味着什么?此刻我突然明白了一切……
如果我使用受害者的电子邮件地址创建一个账户,然后将另一个由我控制的邮箱地址添加到平台,所有问题都迎刃而解。由于逻辑缺陷,受害者无法删除我的另一个邮箱地址,这样我就拥有了受害者业务的永久后门。
我验证了这个理论。我以攻击者的身份,用受害者的邮箱创建了一个账户。然后利用配置错误,以所有者权限邀请了我的第二个邮箱。最终,我恢复了受害者账户的密码,看看是否还能访问我的公司。结果!访问权限就在那里!受害者也无法破坏我的后门。
原文始发于微信公众号(红云谈安全):预授权接管至永久访问
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论