mcpField
H
hunt-broken-function-level-auth

hunt-broken-function-level-auth

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

关于 hunt-broken-function-level-auth

hunt-broken-function-level-auth 是用于发现功能级授权缺陷的安全测试技能,关注低权限用户调用受限操作的情况。它涵盖 HTTP 方法漂移、影子路由、功能标志、批处理端点及不同传输协议间的差异。

主要功能

  1. 01HTTP 方法授权检查
  2. 02旧式与影子路由测试
  3. 03功能标志端点检查
  4. 04批处理与作业端点探测
  5. 05跨协议授权对比

适用场景

  1. 01使用其他 HTTP 方法测试管理操作
  2. 02检查弃用路由的访问控制缺口
  3. 03比较 GraphQL 或 WebSocket 与 REST 的授权

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/uphiago/recon-skills --skill hunt-broken-function-level-auth

安装后在 Claude Code 中输入/hunt-broken-function-level-auth确认已加载。

详细介绍

功能级授权失效

查找那些在控制器/中间件层强制执行授权,但可通过 HTTP 方法漂移、旧版路由、影子端点或传输协议不一致绕过授权的端点。与 IDOR(对象级)不同,此问题针对操作级授权——用户能否在没有管理员角色的情况下调用管理员功能。

适用场景

  • API 设有不同用户角色(管理员、版主、用户),但角色检查是在控制器级别而非方法级别进行的。
  • 更新后的中间件后面仍在提供旧版或已弃用的端点。
  • 除 REST API 外,还提供 GraphQL、gRPC 和 WebSocket 传输方式,但授权规则不一致。
  • 功能标志或 Beta 端点在安全审查前就暴露了功能。
  • 批处理/作业端点接受内部请求,却不验证角色。

快速检测

# Verb drift: try PUT/DELETE on endpoints that return 403 on GET
for method in GET POST PUT PATCH DELETE OPTIONS; do
  curl --max-time 30 --connect-timeout 10 -sk -X "$method" "https://target.com/api/admin/users" -w "$method %{http_code}\n" -o /dev/null
done

流程

阶段 1 — HTTP 方法漂移
# Admin endpoints — each HTTP method may have different auth
ENDPOINTS=(
  "/api/admin/users"
  "/api/admin/settings"
  "/api/manage/orders"
  "/api/internal/config"
)

for ep in "${ENDPOINTS[@]}"; do
  for method in GET POST PUT PATCH DELETE; do
    curl --max-time 30 --connect-timeout 10 -sk -X "$method" "https://target.com$ep" \
      -w "$method $ep — %{http_code}\n" -o /dev/null
  done
  # Also try custom methods
  curl --max-time 30 --connect-timeout 10 -sk -X "PURGE" "https://target.com$ep" -o /dev/null -w "PURGE — %{http_code}\n"
  curl --max-time 30 --connect-timeout 10 -sk -X "DEBUG" "https://target.com$ep" -o /dev/null -w "DEBUG — %{http_code}\n"
done
阶段 2 — 路由影射
# Legacy routes that bypass modern middleware
for path in "/api/v0/" "/api/v1/" "/api/legacy/" "/api/internal/" "/api/beta/" \
            "/api/mobile/" "/api/partner/" "/api/integration/" "/api/webhook/"; do
  curl --max-time 30 --connect-timeout 10 -sk "https://target.com${path}users" -w "%{http_code} — $path\n" -o /dev/null
done

# ffuf for route discovery
ffuf -u "https://target.com/api/FUZZ/users" \
  -w /path/to/prefixes.txt \
  -mc 200,301,401,403
阶段 3 — 功能标志绕过
# Beta/preview endpoints often lack authorization
for flag in "beta" "preview" "canary" "experimental" "new" "v2" "preview"; do
  curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/${flag}/admin" -w "%{http_code} — $flag\n" -o /dev/null
done

# Feature flags in headers or cookies
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/admin/users" \
  -H "X-Feature-Flags: admin" \
  -H "X-Experimental: true" \
  -H "X-Beta-Access: 1"
阶段 4 — 批处理与作业端点
# Batch operations may skip per-item authorization
curl --max-time 30 --connect-timeout 10 -sk -X POST "https://target.com/api/batch" \
  -H "Content-Type: application/json" \
  -d '{"operations":[{"method":"DELETE","path":"/users/1"},{"method":"GET","path":"/admin/logs"}]}'

# Background job endpoints
for path in "/api/jobs" "/api/tasks" "/api/cron" "/api/queue" "/api/workers"; do
  curl --max-time 30 --connect-timeout 10 -sk "https://target.com${path}/admin-cleanup" -w "%{http_code} — $path\n" -o /dev/null
done
阶段 5 — 传输协议不一致
# GraphQL — check if mutations allow admin actions without role check
curl --max-time 30 --connect-timeout 10 -sk -X POST "https://target.com/graphql" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation { deleteUser(id: 1) { success } }"}'

# WebSocket — actions sent over WS may skip REST middleware
# Test via wscat
echo '{"type":"DELETE_USER","payload":{"userId":1}}' | wscat -c "wss://target.com/ws"

# gRPC — reflection may expose admin methods
grpcurl -plaintext target.com:50051 list
grpcurl -plaintext target.com:50051 admin.UserService/DeleteUser
阶段 6 — Content-Type 中间件缺口
# Different content types may hit different parsers/middleware
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/admin/users" \
  -H "Accept: application/xml" \
  -H "Content-Type: application/xml" \
  -d '<user><name>test</name></user>'

curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/admin/users" \
  -H "Content-Type: multipart/form-data" \
  -F "name=test"

注意事项

  • 405 Method Not Allowed ≠ 没有授权问题。 必须存在该方法,且缺少授权检查,才构成发现。
  • 路由影射要求影子端点能够接受经过身份验证的请求。 公开的用户信息端点不构成发现。
  • 面向消费者的 mutation 上的 GraphQL deleteUser 属于 IDOR,而非 BFLA。 BFLA 关注操作级权限,而非对象所有权。
  • WebSocket 授权绕过需要证明 WS 处理程序跳过了 REST 中间件检查。 比较同一操作在 WS 与 REST 中的表现。

验证

  1. 低权限用户通过未受保护的 HTTP 方法、影子路由或传输协议调用仅限管理员执行的操作。
  2. 操作确实成功(不只是返回了不同的错误,而是真的执行了操作)。
  3. 通过标准路径(REST GET/POST)执行同一操作时,会正确返回 403。
  4. 记录绕过授权的具体方法、端点和传输协议。

相关技能

  • hunt-idor — 对象级授权(访问其他用户的数据)。
  • hunt-auth-bypass — 完全绕过身份验证的模式。
  • hunt-api-misconfig — API 级配置错误,包括传输缺口。

评论

支持 Markdown