name: auth-comprehensive
description: 认证安全综合检测 — 综合检测认证体系安全风险:弱口令/明文传输/用户名枚举/认证绕过/会话管理/验证码重用。
when-to-use: 当需要对目标系统的登录认证、会话管理、验证码机制进行全面安全评估时
allowed-tools: read_file,list_files,rg,bash,list_skills
user-invocable: false
argument-hint: ""
arguments:
- target_url
认证安全综合检测
成因引用
认证综合缺陷成因:source(登录请求 / 注册请求 / 密码找回请求 / OTP 提交 / 会话刷新请求)→ sink(认证流程的多个环节:密码校验逻辑、会话签发与轮换、密码找回链路、多因素校验、CAPTCHA 校验、用户名响应差异)。任一环节缺校验、可枚举、可暴破或会话状态被复用,都会让认证体系整体强度下降到最弱环节的水平。详见同根目录 pentest/web-security-testing/SKILL.md 漏洞成因图谱 · 认证综合缺陷 / 会话固定行(不在本 skill 重复成因)。
关键 sink 形态:认证不是单点,是一条流程。每个登录入口(主登录 / SSO 回调 / 第三方登录 / 管理后台独立登录 / API token 签发)+ 每个状态变更(注册 / 找回 / OTP / 会话刷新 / 注销)都是独立 sink。
触发线索(基线检查项)
以下是已知的常见认证触发线索,作为基线起点而非必检硬清单:
- 适用且已完成 → 标注
[x] done - 明确不适用 → 标注
[-] n/a (原因) - 基线未列出但实际发现 → 新增条目并标注
[+] added (来源)
基线触发线索按 "sink 语义" 分类(不按业务命名):
登录入口类(每个独立结账):
- 主登录端点(用户名 / 邮箱 / 手机号)
- 第三方 SSO 回调(OAuth / OIDC / SAML callback)
- 管理后台 / 内部系统独立登录入口(通常路径与主站不同)
- 移动端 / API 专用登录(如
/api/v1/auth/login与 web/login可能不同实现) - API token / 凭证签发端点
状态变更类(每个独立结账):
- 注册端点(用户名重复检查 / 验证码发送)
- 密码找回流程(请求重置 → 校验 token → 重置密码 全链路)
- OTP / 多因素校验端点
- 会话刷新 / token 续期端点
- 注销端点(验证旧会话失效)
响应特征 / 配置线索:
- 登录失败响应区分"用户不存在"与"密码错误"(用户名枚举信号)
- 登录请求走 HTTP 而非 HTTPS(明文传输信号)
- 登录页 HTML form 的 password 字段无 HTTPS 提交(明文传输信号)
- 登录成功后
Set-Cookie是否轮换 SESSION ID(会话固定信号) - 错误响应耗时差异(响应时间侧信道枚举)
- 注册 / 找回 / 登录均无 CAPTCHA 或验证码可复用(暴破 / 撞库信号)
- 密码字段类型为
password仅防 shoulder surfing 不防传输
思考检查点
加载本 skill 时按这些问题思考:
- 是否枚举了所有登录入口?除主登录外,SSO 回调、管理后台、API 登录、移动端登录都需独立测
- "登录失败"提示是否在文案 / 错误码 / 状态码 / 响应时间 / 响应大小上能区分用户存在与否?时间侧信道也是枚举手段
- 密码字段是否真在 HTTPS 链路传输?或存在 HTTP 入口 / 降级跳转 / 混合内容
- 登录成功前后的 SESSION ID 是否轮换?登出后旧 SESSION 是否真在服务端失效(而非前端清 cookie)?
- 找回流程:重置 token 是否可预测、是否一次性、是否绑定账号、邮件链接是否含敏感参数(如直接含新密码)
- OTP / 验证码:首次校验通过后是否立即作废,是否绑定 nonce / 场景 / 账号;同一码是否能在不同上下文复用
- 多子系统场景:每个子系统的认证栈是不是独立结账?
前置条件与安全边界
- 仅在授权环境测试;仅使用测试账号与测试环境,不复用生产凭证
- 弱口令测试:单目标最多 30 次尝试,串行并发 1,失败指数退避
- 用户名枚举:最小化测试集(存在 1-2 个 + 不存在 1-2 个),最多 12 次请求
- 认证绕过:单接口最多 10 次请求
- 验证码重用:单场景最多 8 次校验请求
- 发现明显锁定 / 风控 / CAPTCHA 出现后立即停止该路径并标记
needs-verification - 不向真实用户发送骚扰邮件 / 短信;找回流程测试用自有测试账号承接
- 不窃取或长期持有真实用户登录态
检测步骤
下列六个维度各自独立执行,但产物按"该子系统的整条认证栈"汇总。
维度一:默认凭证与弱口令
- 发送确定错误凭证建立失败基线(状态码、响应模板)
- 按小规模字典逐条测试默认凭证与高频弱口令(admin/admin、admin/123456、test/test、root/root 等)
- 登录成功后访问受保护资源,确认有效登录态
- 记录防护触发情况(锁定 / 验证码 / 退避)
维度二:明文传输
- 枚举登录入口,记录是否为
http:// - 发送登录请求,检查凭证字段是否在 HTTP 明文通道传输
- HTTPS 入口检查是否存在降级链路(跳转 HTTP / 混合内容 / 代理回落 /
Strict-Transport-Security缺失) - 复核确认凭证确实经明文链路暴露
维度三:用户名枚举
- 构造两组请求:
存在用户名 + 错误密码vs不存在用户名 + 错误密码 - 记录响应状态码、错误消息、响应长度、响应耗时差异
- 在注册 / 找回密码 / 验证码发送接口重复对照
- 复核差异稳定性,排除偶发抖动与风控噪音
维度四:认证绕过
- 发送基线失败请求(随机不存在账号 + 随机密码)
- 构造多组随机凭证重复登录(单接口最多 10 次)
- 检查是否返回 token / session / 跳转登录态页面
- 对疑似成功访问受保护接口验证权限
- 换组随机凭证复核排除单次异常
维度五:会话管理(会话固定与登出失效)
- 访问登录页记录基线会话标识(Cookie / URL 参数)
- 携带基线会话执行登录,比较前后会话标识是否变更
- 执行登出,使用登录期旧会话访问受保护接口
- 尝试预设会话标识并引导登录,验证该会话是否可被复用
维度六:验证码 / OTP 重用
- 获取有效验证码并完成首次校验(基线成功)
- 相同会话 / 参数下重复提交同一验证码
- 新会话或不同请求标识下再次提交同一验证码
- 观察重复提交是否返回成功并产生业务副作用
示例库
正例形态(代码层根因)
- 服务端密码校验前未做账号存在性区分,但错误消息按存在性分支返回(
username-enum-error-msg-auth) - 登录端点
POST http://target/login,凭证经明文 HTTP 传输(plaintext-credentials-http-transport-auth) - 登录成功代码路径中未调用
session.regenerate()/req.session.regenerateId(),会话 ID 在登录前后一致(session-fixation-no-rotate-auth) - OTP 校验成功后未将 OTP 状态置为 used,仅返回成功(
otp-reuse-no-invalidation-auth) - 密码找回 token 使用
md5(time())等可预测算法生成(password-reset-token-predictable-auth)
窄化反例(必须避免)
以下是认证维度的典型窄化误判:
- "已测主登录端点 → 跳过其他登录入口" — 错。常见多入口:邮箱登录 / 手机号登录 / 第三方 SSO 回调 / OAuth callback / 内部管理后台独立登录 / 移动端 API 登录,每个都需独立测。不同登录入口可能挂不同的认证后端、不同的限速策略
- "返回'登录失败'统一文案 → 没有用户名枚举" — 错。错误码 / 错误消息 / 状态码 / 响应长度 / 响应时间组合都可能造成枚举。响应时间侧信道是常见隐性枚举源(密码哈希校验耗时与短路返回的耗时差异)
- "密码字段是 password type → 已加密传输" — 错。HTML password type 只防 shoulder surfing,传输加密看的是 HTTPS。必须独立验证传输层
- "已测了某子系统的弱口令 → 其他子系统也加固了" — 错。跨子系统独立结账:不同子系统可能由不同团队 / 不同时期开发,认证策略可能完全不同
- "登录端点有 CAPTCHA → 已防暴破" — 错。需独立验证:a) CAPTCHA 是否真校验(提交时是否做服务端校验,还是仅前端展示)b) CAPTCHA 是否一次性(会话固定 + 验证码可复用就形同虚设)c) 是否在 N 次失败后才出现 CAPTCHA(仍可在 N-1 次内暴破)
- "登录后看到欢迎页 → 认证绕过未发生" — 错。需访问真受保护资源(用户数据 / 私有 API)并取到真实数据,才证明登录态有效;前端跳转 / 假登录态都可能是中间信号
- "找回流程发了邮件就算 OK" — 错。需检查 reset token 强度、是否绑定账号、是否一次性、是否过期、邮件链接是否含 GET 参数泄露风险(referer 泄露)
- "已测了 web 登录 → 跳过 API 登录" — 错。web 与 API 经常是两套实现,限速 / CAPTCHA / 会话策略可能完全不同
反例义务(必须遵守)
为什么这里是「必须」:反例义务属于交付契约——"该子系统认证体系已防护"结论是覆盖完整性的产物声明,缺失反向验证清单会让下游误信"该维度全站安全"。
写"未发现认证缺陷"或"已防护"前,产物必须包含:
- 测过的所有登录入口完整清单(主登录 / SSO 回调 / 管理后台 / 移动端 API / 第三方登录 / 注册 / 找回 / OTP / 会话刷新 / 注销,按 sink 语义枚举;多子系统场景按子系统独立分组结账)
- 每个入口在六个维度(弱口令 / 明文传输 / 用户名枚举 / 认证绕过 / 会话管理 / OTP 重用)下的测试 payload 与响应证据
- 用户名枚举的响应差异四元组记录(状态码 / 消息 / 长度 / 耗时)
- 会话管理的"登录前后 SESSION ID 对照" + "登出后旧 SESSION 访问受保护资源结果"
- 找回流程的 reset token 强度评估 + 一次性验证
- 跨子系统独立结账记录
清单不完整 → 结论降级为 partial-coverage 并显式声明未覆盖范围。
闭环验证要求(必须遵守)
通用闭环口径见同根目录 common/closure-verification.md(技能表 path 列同一抽取根下,需要时 read_file 读取)。核心:结论须形成「输入 → 处理 → 真实危害 → 可复核证据」完整证据链;仅凭状态码变化、登录跳转、前端提示等中间信号最多判 suspected,证明各维度真实生效(弱口令登录成功后访问真受保护资源、明文凭证抓取、绕过后取得真实登录态、session / OTP 复用实际可用)才判 confirmed。
实际效果验证方向(每个维度至少证明一类)
- 弱口令:登录后用获取的 token / cookie 访问私有 API 取到真实用户数据
- 明文传输:捕获到真实 HTTP 请求里的凭证字段
- 用户名枚举:多次复验差异稳定,至少能构造一份可枚举的"存在用户列表"
- 认证绕过:用多组随机凭证均能进入登录态并访问私有资源
- 会话固定 / 登出失效:登出后旧 session 访问私有 API 仍返回真实用户数据
- OTP 重用:同一码在首次成功后再次提交仍产生真实业务副作用
判定标准
维度一:默认凭证与弱口令
| 现象 | 判定 |
|---|---|
| 默认 / 弱口令可稳定登录并访问受保护资源 | confirmed |
| 存在可疑响应差异但未证明真实登录态 | suspected |
| 全部尝试均失败且存在有效防护 | not vulnerable |
维度二:明文传输
| 现象 | 判定 |
|---|---|
| 登录凭证在 HTTP 明文传输或可稳定降级导致凭证暴露 | confirmed |
| 疑似明文片段或降级迹象但未证明真实凭证暴露 | suspected |
| 全链路强制 HTTPS / TLS + HSTS | not vulnerable |
维度三:用户名枚举
| 现象 | 判定 |
|---|---|
| 存在 / 不存在用户名可被稳定区分,足以支持账号枚举 | confirmed |
| 存在轻微差异但不足以稳定枚举 | suspected |
| 统一返回不可区分响应 | not vulnerable |
维度四:认证绕过
| 现象 | 判定 |
|---|---|
| 多组随机无效凭证均可获得登录态并访问受保护资源 | confirmed |
| 存在异常成功但未证明真实登录态 | suspected |
| 随机凭证均被拒绝 | not vulnerable |
维度五:会话管理
| 现象 | 判定 |
|---|---|
| 登出后旧会话仍可访问受保护接口并返回用户数据 / 登录前后会话不变且可复用访问登录态资源 | confirmed |
| 仅观察到会话不变但未证明旧会话真实可用 | suspected |
| 登录后会话轮换且登出后旧会话失效 | not vulnerable |
维度六:OTP / 验证码重用
| 现象 | 判定 |
|---|---|
| 同一验证码首次成功后仍可重复使用并再次产生业务效果 | confirmed |
| 偶发重复成功但未证明第二次业务效果 | suspected |
| 首次成功后验证码立即失效 | not vulnerable |
通用 partial-coverage
| 现象 | 判定 |
|---|---|
| 只测了部分登录入口 / 只测了部分维度 / 多子系统未独立结账 | partial-coverage(不得宣称 safe) |
修复建议
默认凭证 / 弱口令:
- 禁用默认账号或强制首次改密
- 强制密码复杂度与历史策略
- 增加登录限速、锁定与 MFA
明文传输:
- 登录接口强制 HTTPS,关闭 HTTP 或 301 强制重定向
- 启用 HSTS,禁止协议降级
用户名枚举:
- 统一错误提示,不暴露用户是否存在
- 统一响应时间窗口(密码哈希校验在所有分支都执行,减小时间侧信道)
- 增加限速与行为风控
认证绕过:
- 服务端统一校验账号存在性、密码哈希与账户状态
- 登录成功前禁止签发 token / session
会话管理:
- 登录成功后强制重新生成会话 ID
- 登出时服务端删除会话状态并使旧会话失效
- 高风险操作增加二次校验
OTP / 验证码:
- 验证码校验成功后立即置为失效(一次性消费)
- 绑定验证码与场景、账号、会话、nonce
- 引入失败次数与速率限制
输出要求
每个维度分别输出:
- 检测入口 URL 与方法
- 关键证据(请求 / 响应对照)
- 结论等级:
confirmed/suspected/not vulnerable/partial-coverage - 最终汇总:认证体系整体风险评级与优先修复建议