本节摘要:本节讲解两种"不破解任何东西"的口令攻击:撞库把外部泄露的明文凭证批量灌进登录口,密码喷洒用少量高频弱口令横扫大量账号。二者都刻意保持低频以规避锁定,蓝队的解法是凭证唯一性治理加"失败分散度"检测。这是攻击技术含量最低、实战命中率却常年居高的一类。
口令回合打到第三局,红队换了个思路:与其猜密码,不如等别人替我猜好。外部世界的泄露事件源源不断地产出明文"邮箱 + 口令"对,黑市上论条交易。拿这些凭证到你的登录口试一遍——用户在别处用的密码,大概率也是这里的密码。这就是撞库(Credential Stuffing):攻击成本近乎为零,因为破解工作早已在别处完成。
**密码喷洒(Password Spraying)**是它的镜像策略:不针对单个账号猜成千上万个密码,而是拿一条高频弱口令(比如"公司名 + 年份"、季节加感叹号)去试成千上万个账号。每个账号只错一次,永远够不着锁定阈值,静悄悄地等待统计规律起效。两者一个吃"复用惯性",一个吃"从众惯性",打击的都是人,而不是算法。
撞库与喷洒的得手率,建立在三段无人值守的防线上。第一段在用户侧:跨站复用密码是常态,一处泄露处处失守。第二段在系统侧:多数登录接口只防"单账号高频失败"(触发锁定的正是暴破特征),对"单账号低频失败 × 海量账号"的模式没有检测逻辑——每个账号都只错了一回,谁的阈值都没碰到。第三段在数据侧:系统不知道自家用户的凭证是否已在外部泄露,自然无从先行处置。
喷洒的请求节律最能说明问题(本地靶场仅做节律模拟,不发起真实登录):
# 本地靶场:喷洒节律模拟——展示"为什么传统阈值失灵" import random, time accounts = [f"labuser{i:03d}" for i in range(200)] # 靶场账号 spray_passwords = ["Autumn!2026", "Target#2026"] # 两条示例弱口令 # 每账号每口令只尝试一次,间隔拉长且抖动,规避速率与阈值检测 for pwd in spray_passwords: for acc in accounts: interval = random.uniform(20, 60) # 秒级间隔 # 此处不发起任何真实请求——仅演示节律特征: # 单账号失败次数 = 2(远低于常见锁定阈值 5) # 单位时间总失败量却持续存在 time.sleep(0) # 模拟占位 print(f"口令 {pwd}:每账号仅 1 次,共 {len(accounts)} 次失败散布在长时段内")
单看任何一行日志都人畜无害;把镜头拉远,才看得见这条平缓而持续的失败基线——这正是检测要对付的形状。

防撞库的根本解在治理层:凭证唯一性。推广密码管理器,让"一站一密"从口号变成默认习惯;企业内用托管凭据方案替代共享账号,杜绝"团队公用一个密码"。技术侧接入泄露凭证核查——用户注册或改密时,将其口令与已知泄露库比对(业内有 k-匿名化方案,只传口令摘要的前缀片段,不泄露口令本身),命中即拒绝并提示更换。对管理员等高危角色,直接强制 MFA(下一章展开),让"密码对了也进不来"成为兜底。
对喷洒则要专项收口:把"公司名、项目代号、季节、年份"类组合加入改密黑名单;入职流程默认生成随机初始密码而非"姓名 + 生日";对从未改过初始密码的存量账号定期清点。
撞库与喷洒的检测,靠的是聚合统计而非单条阈值。四类指标组合使用:单位时间登录失败总数抬升(喷洒信号);失败账号的分散度异常(大量不同账号各错一两次);"成功前失败链"——某账号在数次失败后突然成功,且成功后行为与历史指纹不符(撞库命中信号);异地/异设备成功登录占比抬升。一条聚焦命中账号的查询:
-- 找"近期失败后成功 + 登录地与历史不符"的可疑命中(阈值示例) SELECT a.username, a.ip, a.country, l.fail_cnt, a.ts FROM auth_success a JOIN ( SELECT username, count(*) AS fail_cnt FROM auth_log WHERE result = 'fail' AND ts > now() - interval '3 day' GROUP BY username ) l ON l.username = a.username WHERE a.ts > now() - interval '1 day' AND l.fail_cnt BETWEEN 2 AND 6 -- 低频失败区间,暴破规则覆盖不到 AND a.ip NOT IN (SELECT ip FROM known_ips WHERE username = a.username) ORDER BY a.ts DESC LIMIT 100;
应急动作分秒必争:命中账号立即强制下线、重置口令、回放审计其成功登录后的全部操作;同时把攻击源特征(IP 段、UA 指纹、请求模板)加入动态黑名单,并公告用户层提醒"若在其他平台复用密码请即刻更换"。事后复盘要回答一个问题:为什么我们的用户还在复用密码?答案通常指向管理器推广与泄露核查的欠账。
撞库最扎心的地方在于:攻击者掌握的用户口令情报,可能比网站自己还多。泄露核查不是可选项,是这一局的入场券。
撞库和暴破在告警上怎么快速区分?看"失败-成功"的空间分布:暴破集中在单账号(纵深),撞库铺在大量账号(广度),喷洒是"低频失败 × 长时段"的平线。给值班的一句话口径:纵向深是猜密码,横向广是灌密码,平平无奇是撒密码。
已经接了泄露核查,为什么还会被打?核查通常只在注册与改密时触发,存量用户不会主动改密——所以要配合"邮箱维度泄露通告 + 强制轮换"的运营动作,情报接入才算闭环。另一个常见死角是机器账号与服务间凭据从不参与核查,它们恰恰是撞库命中后价值最高的跳板(呼应横向移动回合)。
喷洒用的高频口令从哪来?统计规律加目标语境:季节与年份组合、公司名加感叹号、键盘走位。防御端能做的是把"自家语境词"系统性加入黑名单,并在新员工入职时默认随机初始口令,别给"从众口令"留下出生地。