Web 登录口生日定向字典暴力破解实训完整文档
一、实训概述
(一)靶场场景背景
靶场提供无防护登录页面,已知固定用户名:admin;用户出生年份固定为 1995 年;登录密码仅为6 位 / 8 位生日数字格式;页面无验证码、无登录错误次数限制、无 IP 访问拦截,可直接使用定向字典 + Burp Suite 暴力破解获取正确密码。
(二)核心考察知识点
- 定向密码字典生成:根据已知生日规则缩小密码范围,区别于海量通用弱口令字典,大幅提升爆破效率;
- Burp Suite Intruder 爆破全套流程:代理抓包、载荷标记、自定义字典导入、响应差异筛选;
- 登录接口安全缺陷原理:无验证码、无错误锁定、无 IP 限流会直接导致弱格式密码被暴力破解;
- Python 简易脚本自动化生成规则化密码字典。
(三)实验环境
- 靶场:Web 登录页面(HTTP POST 提交账号密码)
- 抓包工具:Burp Suite Community/Professional
- 脚本环境:Python3(内置 datetime 库,无需额外安装第三方包)
- 浏览器:Chrome/Firefox(配置 Burp 代理)
二、整体解题五大阶段
- 页面信息侦察,推导密码生成规则
- Python 脚本批量生成 1995 年生日专属密码字典
- Burp 代理抓包,将登录请求发送至 Intruder 爆破模块
- 配置爆破载荷、导入自定义字典、设置结果匹配筛选规则
- 启动爆破,通过响应差异化筛选出正确密码
三、分步详细实操教程
阶段 1:信息收集 & 推导密码规则
- 访问靶场登录页,页面仅存在用户名、密码输入框,无验证码、滑块验证等防护组件;
- 固定已知条件:用户名 = admin,出生年份 = 1995,密码仅由生日数字构成;
- 锁定两类主流生日密码格式:
- 8 位标准格式:
YYYYMMDD(完整年月日,示例:19950815) - 6 位简写格式:
YYMMDD(年份后两位 + 月日,示例:950815)
- 8 位标准格式:
- 密码范围约束:仅生成 1995.01.01 ~ 1995.12.31 全部合法日期,仅 730 条密码,爆破量极小。
阶段 2:Python 脚本生成生日字典
完整可运行脚本(带注释)
python
运行
from datetime import date, timedelta # 定义日期区间:1995全年 start_date = date(1995, 1, 1) end_date = date(1995, 12, 31) day_step = timedelta(days=1) # 创建并写入密码字典文件 with open("1995_birth_dict.txt", "w", encoding="utf-8") as f: current_day = start_date # 循环遍历1995年每一天 while current_day <= end_date: # 写入8位 YYYYMMDD 格式 eight_pwd = current_day.strftime("%Y%m%d") f.write(eight_pwd + "\n") # 写入6位 YYMMDD 格式 six_pwd = current_day.strftime("%y%m%d") f.write(six_pwd + "\n") # 日期自增1天 current_day += day_step # 统计总密码条数 total = 365 * 2 print(f"字典生成完成!文件名称:1995_birth_dict.txt") print(f"总密码数量:{total} 条")脚本使用说明
- 将代码保存为
create_dict.py; - 终端执行:
python create_dict.py; - 运行完成后同目录生成
1995_birth_dict.txt,包含全年所有 6/8 位生日密码。
阶段 3:Burp Suite 抓包并转发至爆破模块
- 配置代理Burp Proxy 监听端口默认
127.0.0.1:8080,浏览器网络代理同步配置该地址; - 提交登录请求浏览器登录页用户名填
admin,密码随意输入数字(如 123456),点击登录提交; - 转发爆破请求Burp → Proxy → HTTP 历史,找到本次登录 POST 请求,右键选择
Send to Intruder。
阶段 4:Intruder 爆破参数配置
1. Positions(载荷标记)
- 清除 Burp 自动生成的多余
§标记(点击Clear §); - 在请求体中找到
password=xxxxxx,选中等号后的测试密码; - 点击
Add §,仅保留密码一处变量标记; - 攻击模式保持默认Sniper(狙击手模式)(单变量遍历字典,适配本次场景)。
2. Payloads(载荷 / 字典导入)
- 切换 Payloads 标签,Payload 类型选择:
Simple list(简单列表); - 点击
Load,选中之前生成的1995_birth_dict.txt,完成密码批量导入; - 无需额外载荷处理规则,保持默认即可。
3. Settings(结果筛选规则)
找到Grep - Match匹配模块,用于自动区分登录成功 / 失败:
- 点击
Add新增匹配规则,填入登录失败固定提示词,例如:密码错误、登录失败; - 作用:爆破完成后,所有命中该关键词的请求会被标亮,快速过滤无效密码。
补充区分成功密码的两种方式:
- 方式 1:Grep 匹配失败关键词,无标记的请求即为正确密码;
- 方式 2:观察响应长度(Length),正确密码返回页面长度、内容与失败请求有明显差异。
阶段 5:启动爆破,提取有效密码
- 点击右上角
Start attack,Burp 自动遍历全部 730 条密码发起请求; - 爆破结束后筛选请求列表:
- 过滤掉带有失败关键词标记的条目;
- 剩余唯一响应内容 / 长度特殊的请求,其 Payload 值就是正确生日密码;
- 使用账号
admin+ 该密码,完成后台登录。
四、实验原理与安全分析
1. 定向字典爆破优势
通用弱口令字典通常数万~数十万条,爆破耗时久;本次基于已知出生年份限定日期范围,仅 730 条密码,爆破秒级完成,命中率 100%,是定向情报下高效爆破手段。
2. 漏洞产生核心原因
登录接口三层防护全部缺失:
- 无验证码:无法拦截自动化批量请求;
- 无错误次数锁定:连续输错密码不会封禁账号;
- 无 IP 访问限流:同一 IP 可无限次发起登录请求。
3. 生产环境防御优化方案
- 增加验证机制:图形验证码、短信 / 邮箱验证码、人机滑块验证;
- 错误次数限制:连续 5 次密码错误,锁定账号 10 分钟或封禁 IP;
- 强制密码复杂度:必须包含大写字母 + 小写字母 + 数字 + 特殊符号,禁止纯数字生日密码;
- 接口限流:后端限制单 IP 每分钟最大请求次数;
- 日志审计:记录异常高频登录行为,后台告警。
五、实操常见踩坑点
- 代理配置错误:浏览器代理端口与 Burp 监听端口不一致,抓不到数据包;
- 载荷标记多余:未清除用户名、其他参数的
§标记,导致爆破参数错乱; - 字典编码问题:脚本指定
utf-8写入,不要使用记事本另存为 GBK,避免 Burp 读取乱码; - Grep 关键词不匹配:页面提示文字存在空格、中英文差异,会导致筛选失效,建议直接对比响应长度判断;
- 年份 / 日期逻辑错误:脚本起止日期写错会丢失部分密码,必须严格限定 1995 全年。
六、拓展思考
- 若仅知道出生年份区间(如 1990-2000),如何修改 Python 脚本批量生成多年生日字典?
- 靶场增加验证码后,有哪些绕过验证码实现自动化爆破的手段?
- 除生日字典外,还有哪些常见定向弱口令规则(手机号后 6 位、姓名拼音、身份证后 6 位等)?
