<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OpenAI on 逍遥笔记</title><link>https://blog.7qiang.com/tags/openai/</link><description>Recent content in OpenAI on 逍遥笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>逍遥笔记</copyright><lastBuildDate>Tue, 28 Jul 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://blog.7qiang.com/tags/openai/index.xml" rel="self" type="application/rss+xml"/><item><title>0 PHP 白嫖 ChatGPT Plus — 跨区定价混淆攻击的完整技术拆解</title><link>https://blog.7qiang.com/posts/chatgpt-plus-0php-cross-region-pricing-exploit-2026/</link><pubDate>Tue, 28 Jul 2026 18:00:00 +0800</pubDate><guid>https://blog.7qiang.com/posts/chatgpt-plus-0php-cross-region-pricing-exploit-2026/</guid><description>&lt;img src="https://blog.7qiang.com/blog-cover-cyber-mask.gif" alt="Featured image of post 0 PHP 白嫖 ChatGPT Plus — 跨区定价混淆攻击的完整技术拆解" /&gt;&lt;section class="xiaoyao-contact-card" aria-label="联系逍遥"&gt;
 &lt;img class="xiaoyao-contact-card__qr" src="https://blog.7qiang.com/contact-qr.png" width="690" height="690" loading="lazy" decoding="async" alt="逍遥微信二维码"&gt;
 &lt;div class="xiaoyao-contact-card__content"&gt;
 &lt;h3 class="xiaoyao-contact-card__title"&gt;联系逍遥&lt;/h3&gt;
 &lt;p class="xiaoyao-contact-card__description"&gt;扫码添加微信，或点击下方按钮复制联系方式。&lt;/p&gt;
 &lt;div class="xiaoyao-contact-buttons" data-contact-buttons&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--wechat" type="button" data-copy-contact="plus6566" data-copy-label="微信号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;微信&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;plus6566&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--qq" type="button" data-copy-contact="826215906" data-copy-label="QQ 号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;QQ&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;826215906&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;span class="xiaoyao-contact-feedback" role="status" aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;/div&gt;
&lt;/section&gt;

&lt;p&gt;进微信群请联系博主，各位觉得文章对你有帮助的话可否打赏一些呀~&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 免责声明&lt;/strong&gt;：本文仅供安全研究与技术讨论。文中不提供可直接复用的攻击工具或完整利用脚本。利用类似手段对正式服务进行未授权操作属违法行为，后果自负。本文目的是帮助支付系统开发者理解跨区定价攻击面并加固防御。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;这两天群里炸了。&lt;/p&gt;
&lt;p&gt;有人甩出一张截图：Stripe 结账页面，产品写着 “ChatGPT Plus”，金额一栏赫然显示 &lt;strong&gt;₱0.00 PHP&lt;/strong&gt;。菲律宾比索，零元，提交即开通。&lt;/p&gt;
&lt;p&gt;评论区画风可想而知——“假的吧&amp;quot;“PS 的吧&amp;quot;“你怎么不说 Plus 倒找你钱”。&lt;/p&gt;
&lt;p&gt;然后陆陆续续有人贴出了完整流程，甚至还配了视频录屏。操作步骤不复杂，总共四步，不需要 Root，不需要 Frida，不需要改一行代码。唯一的技术含量在于——&lt;strong&gt;你得知道用什么顺序把哪些区域串起来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就有意思了。之前我们拆过 &lt;a class="link" href="https://blog.7qiang.com/posts/google-play-ccmax-proration-vulnerability-2026/" target="_blank" rel="noopener"
 &gt;prorationMode hook&lt;/a&gt;（改一个 &lt;code&gt;putInt&lt;/code&gt; 白嫖 Claude Max）、拆过 &lt;a class="link" href="https://blog.7qiang.com/posts/claude-cassia-mock-payment-bypass-analysis/" target="_blank" rel="noopener"
 &gt;焚决脚本&lt;/a&gt;（劫持 &lt;code&gt;checkout_capabilities&lt;/code&gt; 走 SEPA 假账号）、拆过 &lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-exploit-revenuecat-vulnerability/" target="_blank" rel="noopener"
 &gt;RevenueCat 凭证转移&lt;/a&gt;（匿名购买 + restore 归属偷渡）。那些多少都是&amp;quot;改代码&amp;quot;的路子——Hook 内存、注入响应、篡改参数。&lt;/p&gt;
