【API安全漏洞学习】Paypal IDOR 漏洞 - 2019-7-30

漏洞描述

Paypal 平台中存在企业账号与对应的子账号, 企业账号通过委托授权子账号来管理账号上的资金, 对于不同的子账号拥有不同的权限和功能.
用一张图来理解就是:

攻击者发现在这个 Paypal 的这个功能中存在 IDOR
漏洞, 能够通过实现子账号间越权访问.

漏洞成因

IDOR (Insecure Direct Object Reference), 又对象级授权问题, 它涉及到对Web应用程序或API中对象的不安全引用。这些对象通常是数据库记录、文件、目录等。当应用程序提供对这些对象的直接访问,并且没有适当地实施访问控制时,就会产生IDOR漏洞。

常见的 IDOR 漏洞有:

  1. 用户数据泄露: 通过修改 URL 中的 ID 获取其他用户的隐私信息, 更严重的包括更改, 删除他人的信息.
  2. 文件访问和泄露: 对于本没有权限访问的文件, 通过修改 URL 中文件的编号来越权访问.

在本次漏洞中, 攻击这发现“查看子账号”功能中有一个 URL 为 https://www.paypal.com/businessmanage/users/1657893467745278998
其中 user 后面的 1657893467745278998 是子账号所绑定的企业账号 ID, 紧接着产生一个 HTTP PUT 请求, 如下:

1
2
3
4
5
PUT /businessmanage/users/api/v1/users? HTTP/1.1
Host: www.paypal.com
Connection: close

[{"id":"1657893467745278998","accessPoint":{"privileges":["MANUAL_REFERENCE_TXN","VIEW_CUSTOMERS","SEND_MONEY"],"id":"5994224506","accounts":["attacker@gmail.com"]},"roleID":0,"roleName":"CUSTOM","privilegeChanged":true,"privilegeSecondaryName":"A1"}]

对于这个 API, 他通过之前上面的 API 发现第一个 id 参数值是企业账号的 id, 他很快就能确定第二个 id 是子账号的 id 了, 在这里第二个 id 的内容是简单的数值类型, 而且这个 id 是简单的递增或递减的, 是完全可以通过枚举的方式来获取到其他账号的 id 的, 将 5994224506 修改成 5994224507 就可以获取到同一企业账号其他子账号的权限了.

漏洞实施

攻击者根据上述漏洞, 不仅可以查看到关联的另一个子账号的信息, 还可以把响应的子账号密码进行修改就可以实现账号接管并且进行任意未授权的转账操作.

漏洞启示

Paypal 这个漏洞的产生有两个主要原因:

  1. 子账号的 id 值可以通过枚举进行猜测
  2. 一但获取到 id 权限可以被扩大, 后续的转账操作没有二次对密码等进行确认

预防这种漏洞, 在开发过程中需要留意:

  1. 增强 id 值的随机性
  2. 在权限访问控制上, 要多次检验企业账号与子账号的绑定关系, 如每次访问涉及子账号权限的操作时, 要求其输入密码,或者输入绑定号等.