在漏洞赏金平台上,高赏金的漏洞每年都有。2019年73月,国外漏洞赏金平台HackerOne上报告了一个PayPal用户API相关的漏洞。
委托授权漏洞与用户的委托授权场景相关,平台截图与漏洞描述如图3-3所示。
●图3-3 HackerOne平台PayPal漏洞记录
关于这个漏洞的细节,在这里带领读者一起近距离地分析看看。
漏洞类型:API1-失效的对象级授权。
漏洞难度:高。
报告日期:2019-7-30。
信息来源:https://hackerone.com/reports/415081。
漏洞发生在paypal.com站点,在PayPal的业务中,其账号可分以下两类。
■ 企业账号(Business Account),也叫商业账号,具有PayPal高级账号的所有功能权限,主要面向企业管理用户。
■ 子账号(Secondary Account),也叫辅助账号,主要是方便企业账号管理下属员工,方便设置不同的管理功能,比如只能查看余额、只能退款、只能提现等。
企业账号通过委托授权子账号来管理账号上的资金,比如企业内的出纳和会计,在PayPal平台对应于不同的子账号,具备不同权限和功能,出纳可以转账和提现,会计可以查询和稽核。反之,则无法操作。
从上文的背景描述可以了解到,在PayPal的在线电子支付系统中,存在企业账号A下可以设置子账号A1的情况。在此案例中攻击者通过对“查看子账号”功能进行分析,得出URL为https://www.paypal.com/businessmanage/users/1657893467745278998的参数id值1657893467745278998表示子账号所绑定的企业账号。当用户操作此子账号查看操作时,产生了一个HTTP PUT请求,报文内容如下所示:
通过测试验证,上述PUT请求中第一个id字段值,即1657893467745278998可以替换为任意随机数值;第二个id字段值,即5994224506代表了其子账号id号。
而这第二个id字段只是简单的数值类型,其值是可以枚举的,它的数值是可递增或递减的。攻击者只需要篡改id值,比如修改为53994224507,再次访问/businessmanage/users时,即可以查看到企业账号下关联的另一子账号的信息。
因为权限控制存在设计缺陷,攻击者只需按照上述操作方式,把相应子账号的密码进行修改,就可以实现完美的账号接管,进行任意未授权的转账操作。
此漏洞上报后,PayPal官方及时地进行了修复,并给予赏金猎人了10500美元的奖励。
现在再来回顾一下整个攻击过程,如图3-4所示。
●图3-4 委托授权攻击过程
从过程中可以看出,整个攻击链上有关键性的两步。
■ 子账号id值的可枚举 ,导致从当前企业账号可以切换到被攻击对象的企业账号下的子账号。
■ 权限的扩大 ,从查看被攻击对象的企业账号下的子账号的功能,权限扩展到子账号密码修改功能。
在OWASP API安全Top 10中,这属于典型的失效的对象级授权问题。作为系统开发者,除了要增强id值的随机性(防止简单的数字值被枚举)外,在对象的权限访问控制上,也要校验企业账号与子账号的绑定关系,这种绑定关系的校验,不仅是信息查看、账号绑定之类的功能,还要包含密码修改等相关操作。
对于此类场景下相关联性的校验和身份鉴别,在金融业务中非常常见。比如对于用户身份的鉴别,当用户在ATM机或网银转账时,每次转账都需要重新输入转账密码,这就是一种保护性设计。而不像其他电子商务网站中的业务办理,登录后就不再需要输入密码。网银的每一笔转账都需要密码,是因为密码的保管具有私密性,只有银行账号的所有者才知道密码,每次验证密码的过程其实是对用户身份的一次确认过程。比如在银行系统中,同一个自然人账号下会有多个银行账户,比如借记卡账户、储蓄卡账户,当某人在网银自己给自己账户转账时,需要校验自然人的身份是否一致,这也是使用关联关系来验证的一种保护性设计。