Web中的条件竞争(Race conditions)漏洞

  为了提高开发人员和网络安全人员对条件竞争攻击的警惕性,我写了这篇博客。我认为并没有多少人知道这个问题,为此,我研究了一些积分系统容易受到条件竞争攻击的CTF (包括Facebook的CTF平台)。我在博客中写到的所有例子都是在公众bug赏金计划中被发现的,并且都已被修复。

在文章的结尾处有一个工具的汇总,可以为你们进一步的研究提供一些帮助。

https://p4.ssl.qhimg.com/t01a5c00b52e596da1d.jpg

从Cobalt.io窃取比特币

Cobalt是一个bug赏金平台,使用比特币和PayPal进行支付。他们的比特币提款流很容易受到条件竞争攻击,可被用来反复领取同一笔赏金。下面是原始报告:

https://cobalt.io/cobalt/cobalt/reports/587

报告的质量很低,但Cobalt还是给了我1500美元的奖励。

在Facebook上确认所有未被使用过的电子邮件地址

下面是一个不同寻常的竞争条件漏洞,它可以被利用来确认Facebook上所有未被使用过的电子邮件地址。2月份的时候,我在测试Facebook上的移动注册流程,而且莫名其妙地成功确认了一个随机的电子邮件地址。我并不了解这是如何发生的,并且在确认电子邮件地址之前发出了5000条请求,于是我将这件事报告给了Facebook,希望他们能调试这个错误。我在4月20日重新测试了这个流程,并在最终得到了可靠的概念验证:

1.注册一个新帐户,但是不要确认电子邮件或电话。

2.为新帐户获取一个Facebook下发的通行令牌。

3.在改变add_contactpoint POST参数的同时,向api.facebook.com/method/user.editregistrationcontactpoint发送多个请求。

4.在一个你可以访问的电子邮件地址和一个不可以访问的电子邮件地址之间,你应该改变add_contactpoint,例如user@gmail.com和user@example.com。

5.在user@gmail.com,你将收到这样的一个确认链接: /confirmemail.php?e=user@gmail.com&c=13475&code=84751

得到的参数“c”是你的电子邮件地址的代码,但“code”参数证实你没有user@example.com的访问权限。获取代码后,你可以在Facebook进行设置,并确认电子邮件地址。

这个错误是在2016年5月10日进行修复的, Facebook向我支付了5000美元的赏金。

在一个Facebook广告帐户上添加多个一次性优惠券

在2014年的最后三个月里,Facebook宣布会给所有与广告相关的bug提供双倍赏金,于是我开始寻找,并发现了他们在处理广告优惠券时的一个bug。一些优惠券只能使用一次,而一个广告账户只能够兑换一张广告优惠券。进行条件竞争攻击后,我可以在一个帐户上添加多个广告优惠券。这让我想到,也可以重复使用单个优惠券,或在不同的账户使用同一张优惠券。

想要利用这个bug的话,你需要买几个广告优惠券, 并在一个帐户上同时兑换它们,这样你就能使用多个优惠券了,这显然打破了每个账户一张优惠券的规则。

这个报告有趣的地方在于时间表:

•2014年10月20日:将错误报告给Facebook。

•2014年10月22日:Facebook正在调查这个问题。

•2014年12月:Facebook和我反复进行交流,但是他们无法将这个问题重现出来。

我错了,因为我没有在报告明确解释所需的步骤。我原本应该附上POST请求和服务器响应,让他们更容易分析。

•2015年2月13日:Facebook仍然不能重现这个问题,但他们检查了代码,并相信存在漏洞。Facebook为自己的延迟道了歉。

•2015年4月22日:Facebook仍然不能重现它。他们问我错误是否仍然存在,但我没有办法买优惠码,并告知他们我没法重新进行测试。

在这个时候,我放弃了这份报告,因为我没有办法验证这个漏洞, Facebook也没办法重现。但是…

•2015年9月23日:Facebook告诉我,他们已经修复了错误,让我确认一下。

•2015年9月24日:在进行google搜索后,我得到了一些优惠券代码,并尝试条件竞争攻击,而漏洞已经被修复了。几天后,Facebook关闭了报告:

http://p2.qhimg.com/t015d57d4ed1cfad6fe.png

我认为这个bug不值7500美元,所以我要求Facebook对赏金进行解释。他们的回复是这样的:

http://p6.qhimg.com/t01e8670040e6286330.png

Mega.nz优惠券和购物条件竞争漏洞

Mega很容易受到优惠券重用竞争条件攻击,这和我在DigitalOcean发现的情况非常类似。

另一个bug在于购物逻辑。

当你购买Mega premium时,会向他们的API服务器eu.api.mega.co发出请求,同时减小余额、增加premium。通过发送多个请求,你可以进行多次购买,而你的余额也会变为负值——这可不是原本就有的功能。

Mega奖励了我250欧元赏金,我让他们把这笔钱捐赠给了LetsEncrypt。

欺骗Keybase邀请系统

在对不同的电子邮件地址进行邀请时,出现了第一个bug。假设你的Keybase帐户收到一个邀请,通过向API endpoint发送一群POST请求,你可以绕过邀请限制。原始报告中的步骤是这样的:

https://hackerone.com/reports/115007

两个月后,我看到Keybase重新设计了这个系统,于是尝试进行相同的攻击,之前的bug不见了,但是注册流程出现了一个新的bug,利用它,可以使用一个邀请注册多个用户账号。最初的报告在这里:https://hackerone.com/reports/148609

下面是进一步阅读的内容。

如果你想了解更多关于竞争条件攻击的内容,这里有一些链接:

l  @DefuseSec's blog post, includes theory and examples

l  A tool to explot race conditions by @w3af

l  Gift card reuse on Starbucks, by @homakov

l  Manipulating Medium's top stories, by Jack Cable

l  My old post about bugs in Facebook, DigitalOcean, LastPass

l  A writeup on an interesting CTF challenge, by @EdgarBoda of KITCTF team

l  Concurrency Attacks on Web Application, a video from BlueHat by @ScottStender and Alex Vidergar

非常感谢所有在前面提到的公司允许我写这些报告,也感谢你的阅读!

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