&lt;p&gt;但这次不一样。这次&lt;strong&gt;什么都没改&lt;/strong&gt;。没有脚本，没有 Hook，没有中间人。攻击者只是以一种特定的顺序访问了几个网页，然后 Stripe 自己就吐出了 0 元账单。&lt;/p&gt;
&lt;p&gt;今天把它完整拆开。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一攻击全景四步从-jp-到-ph从-20-到-0"&gt;一、攻击全景：四步，从 JP 到 PH，从 $20 到 ₱0
&lt;/h2&gt;&lt;p&gt;先把流传的步骤还原一下：&lt;/p&gt;
&lt;h3 id="step-1日本节点注册-openai-账号"&gt;Step 1：日本节点注册 OpenAI 账号
&lt;/h3&gt;&lt;p&gt;挂 JP 代理，开一个干净的浏览器 Profile（指纹浏览器或者 Chrome 新 Profile），去 OpenAI 官网正常注册，邮箱验证，登录确认。&lt;/p&gt;
&lt;p&gt;此时你的账号状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;account.locale = &amp;#34;ja-JP&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;account.billing_country = &amp;#34;JP&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;account.currency = &amp;#34;JPY&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OpenAI 在注册时根据你的 IP 地理位置初始化账号的计费区域。&lt;strong&gt;这一步的目的不是&amp;quot;要日本&amp;quot;本身，而是要一个非美区的初始定价锚点。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="step-2切美国节点提取-access-token"&gt;Step 2：切美国节点，提取 Access Token
&lt;/h3&gt;&lt;p&gt;保持同一个浏览器 Profile，VPN 切到 US 节点，重新登录刚才注册的账号。然后新标签页打开：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://chatgpt.com/api/auth/session
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器返回一个 JSON，里面有 &lt;code&gt;accessToken&lt;/code&gt; 字段——一个标准 JWT。复制保存。&lt;/p&gt;
&lt;p&gt;此时你的 session 状态出现了第一层矛盾：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;account.billing_country = &amp;#34;JP&amp;#34; ← 注册时写入，持久化在 OpenAI 数据库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;session.ip_country = &amp;#34;US&amp;#34; ← 当前 IP 推断，存在 session/edge 层
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="step-3第三方工具生成-checkout-链接"&gt;Step 3：第三方工具生成 Checkout 链接
&lt;/h3&gt;&lt;p&gt;打开某个第三方&amp;quot;CDK 提炼&amp;quot;工具站点（这类工具本质上就是一个 AT → Stripe Checkout Session 的代理），把 Access Token 粘进去，点生成。&lt;/p&gt;
&lt;p&gt;工具返回一个链接，格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://chatgpt.com/checkout/openai_llc/oaics_xxxxxxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;oaics_&lt;/code&gt; 是 OpenAI 的 Stripe Checkout Session ID 前缀。这个 session 是 OpenAI 后端基于你的 AT 创建的，包含了产品、价格、货币等信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键问题来了：这个 Checkout Session 的 currency 和 amount 是怎么决定的？&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="step-4打开链接惊喜时刻"&gt;Step 4：打开链接，惊喜时刻
&lt;/h3&gt;&lt;p&gt;在美国节点下打开这个 oaics 链接。Stripe 结账页面加载出来，你看到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ChatGPT Plus
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;₱0.00 PHP / month
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;菲律宾比索。零元。&lt;/p&gt;
&lt;p&gt;填入指定 BIN 的卡片信息（523686 或 4513），美国账单地址，提交。&lt;/p&gt;
&lt;p&gt;Stripe 收了一笔 0 元交易，OpenAI 后端确认 checkout session 成功，权益生效。回到 ChatGPT 首页，左上角已经是 Plus 了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二为什么是-0-php三种假说"&gt;二、为什么是 0 PHP？——三种假说
&lt;/h2&gt;&lt;p&gt;先澄清一个重要事实：&lt;strong&gt;OpenAI 在菲律宾是有明确定价的&lt;/strong&gt;，ChatGPT Plus 的 PH 区定价大约是 ₱990 PHP/月。所以这不是简单的&amp;quot;价格表空洞导致 fallback 到 0”——如果定价系统正常查 PH 价格表，应该返回 ₱990，不是 ₱0。&lt;/p&gt;
&lt;p&gt;那 0 是怎么来的？没有对 Checkout Session 创建过程的完整抓包，我们只能做推断。以下三种假说按可能性排序。&lt;/p&gt;
&lt;h3 id="假说一第三方工具在创建-checkout-session-时注入了零元参数最可能"&gt;假说一：第三方工具在创建 Checkout Session 时注入了零元参数（最可能）
&lt;/h3&gt;&lt;p&gt;OpenAI 的 &lt;code&gt;/backend-api/payments/checkout&lt;/code&gt; 接口接受多个参数来创建 Stripe Checkout Session。如果这个接口接受客户端传入的 &lt;code&gt;discount&lt;/code&gt;、&lt;code&gt;coupon&lt;/code&gt;、&lt;code&gt;promotion_code&lt;/code&gt; 或类似参数，且&lt;strong&gt;后端没做资格校验&lt;/strong&gt;——工具直接传了一个 100% 折扣的 coupon code 或者 &lt;code&gt;amount_override: 0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这和之前 &lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-exploit-revenuecat-vulnerability/" target="_blank" rel="noopener"
 &gt;RevenueCat 文章&lt;/a&gt;里分析过的 &lt;code&gt;eligible_promo_campaigns&lt;/code&gt; 注入如出一辙：客户端声称&amp;quot;我有优惠资格”，后端不校验就信了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 工具的真实请求可能长这样
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;plus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;promotion_code&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;某个内部免费试用码&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 或者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;billing_country&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PH&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;php&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 或者更直接的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;price_override&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;JP 注册 + US 登录制造的区域歧义，可能不是直接触发 0 元的原因，而是&lt;strong&gt;绕过风控检查的前置条件&lt;/strong&gt;——当账号区域和 IP 区域不一致时，后端对 checkout 参数的校验逻辑可能走入了一个宽松的分支。&lt;/p&gt;
&lt;h3 id="假说二跨区信号冲突导致定价路由进入异常分支"&gt;假说二：跨区信号冲突导致定价路由进入异常分支
&lt;/h3&gt;&lt;p&gt;当 OpenAI 创建 Stripe Checkout Session 时，面前有至少四个区域信号：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;信号来源&lt;/th&gt;
 &lt;th&gt;值&lt;/th&gt;
 &lt;th&gt;决定时机&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;账号注册地&lt;/td&gt;
 &lt;td&gt;JP&lt;/td&gt;
 &lt;td&gt;注册时固化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;当前 session IP&lt;/td&gt;
 &lt;td&gt;US&lt;/td&gt;
 &lt;td&gt;每次请求实时推断&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stripe 卡 BIN 发行国&lt;/td&gt;
 &lt;td&gt;PH&lt;/td&gt;
 &lt;td&gt;填卡时由 Stripe 推断&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;浏览器 Accept-Language&lt;/td&gt;
 &lt;td&gt;取决于浏览器设置&lt;/td&gt;
 &lt;td&gt;每次请求携带&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;正常场景下这四个信号一致——美国人在美国用美国卡买东西，直接查 US 价格表。&lt;/p&gt;
