auth-comprehensive

star 72

认证安全综合检测 — 综合检测认证体系安全风险:弱口令/明文传输/用户名枚举/认证绕过/会话管理/验证码重用。

Q16G By Q16G schedule Updated 6/7/2026

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
  • 不向真实用户发送骚扰邮件 / 短信;找回流程测试用自有测试账号承接
  • 不窃取或长期持有真实用户登录态

检测步骤

下列六个维度各自独立执行,但产物按"该子系统的整条认证栈"汇总。

维度一:默认凭证与弱口令

  1. 发送确定错误凭证建立失败基线(状态码、响应模板)
  2. 按小规模字典逐条测试默认凭证与高频弱口令(admin/admin、admin/123456、test/test、root/root 等)
  3. 登录成功后访问受保护资源,确认有效登录态
  4. 记录防护触发情况(锁定 / 验证码 / 退避)

维度二:明文传输

  1. 枚举登录入口,记录是否为 http://
  2. 发送登录请求,检查凭证字段是否在 HTTP 明文通道传输
  3. HTTPS 入口检查是否存在降级链路(跳转 HTTP / 混合内容 / 代理回落 / Strict-Transport-Security 缺失)
  4. 复核确认凭证确实经明文链路暴露

维度三:用户名枚举

  1. 构造两组请求:存在用户名 + 错误密码 vs 不存在用户名 + 错误密码
  2. 记录响应状态码、错误消息、响应长度、响应耗时差异
  3. 在注册 / 找回密码 / 验证码发送接口重复对照
  4. 复核差异稳定性,排除偶发抖动与风控噪音

维度四:认证绕过

  1. 发送基线失败请求(随机不存在账号 + 随机密码)
  2. 构造多组随机凭证重复登录(单接口最多 10 次)
  3. 检查是否返回 token / session / 跳转登录态页面
  4. 对疑似成功访问受保护接口验证权限
  5. 换组随机凭证复核排除单次异常

维度五:会话管理(会话固定与登出失效)

  1. 访问登录页记录基线会话标识(Cookie / URL 参数)
  2. 携带基线会话执行登录,比较前后会话标识是否变更
  3. 执行登出,使用登录期旧会话访问受保护接口
  4. 尝试预设会话标识并引导登录,验证该会话是否可被复用

维度六:验证码 / OTP 重用

  1. 获取有效验证码并完成首次校验(基线成功)
  2. 相同会话 / 参数下重复提交同一验证码
  3. 新会话或不同请求标识下再次提交同一验证码
  4. 观察重复提交是否返回成功并产生业务副作用

示例库

正例形态(代码层根因)

  • 服务端密码校验前未做账号存在性区分,但错误消息按存在性分支返回(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
  • 最终汇总:认证体系整体风险评级与优先修复建议
Install via CLI
npx skills add https://github.com/Q16G/aster --skill auth-comprehensive
Repository Details
star Stars 72
call_split Forks 6
navigation Branch main
article Path SKILL.md
More from Creator