用途
该技能用于在获得目标系统所有者明确书面授权的安全评估或漏洞赏金任务中,针对金融科技类 GraphQL 后端排查资金流转相关漏洞。它是通用 GraphQL 测试技能(hunt-graphql)的垂直场景扩展,只补充金融特有的风险增量,前提是先完成 schema 发现与 introspection。
安全边界(强制确认闸门)
该技能仅限教育用途或授权安全评估。任何探测、利用、变更、持久化、数据提取或凭据访问类命令执行之前,必须先:
- 让用户说明确切的目标 URL、IP、账户或资源;
- 让用户确认书面授权及允许范围;
- 展示将执行的确切命令并解释预期效果;
- 在当前对话中等待显式确认。
没有确认时保持只读,仅提供防御性指导。建议在沙箱、一次性虚拟机或受控实验环境中操作。使用合成账户与非结算的沙箱余额;真实转账、结算、KYC 采集及高频/竞态流量需要所有者批准的金额、请求上限、停止条件和恢复方案;常规赏金范围不自动包含这些权限。
主要能力与测试重点
金融科技 GraphQL 的爆炸半径不同于普通 SaaS:同样的 resolver 缺陷在 SaaS 中只是数据泄露,在账本 mutation 中可能直接挪动资金。该技能围绕三个特性展开:
- 资金变动 mutation 的账本原子性:一次 transferFunds、redeemRewards、withdrawToBank 可能触发借、贷、手续费多笔账本写入,需要原子完成。GraphQL 灵活的输入结构与 alias 批处理容易使这些写入失步。
- Decimal/Money 标量作为攻击面:金额、汇率、利息、积分通常以 Float、String 或自定义 Decimal/Money 标量传入,resolver 的解析与舍入方式本身可被利用。
- KYC/PII 字段与常规字段同类型共存:User/Account 类型常同时暴露 ssnLast4、routingNumber、kycStatus、governmentIdUrl 与 displayName、email,一处字段级授权缺失会扩散到所有触及该类型的查询。
攻击面信号
- URL/命名:/graphql/ledger、/graphql/payments、/api/wallet/graphql、/internal/ledger-graphql、/banking/graphql 等。
- 字段/类型名:balance、availableBalance、pendingBalance、ledgerEntry、transferFunds、withdraw、redeem、topUp、reverseTransaction、adjustBalance、kycStatus、ssnLast4、routingNumber、accountNumber、governmentIdUrl、quoteExchangeRate、interestAccrued、rewardsPoints、portfolioValue、idempotencyKey、clientMutationId。
- 技术栈特征:Plaid/Stripe/Dwolla/Marqeta 封装在内部 GraphQL 网关后(bankLink、plaidLinkToken);Apollo Federation 含独立 ledger/payments 子图,检查子图 introspection 是否可直接访问、绕过网关拼接后的 schema;schema 中的自定义 Money/Decimal/BigDecimal 标量,其解析器值得直接模糊测试。
使用方式(测试方法概要)
- 先运行 hunt-graphql 的发现与 introspection 方法获取 schema。
- 映射所有直接或间接触及余额的 mutation,包括 redeemRewards、applyCoupon、upgradeTier、closeAccount(常退还余额)、disputeTransaction(常临时入账)。
- 识别每类资金 mutation 的账本写入形态:一次调用产生一笔还是多笔条目;多笔写入是竞态测试的重点。
- 测试幂等键处理:用相同 idempotencyKey/clientMutationId 连发两次并加延迟,第二次仍产生账本写入说明服务端未强制幂等。两次响应/ID 本身不是证据,需对比沙箱账本实际效果及文档化的幂等键作用域与有效期。
- 测试金额精度边界:如 0.001(截断 vs 舍入,重复 N 次观察余额漂移)、9999999999999999.99(溢出)、1e2��科学计数法导致标量解析回退到原生 float)、-50.00(负数符号是否服务端信任客户端)。确认服务端舍入与客户端显示一致。
- 探测跨账户 IDOR,重点测试资金 mutation 是否校验源账户属于当前调用者(不仅校验目标账户存在)。资金流出的授权检查容易被遗漏,而流入侧常被正确实现。
- 从各个返回共享 User/Account 类型的上下文查询 KYC/PII 字段,检查字段级授权;嵌套在 transaction { counterparty { ssnLast4 } } 中的 PII 是常见缺失点。
- 检查管理级 mutation 是否可通过 mass assignment 触达,例如普通用户可传入 status 或 override 字段。
- 测试货币参数一致性:发送 UI 不会生成的 sourceCurrency/targetCurrency 组合,检查 FX 汇率查询与账本写入是否使用同一汇率(TOCTOU 套利)。
- 将 alias 批处理与资金 mutation 结合测试双花;GraphQL 规范下顶层 mutation 字段串行执行,多个 alias 成功可说明缺少单次使用校验/幂等,但不单独证明并发;进一步结合并行 HTTP 或单包攻击(参见 hunt-race-condition)确认双花影响。
常见根因
- 仅客户端校验金额/手续费,resolver 信任客户端发送值。
- 多条目账本写入非原子,借、贷、手续费分多条顺序语句执行,形成竞态窗口。
- Money/Decimal 标量在边界输入(科学计数法、超长字符串)下回退到原生 float 解析,重新引入浮点舍入误差。
- 幂等键被存储但执行写入前从未校验,仅用于日志/调试。
- 字段级授权按顶层查询实现而非按类型实现,同一类型嵌套返回时失去保护。
- 源账户归属校验缺失而目标账户存在性校验存在。
- 管理/内部 mutation 复用公共 mutation 输入类型,resolver 层未对非管理员剥离额外字段。
证据门槛(Gate 0)
- 是否真实发生账本写入并可展示?查询前后余额,状态变化才是证据,而非仅 200/success 响应体。
- 是否确定性复现而非时序偶然?竞态/双花结论应从干净状态复现两次;只在特定负载下成立时如实记录窗口。
- 是否真正移动了攻击者本没有的价值,或泄露了不应见的数据?格式错误的 Money 标量导致 verbose 报错属信息泄露类,不应混入金融逻辑类报告。
适用场景
已获得目标书面授权,且任务属于漏洞赏金或渗透测试约定范围内的金融科技 GraphQL 接口评估;需要上述侦察、利用或验证工作流并在批准范围内严格执行时使用。
限制
- 仅限授权范围:任何探测、利用或凭据访问命令前必须通过上述确认闸门。
- 仅文档导入:上游辅助脚本、命令、引擎和研究资产未打包,需要时从源码仓库重新安装工具。
- 报告前须按 triage-validation 验证每个发现,并通过 report-writing 提交;优先在沙箱、一次性虚拟机或受控实验环境中操作。
- 真实账户号与余额不得逐字纳入证据,需按 evidence-hygiene 做脱敏。
相关技能链
hunt-graphql(父技能,先加载)、hunt-business-logic、hunt-race-condition、hunt-api-misconfig、hunt-idor、evidence-hygiene、triage-validation。
示例
# 只读第一步;任何主动操作前先确认范围。
cat scope.txt # 来自授权任务简报的目标列表
该技能改编自 elementalsouls/Claude-BugHunter(MIT),为上游合规补充了 frontmatter、适用与限制及安全边界;仅文档导入,可执行辅助工具、命令、引擎和研究资产未打包。