&lt;p&gt;但当 JP ≠ US ≠ PH 三个信号同时存在时，定价系统需要做一个选择。如果选择逻辑是 &lt;code&gt;if (account.country != ip.country) { use card.country }&lt;/code&gt; 这种优先级策略，而 PH 价格表虽然存在但在某个&lt;strong&gt;子路径&lt;/strong&gt;（比如&amp;quot;非本地注册用户+跨区IP&amp;quot;的特殊定价分支）中没有配置——就可能在这个特殊分支里 fallback 到 0。&lt;/p&gt;
&lt;p&gt;换句话说：&lt;strong&gt;PH 的主价格表有值（₱990），但某个异常处理路径的价格映射没覆盖到 PH&lt;/strong&gt;，攻击者通过区域信号碎片化精确命中了这条路径。&lt;/p&gt;
&lt;h3 id="假说三stripe-checkout-session-的-line_items-被工具篡改"&gt;假说三：Stripe Checkout Session 的 line_items 被工具篡改
&lt;/h3&gt;&lt;p&gt;Stripe &lt;code&gt;checkout.sessions.create&lt;/code&gt; 的 &lt;code&gt;line_items&lt;/code&gt; 参数包含 &lt;code&gt;price&lt;/code&gt; 或 &lt;code&gt;price_data&lt;/code&gt;。如果 OpenAI 的接口允许客户端指定 &lt;code&gt;price_data.unit_amount&lt;/code&gt;（哪怕是间接的），工具就能在创建 session 时直接把金额写成 0。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;line_items: [{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; price_data: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; currency: &amp;#34;php&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unit_amount: 0, // 直接指定 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; product: &amp;#34;prod_xxx&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; recurring: { interval: &amp;#34;month&amp;#34; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; quantity: 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种情况下 PH BIN 的作用不是&amp;quot;触发 PH 价格表&amp;quot;，而是&lt;strong&gt;让 currency 字段说得通&lt;/strong&gt;——如果你传 &lt;code&gt;currency: &amp;quot;php&amp;quot;&lt;/code&gt; 但卡是 US 卡，Stripe 可能会有额外的 currency mismatch 警告。PH 卡 + PHP 货币是自洽的。&lt;/p&gt;
&lt;h3 id="为什么是-ph-bin"&gt;为什么是 PH BIN？
&lt;/h3&gt;&lt;p&gt;无论哪种假说，流传的两个 BIN 都有其作用：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;BIN&lt;/th&gt;
 &lt;th&gt;网络&lt;/th&gt;
 &lt;th&gt;发行国&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;523686&lt;/td&gt;
 &lt;td&gt;Mastercard&lt;/td&gt;
 &lt;td&gt;菲律宾&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4513xx&lt;/td&gt;
 &lt;td&gt;Visa&lt;/td&gt;
 &lt;td&gt;取决于具体发行行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;523686 开头的卡填入 Stripe 表单时，Stripe 内部标记 &lt;code&gt;payment_method.card.country = &amp;quot;PH&amp;quot;&lt;/code&gt;。这个信号在整个支付流中传播。PH BIN 的作用至少有两个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;让 PHP 货币的 checkout session 能正常完成&lt;/strong&gt;——卡的发行国和结账货币匹配&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可能绕过 OpenAI 的 card-country vs account-country 风控规则&lt;/strong&gt;——PH 卡付 PHP 金额在 Stripe 层面是&amp;quot;正常交易&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="三jp-注册的作用制造区域身份分裂"&gt;三、JP 注册的作用——制造&amp;quot;区域身份分裂&amp;quot;
&lt;/h2&gt;&lt;p&gt;你可能会问：为什么不直接在美国注册、美国提 Token、用 PH 卡付？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;直接美区注册的账号，定价系统的行为是确定性的——走 US 价格表，$20 USD，没有歧义可利用。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JP 注册的作用是制造一个&lt;strong&gt;区域身份不确定&lt;/strong&gt;的账号。当账号的 billing_country 是 JP，session IP 是 US，这两个信号已经矛盾了。定价系统在处理这种矛盾时，可能会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;走入一个&lt;strong&gt;异常处理分支&lt;/strong&gt;，该分支的参数校验比正常路径更宽松&lt;/li&gt;
&lt;li&gt;允许第三方工具注入的额外参数（如 currency、discount）覆盖默认行为&lt;/li&gt;
&lt;li&gt;使用一个与主价格表不同的&lt;strong&gt;备用定价逻辑&lt;/strong&gt;，而这个逻辑有漏洞&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;用状态机的视角看：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 注册时: JP │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ locale=ja-JP │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 登录时: US │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ip_country=US│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ≠ locale │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 创建 Checkout │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ JP ≠ US → 歧义 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 进入异常分支 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 参数校验宽松 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 工具注入参数 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ + Card BIN: PH │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → amount = 0 PHP │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;三个不同的区域信号（JP / US / PH）制造了歧义，歧义打开了异常路径，异常路径上的校验缺失被利用。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是一个经典的安全反模式：当多个权威源对同一个问题给出不同答案时，系统在歧义中放松了校验——不是直接返回 0，而是&lt;strong&gt;给了攻击者操纵结果的空间&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四第三方提炼工具在干什么"&gt;四、第三方&amp;quot;提炼工具&amp;quot;在干什么？
&lt;/h2&gt;&lt;p&gt;流程里的那个第三方网站（&lt;code&gt;sms.linlinflow.ccwu.cc&lt;/code&gt;），名字叫&amp;quot;CDK 提炼&amp;quot;，听着玄乎，其实它干的事非常直白：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;接收你的 Access Token&lt;/li&gt;
&lt;li&gt;用这个 AT 调用 OpenAI 后端 API，创建一个 Stripe Checkout Session&lt;/li&gt;
&lt;li&gt;把 Checkout Session 的 URL 返回给你&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本质就是一个 &lt;strong&gt;AT → oaics_ 链接&lt;/strong&gt; 的代理服务。&lt;/p&gt;
&lt;p&gt;它的技术实现大概率是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 伪代码，非真实接口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://chatgpt.com/backend-api/payment/checkout&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;plus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 关键：这里可能注入了额外参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// billing_country? currency? locale?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;checkout_url&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// checkout_url = &amp;#34;https://chatgpt.com/checkout/openai_llc/oaics_...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键问题：工具只是&amp;quot;转发&amp;quot;了 AT，还是&amp;quot;动了手脚&amp;quot;？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;考虑到 PH 区有明确的 Plus 定价（约 ₱990/月），而结果是 ₱0——&lt;strong&gt;工具大概率不只是简单转发&lt;/strong&gt;。它在创建 Checkout Session 时注入了额外参数，利用跨区账号的异常处理路径绕过了服务端校验。&lt;/p&gt;
&lt;p&gt;具体注入了什么参数？没有抓包数据我们无法确定。可能是 &lt;code&gt;promotion_code&lt;/code&gt;、&lt;code&gt;discount&lt;/code&gt;、&lt;code&gt;currency&lt;/code&gt; + &lt;code&gt;amount&lt;/code&gt; 覆盖、甚至是一个 OpenAI 内部的免费试用 API 路径。但有一点可以确定：&lt;strong&gt;如果工具只是忠实转发 AT，以 PH 区 ₱990 的定价，结果不可能是 ₱0。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工具是这个攻击链中最不透明的环节。你把 Access Token——等同于你的登录态——交给了一个第三方服务。它用你的身份做了什么请求、传了什么参数，你完全不知道。这也是为什么整个流程的&amp;quot;技术含量&amp;quot;看似很低——&lt;strong&gt;核心逻辑都藏在工具服务端里&lt;/strong&gt;，用户只是按步骤操作。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五bin-选择不是随便什么卡都行"&gt;五、BIN 选择——不是随便什么卡都行
&lt;/h2&gt;&lt;p&gt;流传的步骤里特别强调了两个 BIN：&lt;code&gt;523686&lt;/code&gt;（Mastercard）和 &lt;code&gt;4513&lt;/code&gt;（Visa）。这不是随便挑的。&lt;/p&gt;
&lt;h3 id="bin-在支付流中的角色"&gt;BIN 在支付流中的角色
&lt;/h3&gt;&lt;p&gt;BIN（Bank Identification Number）是卡号的前 6-8 位，编码了发卡行、卡网络、卡类型和发行国等信息。Stripe 在收到卡号的前 6 位时就能确定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;523686 → Mastercard / Philippines / Credit / 某发卡行
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个信息会被写入 &lt;code&gt;payment_method.card.country&lt;/code&gt;，并在整个支付流中传播。&lt;/p&gt;
&lt;h3 id="为什么必须是-ph-bin"&gt;为什么必须是 PH BIN？
&lt;/h3&gt;&lt;p&gt;PH BIN 的作用不是&amp;quot;触发一个空的价格表&amp;quot;——PH 价格表是存在的（约 ₱990/月）。&lt;/p&gt;
&lt;p&gt;更可能的解释是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;货币匹配&lt;/strong&gt;：如果工具创建的 Checkout Session 指定了 &lt;code&gt;currency: &amp;quot;php&amp;quot;&lt;/code&gt;，那么 PH 发行的卡才能让 Stripe 的 currency-card 一致性检查通过。US 卡 + PHP 货币会触发额外的风控审查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风控绕过&lt;/strong&gt;：OpenAI/Stripe 的风控系统可能对&amp;quot;card country = PH + checkout currency = PHP&amp;quot;这个组合判定为&amp;quot;正常的本地交易&amp;quot;，不会触发跨境支付的额外校验。而如果用 JP 卡或 US 卡来付一笔 0 PHP 的订单，风控更容易拦截。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AVS 绕过&lt;/strong&gt;：PH 卡不走 Stripe 的 AVS 地址校验，所以填什么地址都行——这降低了被拒的概率。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;523686 和 4513 是经过实测确认能被 Stripe 正确识别为 &lt;code&gt;card.country = &amp;quot;PH&amp;quot;&lt;/code&gt; 的 BIN 段。不是所有 PH BIN 都行，因为某些 BIN 可能已被 OpenAI/Stripe 的风控规则标记或黑名单。&lt;/p&gt;
&lt;h3 id="为什么要填美国账单地址"&gt;为什么要填美国账单地址？
&lt;/h3&gt;&lt;p&gt;这步看起来矛盾——卡是菲律宾的，地址填美国？&lt;/p&gt;
&lt;p&gt;原因是 Stripe 的 AVS（Address Verification Service）只对美国和英国的卡做地址校验。PH 卡不走 AVS，所以你填什么地址都无所谓——但如果你填 PH 地址，可能触发 OpenAI 的额外风控逻辑。填 US 地址是为了&amp;quot;看起来正常&amp;quot;，降低被风控拦截的概率。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六从防御视角看openai-需要修什么"&gt;六、从防御视角看——OpenAI 需要修什么
&lt;/h2&gt;&lt;p&gt;不管具体是哪种假说成立，防御原则是通用的。&lt;/p&gt;
&lt;h3 id="修复方案从简单到全面"&gt;修复方案（从简单到全面）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Level 1：Checkout Session 金额校验&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_checkout_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolve_country&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;free&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Zero-amount checkout for paid plan&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;付费产品金额为 0 时直接拒绝创建 session。这应该是支付系统的基本不变量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Level 3：区域一致性校验&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve_country&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;registration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;billing_country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# JP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;session_ip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;geoip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_ip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# US&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;card_bin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 创建 session 时还不知道&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 如果注册地和 session IP 不一致，以注册地为准&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 不让 card BIN 覆盖定价区域&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;registration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;定价的 country 由一个确定性函数决定，不受 card BIN 影响。Card BIN 的 country 只用于风控信号，不参与定价。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Level 4：Webhook 后置校验&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_checkout_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount_total&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;subscription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 0 元订阅？不对劲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subscription&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Zero-amount subscription detected&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即使 Checkout Session 创建时金额为 0，在 &lt;code&gt;checkout.session.completed&lt;/code&gt; webhook 里也要做最终校验。这是最后一道防线。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七这个漏洞和之前的几个有什么关系"&gt;七、这个漏洞和之前的几个有什么关系？
&lt;/h2&gt;&lt;p&gt;放在一起看，这几个月被扒出来的 ChatGPT/Claude 支付漏洞其实形成了一个谱系：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;漏洞&lt;/th&gt;
 &lt;th&gt;攻击层&lt;/th&gt;
 &lt;th&gt;改了什么&lt;/th&gt;
 &lt;th&gt;核心缺陷&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/google-play-ccmax-proration-vulnerability-2026/" target="_blank" rel="noopener"
 &gt;prorationMode Hook&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;客户端内存&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;putInt&lt;/code&gt; 的一个参数&lt;/td&gt;
 &lt;td&gt;Google Play 信任客户端传入的升级策略&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/claude-cassia-mock-payment-bypass-analysis/" target="_blank" rel="noopener"
 &gt;焚决 (cassia)&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;HTTP 响应&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;checkout_flow&lt;/code&gt; 字段&lt;/td&gt;
 &lt;td&gt;前端根据 API 响应选择支付通道，后端不校验&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-exploit-revenuecat-vulnerability/" target="_blank" rel="noopener"
 &gt;RevenueCat 转移&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;聚合器 API&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;is_restore&lt;/code&gt; + &lt;code&gt;app_user_id&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;匿名购买 + restore 归属无限转移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-exploit-revenuecat-vulnerability/" target="_blank" rel="noopener"
 &gt;API 响应注入&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;HTTP 响应&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;eligible_promo_campaigns&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;优惠码资格校验仅在前端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;0 PHP 跨区&lt;/strong&gt; (本文)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;定价系统&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;区域信号 + 工具注入&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;跨区歧义打开异常路径 + checkout 参数校验缺失&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意到了吗？攻击层在不断&amp;quot;上移&amp;quot;。&lt;/p&gt;
&lt;p&gt;早期的漏洞需要 Root、需要 Frida、需要改代码——门槛不低。焚决降到了一个油猴脚本的水平。而 0 PHP 攻击&lt;strong&gt;连脚本都不需要&lt;/strong&gt;——纯操作流程，任何人都能复现。&lt;/p&gt;
&lt;p&gt;从攻击者的角度看，这是一个自然演进：&lt;strong&gt;当客户端层的防御越来越强（代码混淆、完整性校验、证书绑定），攻击者就会转向更高层——业务逻辑层、定价系统层、区域路由层。&lt;/strong&gt; 这些层的防御往往更薄弱，因为它们不像&amp;quot;加密&amp;quot;“签名&amp;quot;那样有明确的安全框架，它们是业务系统的一部分，安全评审时容易被忽略。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="八更通用的攻击模式区域信号碎片化"&gt;八、更通用的攻击模式——“区域信号碎片化”
&lt;/h2&gt;&lt;p&gt;0 PHP 攻击其实揭示了一个通用的攻击模式，我把它叫做**“区域信号碎片化攻击”（Region Signal Fragmentation）**。&lt;/p&gt;
&lt;h3 id="攻击模型"&gt;攻击模型
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;victim_system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pricing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;registration_country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;攻击者控制（注册时选择&lt;/span&gt; &lt;span class="n"&gt;VPN&lt;/span&gt; &lt;span class="err"&gt;节点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;session_ip_country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;攻击者控制（登录时选择&lt;/span&gt; &lt;span class="n"&gt;VPN&lt;/span&gt; &lt;span class="err"&gt;节点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal_3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;card_bin_country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;攻击者控制（选择特定&lt;/span&gt; &lt;span class="n"&gt;BIN&lt;/span&gt; &lt;span class="err"&gt;的卡）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal_4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;browser_locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;攻击者控制（浏览器设置）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal_5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;billing_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;攻击者控制（表单填写）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所有五个信号都由攻击者完全控制。如果 &lt;code&gt;resolve()&lt;/code&gt; 函数对歧义输入的处理不当——比如进入异常分支后放松了参数校验，或者 fallback 逻辑允许客户端覆盖定价——攻击者就能把定价推入非预期状态。&lt;/p&gt;
&lt;h3 id="防御原则"&gt;防御原则
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原则一：定价权归一&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pricing_country = user.billing_country // 只有一个来源，注册时确定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// card BIN、IP、locale 都不参与定价决策
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// 只作为风控辅助信号
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原则二：Checkout 参数不可客户端覆盖&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 服务端决定 price、currency、amount
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 客户端/第三方传入的 discount、coupon、price_override 一律忽略
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 只接受服务端白名单内的 promotion_code，且校验账号资格
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;checkout_session = stripe.checkout.Session.create(
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; line_items=[server_determined_price], # 不接受客户端 price_data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; discounts=[], # 不接受客户端 coupon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端能影响定价 = 攻击面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原则三：零元红线&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if checkout.amount == 0 and plan.type == &amp;#34;paid&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; REJECT() // 无条件拒绝
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;付费产品不可能合法地出现 0 元。这应该是一个硬编码的不变量，不依赖任何业务逻辑。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="九写在最后"&gt;九、写在最后
&lt;/h2&gt;&lt;p&gt;从 prorationMode 到焚决到 RevenueCat 到 0 PHP，每一个漏洞都指向同一个结构性问题：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;当支付系统由多个独立组件（商店、聚合器、定价引擎、checkout 前端、webhook 后端）拼装而成时，组件之间的信任传递就是攻击面。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;prorationMode 的信任传递是&amp;quot;Google Play 信任客户端传入的升级策略”。焚决的信任传递是&amp;quot;前端信任 API 返回的支付通道&amp;quot;。RevenueCat 的信任传递是&amp;quot;聚合器信任 SDK 传入的 app_user_id&amp;quot;。0 PHP 的信任传递是&amp;quot;定价系统信任 card BIN 推断的国家&amp;quot;。&lt;/p&gt;
&lt;p&gt;没有一个单点漏洞，都是&lt;strong&gt;链路上的信任滑坡&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而防御的核心思路也始终一样：&lt;strong&gt;在链路的最末端（服务端 webhook、权益发放点）做最终校验，不信任链路上游传递的任何&amp;quot;结论&amp;quot;，只信任可验证的&amp;quot;事实&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;具体到 0 PHP 这个 case：Stripe &lt;code&gt;checkout.session.completed&lt;/code&gt; 事件里的 &lt;code&gt;amount_total&lt;/code&gt; 是事实，&lt;code&gt;currency&lt;/code&gt; 是事实。如果一个 ChatGPT Plus 订阅的 &lt;code&gt;amount_total&lt;/code&gt; 是 0——不管前面经历了多少层区域路由和定价查询——&lt;strong&gt;这就不对&lt;/strong&gt;。拦住它。&lt;/p&gt;
&lt;p&gt;这比修价格表更重要。因为价格表总有遗漏，但&amp;quot;付费产品不能 0 元&amp;quot;这条规则没有例外。&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;往期相关&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/google-play-ccmax-proration-vulnerability-2026/" target="_blank" rel="noopener"
 &gt;Google Play 内购 CC Max 漏洞深度拆解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/claude-cassia-mock-payment-bypass-analysis/" target="_blank" rel="noopener"
 &gt;焚决 Claude — 油猴脚本撬开支付大门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-exploit-revenuecat-vulnerability/" target="_blank" rel="noopener"
 &gt;GPT Plus 订阅漏洞 — RevenueCat 凭证转移&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.7qiang.com/posts/gpt-plus-google-play-subscription-transfer/" target="_blank" rel="noopener"
 &gt;GPT Plus 订阅漏洞 — Google Play Billing 鉴权缺失&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;</description></item><item><title>GPT Plus 代充漏洞揭秘 - 一张收据给无数账号开 Plus 的骚操作</title><link>https://blog.7qiang.com/posts/gpt-plus-receipt-vulnerability-2026/</link><pubDate>Thu, 16 Apr 2026 11:45:00 +0000</pubDate><guid>https://blog.7qiang.com/posts/gpt-plus-receipt-vulnerability-2026/</guid><description>&lt;img src="https://blog.7qiang.com/blog-cover-cyber-mask.gif" alt="Featured image of post GPT Plus 代充漏洞揭秘 - 一张收据给无数账号开 Plus 的骚操作" /&gt;&lt;section class="xiaoyao-contact-card" aria-label="联系逍遥"&gt;
 &lt;img class="xiaoyao-contact-card__qr" src="https://blog.7qiang.com/contact-qr.png" width="690" height="690" loading="lazy" decoding="async" alt="逍遥微信二维码"&gt;
 &lt;div class="xiaoyao-contact-card__content"&gt;
 &lt;h3 class="xiaoyao-contact-card__title"&gt;联系逍遥&lt;/h3&gt;
 &lt;p class="xiaoyao-contact-card__description"&gt;扫码添加微信，或点击下方按钮复制联系方式。&lt;/p&gt;
 &lt;div class="xiaoyao-contact-buttons" data-contact-buttons&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--wechat" type="button" data-copy-contact="plus6566" data-copy-label="微信号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;微信&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;plus6566&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--qq" type="button" data-copy-contact="826215906" data-copy-label="QQ 号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;QQ&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;826215906&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;span class="xiaoyao-contact-feedback" role="status" aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;/div&gt;
&lt;/section&gt;

&lt;p&gt;进微信群请联系博主，各位觉得文章对你有帮助的话可否打赏一些呀~&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 时效性提醒（2026-07 更新）&lt;/strong&gt;：本文发布于 2026 年 4 月，距今已过去 3 个月。iOS 收据复用漏洞据反馈已被 OpenAI 部分修复，&lt;strong&gt;当前可用性存疑&lt;/strong&gt;。本文保留仅供安全研究与技术原理学习参考。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;兄弟们，今天来扒一个超级劲爆的漏洞——&lt;strong&gt;GPT Plus 代充背后的秘密&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;你是不是经常在闲鱼上看到二三十块钱一个月的 GPT Plus 代充？是不是好奇人家咋做到的？今天我就把这个漏洞给你扒得明明白白！&lt;/p&gt;
&lt;p&gt;先说好啊，&lt;strong&gt;本文仅供技术交流&lt;/strong&gt;，任何实际操作产生的账号封禁、法律风险，自行承担！别怪我没提醒你~&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="原理openai-验票机制的重大漏洞"&gt;原理：OpenAI 验票机制的重大漏洞
&lt;/h2&gt;&lt;h3 id="正常流程是啥样的"&gt;正常流程是啥样的？
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你 iPhone 上点付款
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;App Store 扣钱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Apple 把收据扔到你手机本地
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ChatGPT App 捡起收据
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;App 把收据和你当前登录的账号 token 一起打包发给 OpenAI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenAI 验一下收据真假
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;给你账号开 Plus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看起来挺严谨对吧？&lt;strong&gt;屁！&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="漏洞在哪"&gt;漏洞在哪？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;OpenAI 验票的时候，根本不看这张收据是你 Apple ID 买的，还是隔壁老王 Apple ID 买的！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它只看两样东西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;收据合不合法&lt;/li&gt;
&lt;li&gt;你传过来的 ChatGPT auth token 是不是活的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;说白了&lt;/strong&gt;：什么 Apple ID 绑定、什么账号对应关系，全！不！查！&lt;/p&gt;
&lt;p&gt;这就好比你拿着别人的购物小票去柜台领东西，柜员只看小票真假，不看你身份证…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;收据合法 + token 有效 = 任意账号变 Plus&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="漏洞利用全流程"&gt;漏洞利用全流程
&lt;/h2&gt;&lt;h3 id="第一步搞一个土耳其区-apple-id"&gt;第一步：搞一个土耳其区 Apple ID
&lt;/h3&gt;&lt;p&gt;为啥是土耳其？因为&lt;strong&gt;便宜&lt;/strong&gt;啊！&lt;/p&gt;
&lt;p&gt;土耳其区 Plus 标价 499 里拉一个月，折人民币大概&lt;strong&gt;八十五块&lt;/strong&gt;。国内定价多少？一百四五！差价自己算~&lt;/p&gt;
&lt;p&gt;往这个土区 Apple ID 里充好礼品卡，钱备足。&lt;/p&gt;
&lt;h3 id="第二步拦截收据"&gt;第二步：拦截收据
&lt;/h3&gt;&lt;p&gt;在你 iPhone 上打开 ChatGPT App，&lt;strong&gt;别登录你想开 Plus 的目标账号&lt;/strong&gt;，随便登个临时号或者干脆不登。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心操作&lt;/strong&gt;：内购付款之前，配置网络拦截——阻止 ChatGPT App 把收据发给 OpenAI 服务器。&lt;/p&gt;
&lt;p&gt;App Store 那边照样扣钱，Apple 照样把收据扔到你手机本地沙盒目录里。但因为你的拦截，这张收据没自动飞向 OpenAI，而是老老实实待在本地等你来拿。&lt;/p&gt;
&lt;h3 id="第三步导出收据"&gt;第三步：导出收据
&lt;/h3&gt;&lt;p&gt;导出收据通常需越狱设备或利用系统漏洞。实际主流玩法有三种：&lt;/p&gt;
&lt;h4 id="方法-a端点本地映射"&gt;方法 A：端点本地映射
&lt;/h4&gt;&lt;p&gt;用 DNS 劫持或本地代理，把 ChatGPT App 发往 OpenAI 的请求重定向到你自己的本地服务器。请求里本来就带着 Base64 编码的收据，到了你本地，直接保存下来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mitmproxy&lt;/li&gt;
&lt;li&gt;Charles Proxy&lt;/li&gt;
&lt;li&gt;自建 HTTPS 代理加一张自签证书&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不用越狱，门槛低得令人发指。&lt;/p&gt;
&lt;h4 id="方法-b越狱加-hook"&gt;方法 B：越狱加 Hook
&lt;/h4&gt;&lt;p&gt;越狱设备上用 Frida 或者 Flex，直接 hook StoreKit 框架，截下 &lt;code&gt;SKPaymentTransaction&lt;/code&gt; 的 &lt;code&gt;transactionReceipt&lt;/code&gt;，或者读 &lt;code&gt;appStoreReceiptURL&lt;/code&gt; 拿收据文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗暴直接&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="方法-c安卓径用-xposed-hook"&gt;方法 C：安卓径用 Xposed Hook
&lt;/h4&gt;&lt;p&gt;逻辑类似，不细说了。&lt;/p&gt;
&lt;h3 id="第四步api-补单"&gt;第四步：API 补单
&lt;/h3&gt;&lt;p&gt;收据到手，直接往 OpenAI 的订阅接口发请求：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;POST https://chat.openai.com/backend-api/payments/subscribe
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;Content-Type: application/json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;目标账号的 auth token&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;receipt&amp;#34;: &amp;#34;&amp;lt;Base64 编码的 iOS 收据&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;platform&amp;#34;: &amp;#34;ios&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;product_id&amp;#34;: &amp;#34;com.openai.chatgpt.plus&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;device_info&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;model&amp;#34;: &amp;#34;iPhone14,2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;os_version&amp;#34;: &amp;#34;17.0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;timezone&amp;#34;: &amp;#34;Asia/Shanghai&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：这里的 auth token 是目标用户给你的登录令牌，权限有限，有效期短。你给他充完 Plus，他立刻改密码，你拿着这张收据去充下一个。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="骚操作来了"&gt;骚操作来了！
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一张土耳其收据八十五块人民币成本，能给无数个账号开 Plus！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;闲鱼上那些二三十块钱一个月的 GPT Plus 代充，就是这么来的。你以为人家做慈善？人家是&lt;strong&gt;拿一张票反复上车&lt;/strong&gt;！&lt;/p&gt;
&lt;h3 id="成本计算"&gt;成本计算
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;项目&lt;/th&gt;
 &lt;th&gt;成本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;土耳其区 Apple ID&lt;/td&gt;
 &lt;td&gt;免费（自己注册）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单张收据成本&lt;/td&gt;
 &lt;td&gt;¥85&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;可开通账号数&lt;/td&gt;
 &lt;td&gt;∞（理论无限）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单账号成本&lt;/td&gt;
 &lt;td&gt;趋近于 0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;这利润空间…啧啧啧&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为啥-openai-不修复"&gt;为啥 OpenAI 不修复？
&lt;/h2&gt;&lt;p&gt;很多人会问：这么大的漏洞，OpenAI 为啥不补？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真相&lt;/strong&gt;：不是补不了，是&lt;strong&gt;优先级不够&lt;/strong&gt;，或者说，他们根本不在乎这点订阅收入的漏洞。&lt;/p&gt;
&lt;p&gt;毕竟大头在企业 API 那边，个人订阅那点钱，对 OpenAI 来说就是毛毛雨~&lt;/p&gt;
&lt;p&gt;而且这个漏洞还有个特点：&lt;strong&gt;需要 iOS 设备 + 网络拦截能力&lt;/strong&gt;，门槛其实不低。普通用户根本玩不转，所以影响范围有限。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="风险提示"&gt;风险提示
&lt;/h2&gt;&lt;p&gt;⚠️ &lt;strong&gt;重要提醒&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;账号风险&lt;/strong&gt;：用这种方式开通的 Plus 账号，随时可能被 OpenAI 封禁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法律风险&lt;/strong&gt;：在某些地区可能涉及欺诈行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;道德风险&lt;/strong&gt;：本质上是利用漏洞薅羊毛&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;本文仅供技术交流，请勿用于非法用途！&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="如何防范"&gt;如何防范？
&lt;/h2&gt;&lt;h3 id="对于-openai"&gt;对于 OpenAI
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;验证收据与 Apple ID 的绑定关系&lt;/li&gt;
&lt;li&gt;限制单张收据的使用次数&lt;/li&gt;
&lt;li&gt;增加设备指纹验证&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="对于用户"&gt;对于用户
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;走官方渠道购买 Plus&lt;/li&gt;
&lt;li&gt;不要贪便宜买低价代充&lt;/li&gt;
&lt;li&gt;定期检查账号状态&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;这个漏洞的本质是&lt;strong&gt;OpenAI 在收据验证环节偷懒了&lt;/strong&gt;，只验证收据真假，不验证收据与账号的对应关系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术要点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;土耳其区 Apple ID（便宜）&lt;/li&gt;
&lt;li&gt;网络拦截（mitmproxy/Charles）&lt;/li&gt;
&lt;li&gt;收据导出（越狱/Hook）&lt;/li&gt;
&lt;li&gt;API 补单（重复使用收据）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;最后再说一遍&lt;/strong&gt;：本文仅供技术交流，请勿用于非法用途！想稳定用 Plus，还是走官方渠道吧~&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;觉得有用？别忘了分享给更多需要的朋友！👍&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;关注我，下期继续扒更多有趣的技术漏洞~&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>