用 Pitchfork 做一次撞库:两次实验教会我的事
发布时间:2026/10/8 8:25:04 锦皓数字建站

靶场本地虚拟机 Metasploitable2 Kali仅主机网络全程在自有环境内操作。一、先纠正一个误解撞库不是随机组合密码我刚开始学的时候以为撞库就是把账号和密码随机排列组合去试。做过一遍之后才发现完全不是这样。三种打法的区别其实全在数据从哪来打法数据来源赌什么请求数撞库泄露库里现成的「账号:密码」配对人会在不同网站复用密码min(两表行数)水喷洒就 1 个弱口令总有人用弱口令账号数穷举字典 × 账号全排列运气最不划算N × M撞库用的数据本身就是成对的——某次数据库泄露时原样拖出来的真实凭证alicecompany.com:Pssw0rdbobcompany.com:123456carolcompany.com:iloveyou所以撞库不是猜是把别人已经泄露的凭证成对搬到另一个网站去试。100 个账号 × 1000 个密码的全组合是 5 万次请求限速下要十几个小时还大概率一无所获而 100 个成对凭证只需要 100 次。二、Burp 里的四种攻击模式别选错Burp Intruder 的 Attack type 下拉框里有四个模式行为差别很大模式行为适合场景Sniper一个字典逐个替换某个位置其他位置不动单个账号 × 多个密码Battering ram一个字典同一个值塞进所有位置用户名密码相同admin/adminPitchfork多个字典第 i 行配第 i 行撞库成对凭证Cluster bomb多个字典笛卡尔积全排列N × M最贵我前一篇写的是 Sniper7 个弱口令打一个 admin这篇试 Pitchfork。三、这次的实验造一份泄露库DVWA 里有 5 个真实账号admin / gordonb / 1337 / pablo / smithy。我在 Kali 里手造一份泄露库然后拆成两列printf ‘admin:password\ngordonb:abc123\n1337:charley\npablo:letmein\nsmithy:password\n’ creds.txtcut -d: -f1 creds.txt users.txtcut -d: -f2 creds.txt pass.txtwc -l users.txt pass.txt这里 cut 的作用是切不是替换-d: 指定用冒号当刀把每行切成两段-f1 取左边那段账号、-f2 取右边那段密码原字符一动不动。最后 wc -l 数行数——两列行数相等 天然对齐这是撞库不出错的前提。然后在 Intruder 里抓 Brute Force 请求 → Send to IntruderAttack type 选 Pitchfork标记两处username§admin§password§123456§Payload set 1 → Load /home/kali/users.txt5 个账号Payload position 切到 2 → Load /home/kali/pass.txt5 个密码Payload count 5、Request count 5 → Start attack一个容易踩的坑两个字典要行行对齐。如果我载入 5 个账号 4 个密码Request count 会变成 4第五个账号根本不会被测。另外别手抖点 Deduplicate——密码字典里出现重复是正常的很多账号就是共用同一个弱口令去重了就漏配对了。四、结果表怎么从 5 行里看出中了几行这次 5 行全命中Status code 全 200Length 分别是账号密码Lengthgordonbabc12349851337charley4983adminpassword4986pabloletmein4986smithypassword4987点任意一行搜 welcome都能搜到 Welcome to the password protected area xxx。这里有个我一开始没预料到的细节5 个成功行的长度并不相同是 4983~4987。差别来自那句成功提示里回显了用户名Welcome to the password protected area 1337用户名 4 个字符的1337最短6 个字符的smithy最长。所以判读不能只找唯一异类要找挤在一起的一小撮——如果同时测 20 个账号成功行会彼此接近但不相等差异恰好等于用户名的长度差。这招在真实撞库里能帮我分辨到底哪几个账号沦陷了。五、第二次实验密码全在列表里命中却是 0第一次跑通之后我做了个对照实验把密码列表整体错位123456charleypassword123456charley预期会翻车结果是真的全灭——5 行长度全部 4919~4920零命中。关键在于password、charley 这些正确密码全都还在列表里一个不少。只是它们站错了行被配给了错误的账号。结论撞库命中 正确密码 × 正确账号配对必须同时正确。密码在字典里 ≠ 能登录。同一份数据、同一批密码只改配对方式这一个变量结果就从 5/5 变成 0/5。这就是对照实验的价值——它把到底是密码不对还是姿势不对这件事彻底分开了。六、中途翻车一次 302 让我学到了什么第一次跑这个实验时5 行全返回 302、Length 只有 397 左右。一开始我以为字典错了。查下来发现是会话过期——PHPSESSID 是上午抓的那条老请求里的PHP 默认 24 分钟过期服务器那边早就查无此人于是把这 5 个请求全当游客踢回登录页Location: …/login.php。把新 PHPSESSID 就地替换进 Positions 的请求头重跑全 200。教训Intruder 结果表全灭先查请求姿势会话、Cookie、安全级别再怀疑字典。 我一周内已经因为安全级别被改回 high和会话过期栽了两次同一个坑踩两遍——现在我养成了新习惯开跑前先看 Status code 列全 200 才是攻击有效全 302 说明请求根本没进门这时候分析 Length 是白费力气。七、复盘这一课真正学到什么撞库靠配对正确不靠字典大。错位实验 0 命中比任何理论都有说服力。暴露的凭证和猜的密码是两种完全不同的资产。前者是别人现成给的东西性价比高一个数量级。Request count 是我的安全带开跑前先看它。数字不对就别点 Start attack。结果表要看分布而不是看单行。挤在一起的一小撮往往就是命中组。八、防御侧写报告时的修复建议登录接口限速失败 N 次锁定 指数退避接图形/滑块验证码合并错误提示“用户名或密码错误”避免用户名枚举注意即使合并账号存在与否的响应时间差也可能泄露需要一并处理强制 MFA密码对了也进不去是最有效的一道密码策略长度优先于复杂度维护 top 10000 弱口令黑名单异常检测异地登录、异常设备指纹、撞库特征告警同一 IP 短时间大量账号失败合规提醒多数 SRC 明确不收我用外部泄露库撞进去了这种报告——因为那不是目标网站的错。本站能报的是登录接口无失败次数限制、无验证码、允许弱口令可被撞库批量接管账号并且危害证明要只用自己的测试账号。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。