泰国的高效 API 渗透测试
目录
应用程序早在几年前就不再是"网站"了。它们现在是 API:微服务调用微服务,一端是移动客户端,另一端是支付通道。而安全对话还没有完全跟上。团队仍然在购买"Web 应用渗透测试",把 80% 的精力花在前端,而背后的 API,资金和数据真正流动的地方,却测试不足。
为什么 API 能绕过扫描器 #
自动化 Web 扫描器围绕"页面模型"构建:爬链接、找表单、注入载荷。API 不呈现页面,它呈现的是路由、方法和模式,而有趣的行为恰恰存在于它们之间的业务逻辑里。
设想一个对象级访问缺陷:用户把请求中的 user_id=1024 改成 user_id=1025,就读到了别人的记录。没有签名告警,没有恶意载荷。扫描器看到一个正常请求便继续前行。这就是失效的对象级授权(BOLA),OWASP API Security Top 10 榜单上的第一名,而几乎所有的自动化工具都对它视而不见。
这正是人工主导 API 测试的核心论据:破坏性最大的缺陷是设计缺陷,而发现设计缺陷需要一位理解业务上下文的分析师。
一次有效的 API 测试究竟覆盖什么 #
有意义的 API 评估远不止对着 OpenAPI 规范跑一遍扫描器:
- 认证与授权:令牌处理、权限范围检查,以及跨越每个角色边界的对象级访问。
- 业务逻辑:用户能否给订单设置负价格、重放支付回调,或者直接调用下一个端点跳过工作流步骤?
- 数据暴露:哪些端点返回了过多字段?哪些端点接受客户端本不该发送的字段?
- 限流与滥用:枚举、撞库,以及利用薄弱限流实现的账户接管路径。
- 集成边界:webhook、第三方回调、消息队列:这些地方往往默认信任,从未验证。
正因如此,最好的项目会把人工攻击技术与 AI 辅助侦察和模糊测试结合起来:自动化扩展覆盖面,人来判断严重性和上下文。
持续进行,而非一年一次 #
一年一次的 API 测试,是对一个每周都在部署的系统的时点快照。报告写完的时候,端点早就变了。现代做法是把 API 安全检查融入交付流水线:
- 左移:在 CI 中加入静态分析和模式校验。
- 按发布测试:每当 API 面发生变化时做聚焦审查。
- 年度深检:为满足审计留痕以及流水线无法判断的业务逻辑,做一次完整的、人工主导的评估。
对于接触卡数据的组织, PCI DSS 要求 6 和要求 11.4 都指向这个方向,而泰国央行的数字渠道安全指引同样如此。
自动化扫描器看不见的东西 #
值得具体说清楚自动化到底错过了什么,因为这些缺口并不是随机分布:它们恰好聚集在资金流动的地方。
实践中的 BOLA。 扫描器只测试它发现的端点和它理解的参数。拿一个发票 API 来说:GET /invoices/8842 返回调用者自己的发票,扫描器记一次通过。但 GET /invoices/8843:另一个客户的发票:可能同样顺利返回,而没有任何扫描器会去尝试,因为要理解 8843 属于别人,必须知道所有权在你的业务里意味着什么。每一个跨过租户边界的对象标识符都是潜在 BOLA,只有逐个账户枚举对象的分析师才能找到它们。
业务逻辑缺陷。 扫描器测试请求成功还是失败;逻辑缺陷藏在那些本不该成功却成功了的请求里。真实案例来自实际项目:优惠券可以重复使用,因为核销校验发生在支付捕获之后;两个账号之间转移预订却不需要重新授权;已发货的已付款订单可以被取消,因为取消端点从不检查履约状态。每一个都返回 HTTP 200。每一个都是没有任何报错信息的资金损失。
服务间的信任假设。 在微服务体系里,一个服务通常会信任调用方提交的 header、token 或内部端点,因为设计图上调用方永远是内部服务。然后某一天,一个服务被攻陷,或某个内部端点从信任等级更低的网段变得可达,这些继承下来的信任假设就成了攻击者的梯子:先在薄弱的边缘服务上完成认证,再把它的身份一路递给下游那些真正值钱的 API。发现这类问题需要既按设计师的本意理解架构,又按攻击者的路径去测试它。
这三样东西都不会出现在扫描器输出里。它们只会出现在花时间理解了你的 API 到底用来做什么的分析师写的报告里。
我们的 API 与应用安全审查将人工源代码分析与情境化的渗透测试相结合,交付开发人员可以直接使用的修复指导。如果你需要的是对边界和分段的更广泛验证,请参阅人工主导渗透测试。