忽略Firebase公共配置?我来展示如何将其变成PII泄露并赢得1万美元奖金
大家好👋,我是m0n3m,今天我想带大家了解一个至今仍让我心痛的故事——一个本可以让我获得10,000美元奖励的漏洞,却变成了我漏洞挖掘旅程中最宝贵的教训之一。
这不仅仅是一个"这里有漏洞,这里有奖金"的故事——它揭示了我如何偶然发现一个严重的Firebase配置错误、我采取的步骤、过程中的情感波动,以及我如何失去了奖金(但获得了金钱无法买到的经验)。
所以,端起你的咖啡☕,放松坐下,让我们开始吧。
🕵️♂️ 开始——可疑的子域名
一切始于我的一次深夜侦察会话。你知道那个安静的时刻,当所有人都睡着了,你只是运行着枚举工具——希望其中一个子域名能显示出有趣的内容?
就在那时,我看到了它。一个名为outlet.target.com的子域名。
不是主商店。不是预发布环境。只是"outlet"。感觉……不同。不对劲。
那个小小的感觉——每个猎人都知道的感觉——说:
“检查它。那里有东西。” 🔍
🌐 第一步:窥探幕后(urlscan.io)
我从https://urlscan.io开始——这是我查看网站自动加载哪些文件的首选工具。几秒钟后,我注意到一些有趣的东西:大量的JavaScript文件。
JavaScript文件是金矿。它们与API通信,包含配置,有时……还有秘密。🗝️ 所以很自然地,我决定深入挖掘。
🕳️ 第二步:使用WaybackURLs进行时间旅行
接下来,我启动WaybackURLs来获取该域名曾经索引过的每个URL:
|
|
结果?一长串历史URL列表。但我对它们都不感兴趣——我想要JS文件。
所以我过滤了它们:
|
|
现在我有了一份整洁的.js文件列表,可能包含一些有趣的内容。😏
第三步:其中的秘密(Mantra扫描)
是时候释放Mantra了——这是我最喜欢的扫描JavaScript文件寻找秘密的工具之一。我运行:
|
|
Mantra开始工作——逐行扫描,函数接函数——突然,有东西引起了我的注意。
一个以AIza…开头的Google API密钥。
通常情况下,我会忽略它。大多数这些只是无害的Google Maps密钥——通常不在范围内。但就在它旁边……我看到了一个名为fire-base.js的文件。
光是这个名字就让我的大脑像圣诞树一样亮了起来。🎄
🔥 第四步:Firebase发现
我打开了fire-base.js文件。里面是一个完整的Firebase公共配置——所有典型参数:
- apiKey
- authDomain
- projectId
- storageBucket
在这一点上,没有什么非法或疯狂的——找到公共Firebase配置很常见。但真正的问题是……它的权限有多宽松?
我可以直接初始化并四处探查吗?还是它被正确锁定了?
只有一个方法可以找出答案。
🧪 第五步:测试水深
首先,我尝试了一些快速检查:
- 直接使用密钥进行基本API调用
- 对Firebase端点运行dirsearch以寻找开放目录
但一切都返回403 Forbidden。死胡同。
有一瞬间,我几乎放弃了。
“也许没什么,“我想。“可能只是一个普通的公共配置。”
但我内心的某个声音说:
“你已经走了这么远。再试一件事。”
这个决定改变了一切。⚡
💻 第六步:编写我自己的Firebase脚本——转折点
在这个阶段,我意识到我已经达到了简单请求的极限。所以,我决定采取不同的路径——成为客户端本身。
我打开编辑器,喝了一口咖啡☕,开始使用Firebase SDK编写一个小脚本。它基本上复制了应用程序真实用户与Firebase交互的方式。
不仅仅是发送原始HTTP请求,我开始试验实际客户端函数的工作原理。我测试了一个可以列出存储文件的函数,并尝试使用prefix参数来探索存储内部数据的组织方式。
然后——轰💥——一旦我运行脚本,事情变得非常有趣。我开始看到通过直接API调用不可见的响应。感觉就像我刚刚解锁了系统的一个隐藏层,只有当我像应用程序本身一样思考时才会显现出来。
这就是一切豁然开朗的时刻:有时漏洞挖掘的真正突破不是来自攻击系统,而是来自理解它真正的思维方式。
🧱 第七步:数据洪流
我能看到一切:
- 管理文件
- 产品图片
- 内部文档
- 还有一个名为……ShippingLabels/的文件夹🚚
我尝试检查管理文件,但不幸的是,它们都只是字体文件和图片——与网站本身无关。
然而,我尝试检查运单标签文件夹,我期望会返回403 Forbidden错误,但我很惊讶。
没有限制——所有内容都可以自由加载。
💥每个文件都是一个运单标签,包含真实的客户数据:姓名、电话号码、地址、订单ID,甚至仓库信息。
我继续滚动——意识到了严重性。超过75,000个运单标签被暴露。
这不仅仅是一个漏洞。这是一个数据泄露。😨
📩 第八步:报告
我写了一份详细的报告,解释了每一步:
- 我如何找到outlet子域名
- JS分析
- Firebase发现
- SDK初始化
- 暴露证明
我发送给公司并等待。五天。十天。十五天。
终于,我得到了回复。
被拒绝。❌
为什么?因为Firebase项目属于第三方供应商。不在范围内。所以即使我有大规模泄露的证据——没有奖金,没有认可。
只是……一个教训。
💬 结局——没有金钱,但有值得分享的故事
是的,失去1万美元很痛。但我获得的远更有价值——一个真实的提醒,告诉我为什么热爱这个领域。这不只是关于奖金;这是关于好奇心、坚持和责任。
如果这个故事对你有帮助,请与你的黑客朋友分享。给它鼓掌,留下评论,或关注——这让我有动力分享更多来自前线的真实故事。
保持好奇。保持道德。记住:有时最好的奖励不是金钱——而是你能够讲述的故事。
黑客快乐, M0n3m