账户安全随笔

渗透技巧 3年前 (2021) admin
665 0 0

账户安全

在互联网金融、电商的企业中,对于账户的安全是十分必要的。在金融企业中可能会有多种类型的账户,我们举出最常见的账户类型

  • 出入金账户:用于用户充值、提现的账户

  • 现货交易账户:用于用户现货交易的账户

  • 期货交易账户:用于用户期货交易的账户

  • 杠杠交易账户:用于用户杠杠交易的账户

  • 质押账户:用于各种情况抵押的用户账户

  • 子账户:拥有母账户的用户账户,可以在母子账户中自由划转

  • 系统账户:用于平台业务运营的账户

  • 系统归集账户:用户平台活动、产品收款的账户

  • 财务账户:用于企业财务部门的账户

如果所有的东西都记录在一个账户上,那么账就会特别乱,并且也无法满足各类交易需求。有各种不同的账户,就会有在各个不同账户之间划转的需求,对此我们先说说划转的那些事

并发问题&划转漏洞

并发划转漏洞最常见的账户安全漏洞之一,问题在于由用户账户->系统账户系统账户->用户账户用户账户->用户账户划转的过程中,划转服务没有上锁,导致一个账户扣钱和另一个账户加钱不一致。这是严重的逻辑漏洞,为了杜绝这一情况,以下方案同时实施:

  • 所有的动账操作先对资金进行冻结、再对冻结资金进行动账

  • 所有的冻结资金、冻结资金的划转必须上锁,防止超额冻结、超额划转的情况发生

  • 所有动账在外部server调用内部server的过程中,外部server必须给账户服务传输一个事物id,这个事物id必须幂等

  • 不同业务线的划转对账小时级,设定安全阀值,超过阀值告警

  • 所有账户(包括系统账户)的账户金额不可以为负数

通常来说,做好上述的步骤,就可以将并发问题杜绝在基础服务之中,但是这并不意味着在外部sevrer不会存在并发问题,我们在列举出在基础服务做好并发问题的防范后外部会出现的安全问题:

1.幂等ID使用错误

外部本来应该在一个订单的扣款中使用订单号做幂等ID,而在接口中却使用了时间戳做幂等ID,导致了并发问题的发生。因为订单号是唯一的,时间戳每秒钟都在变,这种情况在用户-系统,系统-用户的动账过程中,就会导致资金出现损失的安全问题。通常是研发人员的安全意思、技术理解能力不高导致的。

2.多接口并发

比如在一笔订单中,我们同时追加订单金额和申请退款,就会导致多接口并发问题。这种情况因为基础服务做了限制,系统的总账是对的上的。但是业务的账就不平了,可能导致系统归集账户、系统账户的钱被恶意用户刷光。

精度问题

精度问题通常发生在两个系统之间,对于精度问题的划转,笔者曾在工作中见到过,也曾通过该漏洞在showmist的赏金计划向某个交易所报告了此问题,交易所当天修复问题后,给予笔者$2500的漏洞赏金。通常情况下是两个不同的业务划转过程中,A业务的精度与B业务的精度不同,在这种情况下划转金额0.00000001就会导致A业务没扣钱,B业务却加了钱,这是十分严重的安全问题。

其他划转问题

还有一种特别独特的划转问题,这种情况者只见到了一次。但是笔者认为其可能存在于各大系统中,在某个交易所的划转中,由于是杠杠的划转,资金是划转入具体的交易品种。通常来说这类的划转参数如下:

amount=100&symbol=btcusdt&currency=btc

拥有100个btc ,将这100个btc划入btcusdt交易对中充当保证金,但是在实际操作中,笔者发现可以这么划转

amount=100&symbol=yfiiusdt&currency=yfi

笔者将100 个yfi 划入了 yfii 的交易对中,而在实际的杠杆交易操作中,如果最终我们的交易失败导致了爆仓,由于yfi无法在yfiiusdt中进行交易,我们的资金将无法被爆仓。如果系统更弱,甚至可能导致资产虚增的情况发生。

特殊资金变成真实资金的问题

通常来说存在一些限时的点卡,限时的体验金,这些资金是限制划转的并且定时收回,如果能在定时收回的过程中,将这笔资金从A server划转到B server就可以避免这种回收,这也是一种导致资产虚增的严重漏洞。

科学计数法问题

出现数字的地方常常会出现此类问题,虽然不涉及到资产的虚增,但在这一类系统中,拒绝服务的危害是比较严重的。大多数是由Java bigDecimal 导致的拒绝问题,笔者和同事通过该问题也尝试了很多国内头部电商、国内头部支付软件、世界知名交易所,获得了近十万的奖励。

原文始发于微信公众号(弦断谁听):账户安全随笔

版权声明:admin 发表于 2021年8月23日 上午8:01。
转载请注明:账户安全随笔 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...