ReNighted/iq-scam-teardown

GitHub: ReNighted/iq-scam-teardown

一份详细记录如何通过浏览器开发者工具逆向分析并拆解 Facebook IQ 测试广告骗局的完整技术报告。

Stars: 0 | Forks: 0

# 逆向工程一场 Facebook IQ 测试广告骗局:从 CSS 模糊技巧到后端架构 我在 Facebook 上看到了一个 IQ 测试广告,并参与了测试。我的结果被 1.99 美元的付费墙锁定了。这让我感觉有些不对劲,于是开始四处摸索。三个小时后,我完整地绘制出了它的后端架构图,结果发现这是一个寄生在合法竞争对手内容之上的寄生操作。 以下是完整的分析报告。 ## 陷阱设置 这个网站是 **cogniprofile.com**。你参加了一次免费的 IQ 测试,最后会看到一个诱饵——超高的百分比、一个“前 4%”的徽章,以及一个被模糊处理的分数——旁边还有一个 1.99 美元的解锁按钮。这是典型的暗黑模式漏斗。 在打开 DevTools 之前,就有几个细节引起了我的注意: - 推荐用户的照片是从 `i.pravatar.cc`(一个虚假头像服务)、随机的 Twitter 个人资料中提取的,其中一张甚至是从一个西班牙护理大会网站上盗链过来的——并且返回了 404 错误。 - 该域名仅注册了 **7 个月**,WHOIS 信息被隐藏在一家名为 *Withheld for Privacy ehf* 的冰岛隐私服务背后。 - ScamAdviser 标记显示,该域名注册商与大量低信誉网站有关联。 ## 第一阶段:虚假分数——且早已存在于你的浏览器中 我做的第一件事就是查看网页源代码。每一个“被锁定”的值其实早就存在于 HTML 中了,只是用 Tailwind CSS 的模糊类将其隐藏了起来: ```

888

