1. 为什么需要抛弃默认字典?
在渗透测试和红队行动中,目录爆破是最基础的攻击手段之一。但90%的安全从业者还在使用那些"祖传"的默认字典,比如常见的dirbuster.txt、common.txt。这些字典存在三个致命缺陷:
首先,默认字典的目录结构过于陈旧。我统计过某流行字典,超过60%的条目是针对十年前的Apache 1.x和IIS 6.0设计的,而现代Web框架(如Spring Boot、Laravel)的默认路径完全不在其中。去年我在某次红队行动中就遇到这种情况:用默认字典扫了三天一无所获,后来发现目标用的是Nuxt.js,其特有的_nuxt目录根本不在常规字典里。
其次,默认字典缺乏针对性。不同行业、不同技术栈的Web应用有着完全不同的目录特征。金融行业的OA系统可能暴露/swagger-ui.html,而物联网设备的管理界面往往藏在/cgi-bin/luci。我曾参与过某次攻防演练,目标使用的是某国产中间件,其特有的/admin/console路径只有在该厂商的文档里才能找到。
最后,默认字典容易被WAF识别。安全设备厂商早就把这些常见字典纳入了特征库。去年某次测试中,我们使用默认字典时触发了Cloudflare的速率限制,而换成自定义字典后成功绕过了检测。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 红队级字典的核心特征
2.1 多维度分类体系
优质字典应该像手术刀般精准。我的字典库按以下维度分类:
-
技术栈维度:
text复制
/wp-admin/ # WordPress /vendor/phpunit/ # PHP项目 /_next/static/ # Next.js /actuator/health # Spring Boot -
行业特征维度:
text复制
/swagger-ui.html # 互联网企业 /phpmyadmin/ # 教育机构 /cgi-bin/luci # 物联网设备 /admin/console # 国产中间件 -
漏洞关联维度:
text复制
/console/ # Weblogic未授权访问 /api/v1/users # 常见API未授权端点 /filemanager/upload.php # 文件上传漏洞
2.2 动态权重机制
好的字典不是静态的。我开发了一个Python脚本来自动调整条目权重:
python复制def update_weights(hit_log):
with open('dict.txt', 'r+') as f:
entries = [line.strip().split('|') for line in f]
for path, weight in entries:
if path in hit_log:
new_weight = min(int(weight) * 1.5, 1000) # 命中条目权重提升
else:
new_weight = max(int(weight) * 0.9, 10) # 未命中条目权重衰减
f.write(f"{path}|{new_weight}\n")
字典条目格式为路径|权重,每次扫描后根据命中情况自动调整。这样高频命中的路径(如/admin)会优先测试,而长期无效的路径(如/old-backup)会逐渐靠后。
3. 字典构建全流程详解
3.1 原始数据采集
3.1.1 GitHub情报挖掘
使用GitHub API搜索敏感路径:
bash复制gh api -X GET search/code -f q="filename:.env OR path:config/" --paginate | jq '.items[].html_url'
重点监控:
- 误提交的配置文件(.env、config.xml)
- CI/CD脚本(Jenkinsfile、.gitlab-ci.yml)
- 测试用例中的Mock数据
3.1.2 流量分析技巧
用mitmproxy捕获真实流量:
python复制from mitmproxy import http
def response(flow: http.HTTPFlow):
if "secret" in flow.request.url:
with open("paths.txt", "a") as f:
f.write(flow.request.path + "\n")
特别注意:
- 前端map文件(*.js.map)
- 开发环境特有的路径(如/webpack-dev-server)
- 接口文档路径(/swagger-resources)
3.2 数据清洗与增强
3.2.1 智能变形算法
对基础路径进行智能扩展:
python复制from urllib.parse import quote
def mutate_path(path):
variants = [
path,
path.upper(),
path.lower(),
quote(path),
quote(path.upper()),
path.replace('/', '\\'),
path + '/',
'/' + path[1:] if path.startswith('/') else path
]
return list(set(variants))
3.2.2 上下文感知生成
针对Java项目自动生成:
text复制/WEB-INF/classes/
/META-INF/maven/
/static/resources/
针对PHP项目生成:
text复制/config/database.php
/storage/logs/
/.git/HEAD
3.3 字典优化策略
3.3.1 基于机器学习的排序
使用历史扫描数据训练排序模型:
python复制from sklearn.ensemble import RandomForestClassifier
# 特征包括:路径长度、特殊字符数量、关键词匹配度等
X_train = extract_features(hit_paths + miss_paths)
y_train = [1]*len(hit_paths) + [0]*len(miss_paths)
model = RandomForestClassifier()
model.fit(X_train, y_train)
3.3.2 失效路径淘汰机制
每月自动清理:
- 连续30次扫描未命中的路径
- 返回404比例超过95%的路径
- 触发WAF次数过多的路径
4. 实战应用技巧
4.1 智能爆破策略
分阶段扫描方案:
| 阶段 | 字典规模 | 超时设置 | 并发数 | 目标 |
|---|---|---|---|---|
| 1 | 50条 | 3秒 | 10 | 快速识别技术栈 |
| 2 | 300条 | 5秒 | 5 | 重点路径深度测试 |
| 3 | 全量 | 10秒 | 2 | 长尾路径探测 |
4.2 对抗WAF的七个技巧
- 随机延迟:在1-5秒间随机间隔请求
- 大小写交替:/Admin/console → /aDmin/ConSOle
- 路径编码:/admin → %2f%61%64%6d%69%6e
- 添加垃圾参数:?fake=1&test=2
- HTTP头注入:X-Forwarded-For: 127.0.0.1
- 协议切换:HTTP/1.1 → HTTP/2
- 请求头顺序随机化
5. 维护与更新
建立字典质量评估体系:
text复制命中率 = 命中路径数 / 总测试路径数
误报率 = 误报路径数 / 总命中数
覆盖率 = 独特路径数 / 行业平均路径数
我的更新周期:
- 每周:添加GitHub新发现的路径
- 每月:淘汰失效路径,调整权重
- 每季度:根据新技术栈扩充字典
关键提示:永远不要共享你的主字典库。我维护三个版本:
- 公开版:基础路径,用于普通测试
- 内部版:包含行业特征路径
- 任务版:针对特定目标定制
