简介:WebCrack是一款面向Web安全测试人员的后台弱口令与万能密码批量检测工具,基于Python开发,适合渗透测试、站点安全评估等场景。工具通过导入后台地址即可自动化发起检测,内置随机UA、X-Forwarded-For与Client-IP伪装,支持按域名动态生成字典,可自定义爆破规则并有效识别万能密码漏洞,核心判断逻辑经过多轮迭代优化,能明显降低误报率。压缩包共13个文件,以8个Python源码模块为主,辅以配置文件、依赖列表、README说明及示例图片,代码结构经重构后分层清晰,便于二次开发或按需调整参数。包体仅113KB,轻量易部署,本地运行门槛低。目前已有1603人学习下载,适合有一定Python基础的安全爱好者快速上手并集成到日常检测流程中。
1. WebCrack:后台弱口令批量检测,导入地址就能跑
做过安全巡检的人应该都有这种经历:手里拿着一批后台登录地址,需要确认它们的口令强度,结果一个一个手工试到凌晨。批量弱口令检测工具就是干这个的,WebCrack 把「目标导入 → 规则匹配 → 结果输出」做成了流水线,后台地址喂进去,自动化跑一遍弱口令和万能密码检测,最后给出哪些目标存在风险。尤其适合几类人:企业内网做安全自查的运维、接授权渗透测试的工程师、还有刚接触安全检测想验证工具效率的 Python 学习者。它的核心价值不在某个单点漏洞利用,而是把「批量」和「自动化」两个关键词落地,省掉最枯燥的重复请求环节。下面我按实际使用的思路拆解这个工具的原理、操作和坑。
2. 弱口令与万能密码:检测规则的底层逻辑
2.1 弱口令检测的本质:绕过登录验证的暴力猜解
弱口令检测说白了就是模拟人在登录页面反复尝试账号密码。工具做的事情可以拆成三步:构造 HTTP 请求、发送到目标登录接口、根据响应判断是否登录成功。听起来简单,但真正写起来有几个细节决定成败。
第一个细节是请求方式。绝大多数后台登录走 POST 请求,参数通常是 username、password,也可能是 user、pwd、loginName 这类变体。工具如果没有内置常见参数名字典,碰到非常规参数名的目标就直接失效。我见过一个后台用的是user_email和pass_code,常规字典全打不中。
第二个细节是登录成功的判定。响应状态码 200 不代表登录失败,302 跳转也不代表登录成功。常见做法是综合判断:响应里是否出现「欢迎」「退出」「dashboard」「index」这类后台特征词,或者请求后有没有下发新的 Session Cookie。有的目标登录成功后返回一段 JSON,里面带"code":0或"status":"success",这个也要加进判定逻辑。
第三个细节是频率控制。暴力猜解类检测天然会被 WAF 和风控盯上,批量工具必须内置延迟和重试机制,否则跑一半目标就全部超时,结果报表没法看。
2.2 万能密码为什么能生效:拼接漏洞与参数化查询的对抗
万能密码的本质是让程序在拼 SQL 时把「用户名密码校验」这个条件变成恒真。一段典型的拼接代码长这样:
SELECT * FROM admin WHERE username='$user' AND password='$pass'如果用户名字段填的是admin' OR '1'='1' --,拼接后的 SQL 变成:
SELECT * FROM admin WHERE username='admin' OR '1'='1' --' AND password='xxx'--注释掉后面的密码校验,OR 1=1让条件恒真,于是数据库返回第一条记录,程序误认为登录成功。这是最经典的万能密码形态。此外还有几种变体:admin' --直接注释掉密码部分,' or ''='让两个空字符串相等,||1=1#利用数据库的拼接符和注释符。不同数据库注释符不一样,MySQL 认#和--,Oracle 认--,SQL Server 也认--,所以规则库里要覆盖多种注释符写法。
那为什么现在很多万能密码打不进去?因为相当一部分 Web 应用已经改用参数化查询或 ORM,SQL 语句结构固定,恶意输入只会被当成字符串值处理,无法改变语句逻辑。万能密码真正能打穿的是老代码、内部系统、或者直接用字符串拼接 SQL 的过时框架。所以工具里万能密码的检测结果通常需要人工复核,不能直接当成漏洞上报。
2.3 规则库的组织方式:路径、字典、万能密码三元组
WebCrack 这类工具的规则库通常由三个独立文件组成。第一个是后台路径字典,用于从目标站点里发现登录入口,常见条目包括/admin/、/manage/、/login.php、/admin/login.asp、/user/login。第二个是弱口令字典,是「用户名 + 密码」的排列组合,admin/123456、root/root、test/test 这类。排列方式可以是一对一,也可以做笛卡尔积——每个用户名尝试全部密码。
第三个是万能密码规则。这部分和弱口令字典不一样,不需要做排列组合,每条规则就是一组用户名参数值和密码参数值,直接填入登录参数即可。下面给一段典型的规则加载逻辑:
def load_rule_files(rule_dir): paths = load_lines(f"{rule_dir}/admin_paths.txt") weak_pairs = load_pairs(f"{rule_dir}/weak_pass.txt") # 每行: user,pass magic_pass = load_lines(f"{rule_dir}/magic_pass.txt") # 每行: admin' or '1'='1' -- return paths, weak_pairs, magic_pass这段逻辑说白了就是三个读取函数,做的事情都一样:按行读文件、去掉空行和注释行、把结果存进列表。weak_pass.txt每行是一组账号密码,用逗号分隔;magic_pass.txt每行是一条完整的万能密码载荷,工具会把载荷分别填进用户名字段和密码字段进行尝试。实际跑检测时,工具会对每个后台地址循环执行三步:用路径字典拼 URL、用弱口令字典做登录尝试、用万能密码规则做登录尝试。
我把万能密码规则单独放一个文件而不是混在弱口令字典里,原因很实际:弱口令是「正常登录接口的猜解」,万能密码是「验证登录逻辑缺陷」,两者判定标准和误报率完全不同,分开存放方便单独校准和裁剪。
3. 部署与实战:从安装到跑完一轮完整检测
3.1 Python 环境准备与依赖清单
WebCrack 是 Python 实现,安装依赖之前先确认 Python 版本。建议用 3.8 以上版本,因为工具里用到的类型注解和 f-string 语法在低版本上有兼容问题。依赖项核心就三个:requests 负责 HTTP 请求,concurrent.futures 负责并发(这是标准库),pyyaml 负责读写规则配置。如果不需要改配置,pyyaml 可以不装。
python3 -m venv webcrack_env source webcrack_env/bin/activate pip install requests pyyaml创建虚拟环境这一步不是可选项。我一般习惯每个检测工具都单独建虚拟环境,因为安全工具依赖的 requests 版本经常和别的项目冲突,隔离之后互不干扰。装完检查一下版本:
python3 -c "import requests; print(requests.__version__)"requests 2.20 以上就行,版本再老会有 TLS 握手兼容问题,访问部分只开 HTTPS 的站点会直接报 SSL 错误。
3.2 目标列表格式与配置项说明
目标文件是纯文本格式,每行一个 URL。可以是完整登录地址,也可以只写站点根地址,让工具自己拼接后台路径:
http://192.168.1.105:8080/ https://www.example.com http://demo.internal.net/manage/login第二行只给了域名,工具会自动跑一遍路径字典,尝试/admin/、/login.php等常见入口,找到哪个地址存在登录表单就把哪个列入检测队列。第三行直接给了具体登录地址,工具会跳过路径探测直接进入口令猜测。两种方式各有适用场景:站点根地址适合目标后台路径未知的情况,但会多出很多探测请求;完整登录地址适合目标列表已经确定、追求检测速度的情况。我自己的习惯是第一次先跑路径探测,确认后台位置后第二次直接用完整地址再跑一遍,避免每次重复探测。
工具的并发、延时、超时参数一般在配置文件里调整,核心参数大致如下:
| 参数 | 默认值 | 作用 | 建议 |
|---|---|---|---|
| thread_num | 10 | 并发线程数 | 网内目标可调到 20,公网目标建议 5 以下 |
| request_timeout | 10 | 单次请求超时秒数 | 网络差时调到 15~20 |
| delay | 0.5 | 每次请求间隔秒数 | 触发风控时调到 2~3 |
| retry_times | 3 | 失败重试次数 | 超时重试一次即可,重试多了拖慢整体速度 |
| user_agent | Chrome UA | 请求头伪装 | 可换成浏览器真实 UA |
延时参数要认真对待。delay 0.5意味着每线程每秒最多发两个请求,10 个线程合起来每秒也不过 20 个请求。如果把 delay 设成 0,10 个线程压上去每秒几十个请求,目标一旦有安全设备,不出半分钟你的 IP 就会被封掉,后面所有的检测都会变成超时。
3.3 命令行参数:跑通一轮检测
配置完成之后启动检测,典型命令如下:
python webcrack.py \ --targets targets.txt \ --threads 10 \ --delay 0.5 \ --timeout 10 \ --output result.csv每个参数对应前面配置表里的一项,命令行优先级高于配置文件——这条规则很重要,因为临时调整检测强度(比如被目标侧限流后临时改小线程数)时,改命令行参数比重开配置文件快得多。--output result.csv指定结果输出文件,跑完后工具会生成一个 CSV 表格,每一行记录一个检测目标的 URL、尝试过的账号密码、命中状态、响应码和响应长度。
启动后观察输出日志,重点关注两类信息:一是目标 URL 是否被正确拼接,二是命中项的响应码。跑完一轮后打开 CSV,先别急着看命中列表——先用文本编辑器统计一下总请求数和平均响应时间,确认没有大面积超时。如果超时率超过 30%,说明并发参数或网络环境有问题,这时候的检测结果可信度很低。
python webcrack.py --targets targets.txt --threads 5 --delay 1 --timeout 15这个命令是上述场景的降级版本:线程砍半、延时翻倍、超时延长。遇到目标站点性能差或网络链路不稳时,用这组参数往往能得到更稳定的结果。
3.4 结果输出与误报筛选
CSV 结果里命中状态一栏需要特别小心。工具判断「命中」的逻辑是响应特征匹配,而所有基于特征匹配的判断都有误报率。拿到结果后我一般会做一次二次确认:把 CSV 里命中的目标地址整理出来,人工打开浏览器手动登录一次,确认是否真的能靠这个账号密码进去。
import csv with open("result.csv", encoding="utf-8") as f: for row in csv.DictReader(f): if row["hit"].lower() == "true": print(f"{row['url']} => {row['user']} / {row['pwd']}")这段脚本做的事很简单:逐行读取 CSV,过滤出命中记录,输出 URL 和对应的账号密码。人工复核时挨个手动登录一次,命中项里至少有三分之一的万能密码规则是打不进去的——不是工具报错,而是目标正好存在登录失败后的特征页,工具把失败响应误判成了成功响应。这个误报问题没办法完全消除,只能通过调整判定特征词来降低。
4. 高频翻车现场:批量检测常见的五个坑
4.1 跑一半全部超时,目标 IP 被封了
现象:日志里连续出现Request Timeout,原本正常的目标在一个时间点之后集体失联。原因:并发太高加上延时太小,目标 WAF 或安全设备把来源 IP 加入了黑名单。解决:停止检测,等 10 到 30 分钟让封禁自动解除,把线程数降到 5、delay 调到 2,给每个请求带上随机的 User-Agent 头再重新跑。如果目标内部有多个 IP 出口,可以做一层代理池轮换,但代理池的稳定性是另一个大坑,小规模检测不建议引入。
4.2 万能密码命中率奇高,全是误报
现象:检测结果里某个目标用' or '1'='1' --直接命中,但手动打开浏览器复制同样的参数,登录被正常拦截。原因:目标登录失败时返回的是 200 状态码,响应页里恰好含有「admin」字样,被工具判成了登录成功特征。解决:打开该目标的登录页面,抓一次正常登录失败的响应,把「成功特征」校准成具体关键词,比如「欢迎进入后台」「退出登录」,而不是泛泛的admin字符串。用这类精确特征会漏掉一些没有欢迎语的后台,但漏报总比满屏误报强。
4.3 线程数调到 50,结果一个目标都没跑完
现象:线程设大了后,所有目标的响应时间飙升,大量请求超时。原因:本机网络连接数和目标服务器连接数都有上限,50 个线程并发意味着瞬间建立几十个 TCP 连接,目标若配置了连接数限制,直接拒绝新请求。解决:把线程数控制在 10~20 之间,每个线程内复用 requests.Session 保持连接,不要每发一个请求新建一个连接。Session 复用能显著减少 TCP 握手的开销,这在长连接场景下比盲目加线程更有效。
4.4 目标有验证码,所有口令全部无效
现象:某个后台登录页带图形验证码,工具跑完一切正常,但结果里该目标的每一条弱口令都是「未命中」。原因:工具默认不处理验证码,请求发出去后目标返回「验证码错误」或「验证码不能为空」,口令根本没进入账号密码校验环节。解决:在配置里给这个目标打上skip标记,让工具跳过验证码目标,或者接入 OCR 识别模块先识别验证码再提交。注意,很多带验证码的目标还有「连续失败锁定账号」机制,强行绕过验证码去猜口令反而会把目标账号锁死,影响业务。
4.5 跑到一半 Session 失效,后半程结果全是假的
现象:检测结果里同一目标的多次尝试,前半段响应正常,后半段全部返回「未登录」或「请登录」。原因:部分后台登录接口有会话状态管理,检测工具对每个目标保持一个全局请求头或 Cookie,前半段积累了登录态,后半段这个态异常失效,所有后续请求都带上了异常状态。解决:给工具配置定时重置会话的机制,每跑完一个目标就重置一次本地 Cookie 存储,多个目标之间不共用任何状态变量。
def reset_session(): session = requests.Session() session.headers.update({"User-Agent": random_ua()}) return session这段重置逻辑每处理完一个目标就调用一次,创建全新的 Session 实例,避免上一个目标遗留的 Cookie 或 Header 污染下一个目标的请求。参数上的重点是随机 User-Agent 函数——如果所有请求都用同一个 UA,批量请求特征非常明显,极易被识别为自动化工具。
5. 进阶:把默认规则扩成自己的私有规则库
工具自带的弱口令字典和万能密码规则只是起点,真正有价值的部分是根据自己业务环境沉淀的私有规则。我个人的做法是维护三个文件:magic_pass.txt记录每次实战项目中手工验证过的万能密码载荷,weak_pass.txt记录行业特有的默认口令(比如某些设备厂商的出厂口令),admin_paths.txt记录目标环境里出现过的后台路径。
规则添加不是简单把新条目追加进文件,关键是每条规则要带来源标记和验证状态:
# 追加新规则,格式:载荷, 来源, 已验证 echo "admin' -- -, 某Demo站, 已验证" >> magic_pass.txt错误做法是把网络上所有公开规则一次性导入。某次我把一整套几百条规则灌进工具后,跑出的命中项里大半是误报,最后花了两天时间逐条复核,从那以后我每次都强制走一遍流程:新规则先在 10 个已知目标的基准集上跑一遍,计算命中率和误报率,命中率合格且误报率低于 10% 才允许合入正式规则库。维护规则库这件事急不来,靠的是每一次项目中积累。
整台工具用下来,我的体会是:弱口令检测工具解决的只是「规模化发送请求」这一个问题,真正的判断力来自使用者的规则校准能力和结果复核习惯。把它用在自己有权限的站点上,当作稳固安全防线的巡检工具,比如定期检查内部系统是否有默认口令、监测测试环境是否残留后门账号,这种用法既安全又实在。希望这篇文章能让你少踩几个我已经踩过的坑。
本文还有配套的精品资源,点击获取