Top 4% 94% 87% ``` 这种模糊效果纯粹是基于 CSS 的。要移除它,只需在支付页面的浏览器控制台中运行以下代码: ``` document.querySelectorAll('[class*="blur"]').forEach(el => { el.className = el.className .replace(/blur-\[[^\]]+\]/g, '') .replace(/blur-\w+/g, ''); }); ``` 所有内容瞬间就“解锁”了。但这种揭示毫无意义——`888` 这个分数是为每一个用户硬编码的。那些百分比也是一样。这些数据根本没有根据你的答题情况进行任何计算。 ## 第二阶段:每位访客都被植入五个追踪器 在检查 Network(网络)选项卡时,追踪器的 payload 变得一清二楚。在你还没看到自己那个虚假的分数之前,该网站就已经触发了: - **Google Analytics + Google Ads** —— 追踪页面行为并进行重定向营销 - **Facebook Pixel** —— 利用测试参与者建立 Custom Audience(自定义受众) - **TikTok Pixel** —— 如出一辙 - **Reddit Pixel** —— 你的哈希电子邮件地址会被发送到这里,用于跨平台精准投放 - **ContentSquare** —— 一款企业级的会话记录软件,能捕捉你的每一次鼠标移动、滚动和点击 最后这一项是企业级的会话记录软件。他们正在利用你 actively 进行转化漏斗的 A/B 测试。 ## 第三阶段:寻找真实的后端 Next.js 前端只是一个空壳。在打开 Network 选项卡的情况下导航到结果页面,真实的后端便立刻暴露无遗: ``` GET https://cogniprofile-d36d8b7931ab.herokuapp.com/results/352022/ → 403 Forbidden ``` 一个部署在 Heroku 上的 Django 应用。所有有价值的东西都在这里。 ## 第四阶段:从 localStorage 中获取 JWT Token 和账户数据 在控制台中运行 `JSON.stringify(localStorage)`,导出了该网站在本地存储的所有信息: ``` { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "quiz_state": "{\"1\":{\"answers\":{\"2\":965,\"4\":19,...}}}" } ``` 这里有两点值得注意。首先,**你的测试答案完全存储在客户端**——在测试过程中,它们根本没有被发送到服务器。其次,该 JWT 解码后的内容如下: ``` { "user_id": 333192, "iat": 1782396655, "exp": 2097756655 } ``` 这个 token 的过期时间是 **2036** 年。整整十年。这绝不是标准的操作规范——这表明编写此代码的人根本没有仔细考虑过 token 的生命周期。 ## 第五阶段:映射后端 我使用这个 JWT 作为 Bearer token 对 Heroku 后端进行了系统性的端点探测。以下就是返回的结果: | Endpoint | Status | Notes | |---|---|---| | `/users/me/` | 200 | 返回完整的账户信息 | | `/quiz/1/` | 200 | 完整的 IQ 题库 | | `/quiz/3/` | 200 | 性格测试 | | `/quiz/5/` | 200 | ADHD 筛查 | | `/results/352022/` | 403 | `{"error": "Active subscription required"}` | | `/admin/` | 200 | Django 后台登录页 —— 可公开访问 | | `/quiz/352022/` | 500 | 未处理的服务器异常 | `/results/` 返回的 403 错误很有意思——它返回了标准的 JSON,这意味着该 endpoint 确实存在,我的账户也已通过身份验证,并且他们的数据库中确实存在真实的分数。它确实被合法地限制在付费之后。而其他的所有接口则完全是敞开的。 Django 后台管理面板竟然能够公开访问,这是一个值得注意的配置失误。 ## 第六阶段:被盗用的题目 `/quiz/1/` 的响应中包含了所有题目以及完整的图片 URL。所有这些 URL 都指向同一个外部域名: ``` { "question_id": 6, "src": "https://testmymind.net/images/questions/1_0_0.png", "options": [ { "src": "https://testmymind.net/images/questions/1_1_0.png" }, ... ] } ``` **testmymind.net** —— 一个完全不同的网站。CogniProfile 并没有在这些图片上托管副本。他们是直接从 TestMyMind 的服务器上进行盗链(hotlinking),在未经许可且未标明出处的情况下消耗他人的带宽。 拉取 TestMyMind 的 JavaScript bundle 并搜索硬编码的 URL,找出了其最初的评分后端: ``` https://tws-audio.com/iq/create https://tws-audio.com/iq/new https://tws-audio.com/iq/scorer ``` `tws-audio.com` 后来被证实是一个山寨蓝牙耳机的静态落地页。属于同一个开发者的早期项目。这个 IQ 评分系统就是在此基础上构建的,后来剥离出来成为了 testmymind.net,最后又被重新包装成带有付费墙的 cogniprofile.com。 ## 第七阶段:TestMyMind 才是合法的原始平台 TestMyMind.net 以 **15 到 25 美元** 的价格提供相同的测试,并配有正规的分级套餐——基础 IQ 测试、完整的认知能力报告、IQ 证书。这是一个有着真实定价的真实产品。 CogniProfile 只是一个以 1.99 美元包装他们内容的空壳,却通过在 Facebook、TikTok、Reddit 和 Google 上投放付费广告活动来低价竞争。TestMyMind 几乎肯定对此一无所知——因为他们的图片是公开可访问的 URL,没有任何防盗链保护,所以他们只能看到一些没有 referrer 的图片请求。 ## 完整的架构图 ``` cogniprofile.com └── Next.js frontend on Vercel (the ad funnel) │ ▼ cogniprofile-d36d8b7931ab.herokuapp.com └── Django backend on Heroku (auth + subscription gate) │ ▼ tws-audio.com/iq/scorer └── Original scoring engine (now removed/retired) │ ▼ testmymind.net/images/questions/ └── Legitimate competitor - images hotlinked without permission ``` ## 实际上防御有效的地方 Django 对 POST 请求的 CSRF 保护是唯一正常运作的机制。每一次尝试跨域提交数据的操作都被正确的 CSRF 验证失败机制拒绝了。而除此之外的所有信息——后端 URL、JWT token、用户 ID、完整的测试题库、账户数据——只需通过标准的浏览器工具就能轻易获取,根本不需要任何特殊技能。 ## 负责任的漏洞披露 - 已联系 TestMyMind.net,并告知了其内容被盗链和未经授权用于商业用途的情况 - 在整个过程中,仅访问了我本人的账户数据 - 未修改任何数据,未更改任何系统状态 - 本文所有分析均仅使用浏览器 DevTools 和 PowerShell 完成 ## 工具 - Chrome DevTools (Network 选项卡 + Console) - PowerShell `Invoke-WebRequest` - [jwt.io](https://jwt.io) 用于 token 解码 - ScamAdviser 和 who.is 用于 OSINT 好的 :),今天的分享就到这里,这是一个周四下班后非常有趣的探索深坑,刚才不小心把这段内容错发到 cowork 里了。
标签:CSS, Web前端, 代码示例, 数据分析, 网络欺诈调查, 逆向分析