简介:WebCrack是一款基于Python开发的Web后台弱口令与万能密码批量检测工具,面向安全测试人员、渗透学习者以及有批量巡检需求的运维人员。工具支持导入后台地址即可自动化检测,通过多重判断机制减少误报,内置随机UA、X-Forwarded-For与Client-IP伪装,并可根据目标域名动态生成字典,还支持检测万能密码漏洞和自定义爆破规则。资源压缩包共13个文件、体积113KB,主体为8个Python脚本,涵盖字典生成、表单解析、核心检测等模块,另含2个TXT字典/配置说明、1个PNG示例图、1个Markdown文档及.gitignore配置文件,结构清晰,便于按需阅读和二次开发。目前已有1603人学习下载,适合希望深入理解后台弱口令检测原理、快速搭建自用批量检测脚本的Python安全爱好者。
1. WebCrack 这类后台弱口令批量检测工具,到底能帮你省多少事
凌晨两点被电话叫醒,某公司后台的登录日志里全是陌生 IP 的失败尝试,翻记录一看:那台后台的管理口令是 admin/123456,半年巡检都没发现,被脚本撞了一个多月。这种事后补窟窿的经历,做过一次就够。WebCrack 这类 Web 后台弱口令批量检测工具,解决的就是这个问题:把后台登录地址整理成一份清单丢进去,自动跑默认口令、弱口令和万能密码,几分钟回给你一份“哪些后台能登录、用什么口令能登录”的风险清单。它适合有授权的安全巡检、加固验收和自查场景,对象是自研后台、CMS、运维页面这类登录入口,不是拿来碰你没有授权的目标的。
2. 检测逻辑与适用边界:WebCrack 在测什么,哪些后台它测不动
要理解 WebCrack,先要分清它测的三类东西:弱口令、默认口令、万能密码。这三类东西的检测思路完全不同,适用场景也不同。把概念理清之后,你才知道拿到结果时该怎么处理,哪些结果是“真能登录”,哪些只是工具判定出来的“疑似”。
2.1 弱口令、默认口令与万能密码:三种检测对象不能混
弱口令是能被人猜出来的简单口令,比如 admin/123456、admin/admin123、root/12345 这类。它们的特征是口令本身没有复杂度,常见弱口令 Top 100 字典基本能覆盖。默认口令是设备或系统出厂时内置的口令,比如某些 CMS 安装完固定是 admin/admin,某些设备管理页出厂是 admin/123456,管理员不改就一直有效。默认口令和弱口令的区别在于:默认口令是“本来就这样”,弱口令是“管理员自己设得简单”。
万能密码则是另一类东西,它不是口令,而是一段绕过认证逻辑的输入。典型写法是在用户名或密码字段里填上 SQL 拼接片段,比如用户名填admin' or '1'='1 --,密码随便填,老系统如果直接把字符串拼进 SQL,就可能绕过后台校验直接放行。当时叫“万能”,是因为一段 payload 能打穿一批用同一套旧框架的站点,但现在新系统普遍用参数化查询和 ORM,这类 payload 大部分已经失效。
WebCrack 这类工具的常见做法是把三类都内置:先拿默认口令和弱口令逐条试,再拿一批万能密码 payload 打登录接口的认证逻辑漏洞。它不会在你的报告里区分是哪一种命中,只会告诉你“这条 URL、用这个值能登录成功”。所以拿到结果后,你要自己判断是弱口令问题还是认证逻辑漏洞,这两者的修复方式完全不同。
2.2 从登录请求到判定成功:WebCrack 的检测链路
一次检测的本质是模拟浏览器提交登录表单,再根据响应判断是否真的登录进去了。链路大致是四步:抓登录页、识别表单字段、构造请求、判定结果。
抓登录页时,工具会先对目标 URL 发一次 GET 请求,拿到 HTML 后解析<form>元素,找到里面type="password"的输入框,顺带确定表单的提交地址和提交方式,大多是 POST。这一步是否顺利,直接决定后面能不能测,因为很多后台登录页看起来是“一个输入框加一个按钮”,实际表单字段名是动态生成的,或者用了 JavaScript 拼接请求,工具抓不到就没法继续。
识别表单字段时,工具要确定用户名字段和密码字段的 name,比如<input name="username">和<input name="password">。字段名不标准时,工具只能靠特征猜,猜错就会把口令填到错误的地方,后面全白跑。这也是为什么很多工具支持手动指定字段名,后面避坑章节会专门说。
构造请求就是把字典里的用户名和密码填进去,按表单的编码格式发出去,最常见的是application/x-www-form-urlencoded,也有一些后台用 JSON 格式接收。判断结果是最关键的环节,常见判定特征包括:返回 302 跳转且 Location 指向管理页、响应正文里出现“欢迎”“退出登录”“控制台”等关键字、Set-Cookie 里出现 sessionid 或 admin 标识、响应体长度明显大于登录页本身的长度。工具内置的判定规则组合越多,误报越少,这就是为什么有些工具扫得准、有些工具满屏红色其实全是误报。
2.3 WebCrack 的适用边界:什么后台能测,什么后台测不动
适合的目标很典型:老 PHP 系统、ASP 后台、常见 CMS、网络设备管理页、运维面板,这些系统的登录方式就是简单表单提交,没有太多前端校验,字典逐条试就能试出结果。对这类目标,弱口令批量检测几乎是投入产出比最高的检查手段,一个几百行的口令字典,能把一个中等规模后台列表扫出可观的风险点。
测不动的目标也很典型:强制验证码且工具识别不了的系统、登录带动态 token 的系统、双因子认证、SSO 统一登录。这些系统的登录不只是“表单提交”,还夹带了一次性身份验证,弱口令工具没有上下文,只能停在“识别失败”或者“请求被拒绝”。不是说这些系统没有弱口令风险,而是这类工具不擅长处理,你硬跑只会收获一堆无意义的失败请求,还可能触发风控。
还有一个边界很多人忽略:网络连通性。如果目标都在内网,工具必须放在能访问内网的那台巡检机上跑,放在你自己的电脑上连不上就等于白跑。跑之前先手动打开一两个目标地址确认可达,再上批量,这是最基础的准备工作。
注意:批量检测本质上是对登录接口发起大量请求,没有授权的目标会触发风控,也会带来法律风险。我一般只对两类目标用:自己负责维护的系统、有书面授权的测试范围。这个前提比任何参数都重要。
3. 从零跑通一次批量检测:目标清单、字典、命令与结果复核
这一章是能直接抄作业的部分。整个流程分三步:准备目标清单、跑批量检测、对结果做二次验证。每步都有具体命令和参数说明,你照着改改路径就能用。
3.1 准备目标清单:一行一个后台地址,协议和路径不能省
WebCrack 的输入是后台地址清单,格式约定是一行一个 URL。我在实际使用中习惯先把分散在笔记、表格、资产清单里的后台入口统一收集到一个文本文件里,再过滤出真正的登录地址。
# 从原始地址列表中提取候选后台入口并去重 grep -Ei 'login|admin|manage|system|console' raw_input.txt \ | sort -u \ | sed 's/^[[:space:]]*//' > targets.txt # 统计最终目标数量,确认清单不空 wc -l targets.txt这段命令的逻辑是:用 grep 过滤包含 login、admin、manage 等关键字的地址,sort -u 去重,sed 去掉行首空格,最后输出到 targets.txt。wc -l 看一眼数量,通常几十条后台地址是正常体量,如果只有两三条,检查是不是过滤条件太严。
清单里的 URL 必须带协议和完整路径,比如http://192.0.2.10/admin/login.php,不能只写 IP,因为工具要靠协议判断走 HTTP 还是 HTTPS,端口也要写清楚,特别是那些跑在 8080、8443 上的后台。路径尽量精确到登录页地址,而不是首页,工具虽然有自动探测能力,但从登录页开始测成功率最高。
3.2 跑一次批量检测:最小命令与参数解读
目标清单和密码字典准备好之后,就可以跑了。下面是一个最小可用的调用方式,实际参数名以你手上那个版本的-h帮助输出为准,不同发行版的参数风格会有差异。
# targets.txt 每行一个后台登录地址 # dict.txt 每行一个候选口令,推荐"用户名 密码"两列 ./webcrack -f targets.txt -w dict.txt \ --max-threads 8 \ --timeout 15 \ --random-ua \ --output report.csv参数含义:-f指定目标清单文件,-w指定口令字典文件,--max-threads控制并发请求数,--timeout是单个请求的超时时间,单位秒,--random-ua让每个请求带随机 User-Agent 头,--output指定结果输出文件。
跑之前做两件小事:第一,确认字典格式和工具预期一致,我一般用“用户名 密码”两列,空格分隔,少数工具只接受“每行一个密码”然后固定用 admin 去试;第二,确认运行环境能连到目标网络,目标在内网就把工具放到内网巡检机上跑。跑的过程中不要开太多其他高并发任务,免得干扰结果。
3.3 结果解读与二次验证:别直接信报告
工具输出的 report.csv 一般会包含 URL、用户名、密码、判定依据这几列。但工具判定“能登录”不等于真的能登录,误报在弱口令场景里很常见,所以我拿到结果后一定会做一次二次验证,把工具判定的结果用脚本重放一遍。
# 二次验证脚本:把工具判定为成功的结果用真实请求重放一次 import csv import requests with open("report.csv", encoding="utf-8") as f: for row in csv.DictReader(f): url = row["url"].strip() username = row["username"].strip() password = row["password"].strip() # 构造登录参数,字段名按目标后台的实际表单修改 data = {"username": username, "password": password} try: r = requests.post(url, data=data, timeout=10, allow_redirects=False) # 判定通过的特征:302跳转、响应出现后台关键字 if r.status_code in (301, 302): print(f"[确认] {url} -> {username}/{password}") elif "退出" in r.text and "欢迎" in r.text: print(f"[确认] {url} -> {username}/{password}") else: print(f"[复核] {url} -> 需人工确认") except requests.RequestException: print(f"[跳过] {url} 请求异常")这段脚本的逻辑是遍历报告中的每一条结果,用 requests 库重新提交一次登录请求,然后根据响应特征判断是否真的登录成功。allow_redirects=False 是为了看原始响应状态码,如果后台登录成功会返回 302 跳转,这个特征比正文关键字稳定。脚本里判定特征只有两条,实际上你可以根据目标后台的具体表现加更多规则。
二次验证这步不能省,尤其是结果里有大批“成功”的时候。我见过一次很典型的例子:工具把登录失败后返回的“账号不存在”页面判定成了成功,因为那个页面里恰好包含“欢迎”两个字,脚本复核直接把这一批全过滤掉了。这就是先跑工具、再写复核脚本的价值。
4. 参数怎么调:线程、超时、重试与断点续跑的工程化配置
批量检测工具第一次跑通很容易,但要把参数配到“又快又不被限制、中断了还能接着跑”,就得理解这几个参数之间的关系。这一章讲的是我在实际使用中沉淀下来的配置习惯,按目标类型区分,直接对照着改。
4.1 线程与超时怎么配:快与稳之间的平衡
线程数决定并发请求量,直接影响扫描速度和被封风险。我常用的配置参考如下:
| 目标类型 | 线程数 | 超时时间 | 说明 |
|---|---|---|---|
| 内网自研后台 | 8-16 | 10-15 秒 | 内网延迟低,响应快,可以放开并发 |
| 公网后台 | 4-8 | 15-20 秒 | 公网链路不稳,超时给宽松些 |
| 老设备/老路由器管理页 | 2-4 | 15 秒 | 老设备接口脆弱,并发高了容易崩 |
线程数不是越大越好。有一次我把线程开到 32 去测一批公网后台,结果跑了三分钟就收到一堆超时和连接重置,后来查原因,是目标所在的网关设备扛不住大量并发连接,直接把请求全丢了。内网目标相对耐造,公网目标建议保守一点。超时时间的设置也讲究:设太短,慢响应目标全被误判成“无法连接”;设太长,单个目标卡住就会拖慢整体进度,15 秒是个比较稳的中间值。
4.2 延迟、重试与随机 UA:降低存在感的三个手段
批量检测本质是对登录接口发起大量请求,目标系统很容易感知到异常,表现为连接被重置、返回 429 Too Many Requests、IP 被封。降低存在感的常见做法是加延迟、加重试、用随机 User-Agent。
# 带延迟与重试的稳定版参数 ./webcrack -f targets.txt -w dict.txt \ --max-threads 4 \ --timeout 15 \ --delay 0.5 \ --retry 2 \ --random-ua \ --output report.csv--delay 0.5的意思是每个请求之间至少间隔 0.5 秒,把请求节奏从“爆发式”变成“均匀式”,这个参数对减少触发限流非常有效。--retry 2是请求失败后重试 2 次,避免网络抖动造成误判。--random-ua让每个请求带不同的浏览器 User-Agent,防止目标按 UA 维度做频率统计。
这三个参数组合起来的实际效果是:扫描速度会慢一些,但扫描过程的“存在感”低很多。跑公网目标时我基本固定用这套组合,跑内网时可以去掉延迟,内网环境相对可控,不需要刻意隐藏节奏。
4.3 断点续跑与结果留档:让批量检测可中断、可复查
批量检测最怕跑到一半中断,重新从零开始。避免这个问题有两个习惯:一是把结果输出成 CSV 并且定时保存,二是跑之前留好日志。CSV 本身就是断点状态,重新跑的时候,工具一般支持跳过已经测过的目标或者已经验证过的口令组合,具体参数看版本帮助,但理念是通用的:不重复测试已完成的条目。日志文件用来记录每次扫描的起止时间和进度,中断后一眼能看出跑到哪个目标,不需要靠猜。
我还会在每次扫描前把目标清单和字典的校验值记下来,连同工具版本一起写进日志开头。这样过几个月回看报告时,能说清楚“当时用了哪个字典、扫了哪些目标”,不会变成黑匣子。这个习惯在复查和整改时特别有用,别人问你“这个结果是什么时候扫的、用的什么字典”,你能直接翻出来。
5. 实战避坑:WebCrack 用的 5 种常见翻车场景与排查方法
参数配置正确不代表一定能拿到可靠结果,批量检测工具的翻车点集中在五个方向:目标没反应、误报成片、万能密码全失效、被限流封禁、字典有口令却测不出。每条都是实际使用中反复见过的场景,按“现象 → 原因 → 解决”整理如下。
5.1 后台地址扫了没反应,不是没漏洞,是登录请求发错了
现象是某个后台地址在工具里显示“无结果”,但手动打开浏览器却能看到登录页,手工试弱口令也能登录上。
原因是工具没有正确识别登录请求。常见情况有三种:登录表单的提交路径不是当前页面,而是另一个接口;登录按钮用 JavaScript 拼接参数,表单里没有完整的输入框定义;用户名和密码字段名不是标准的 username/password,工具猜不到。工具测不到,不等于后台没有弱口令风险。
解决方法是先用浏览器开发者工具手动登录一次,在 Network 面板里看真实的登录请求 URL、请求方法和参数名,然后把目标地址和字段名按实际请求改好再测。如果工具支持手动指定登录参数,直接填上,比让它猜可靠得多。
5.2 满屏“成功”,二次验证全挂,误报的根源是判定规则太宽
现象是报告里几十条结果都显示“登录成功”,二次验证时发现大部分根本登不进去。
原因是工具的登录成功判定规则过于宽泛,比如把 HTTP 200 当成成功、把响应包含某个常见词当成成功。很多登录失败页面也会返回 200,只是正文里写着“密码错误”,如果工具只按状态码判断,就会把失败的请求全部标成成功。
解决方法是先小范围试一下工具判定成功的依据,再决定要不要用全套结果。我的习惯是先对 3 到 5 条结果做二次验证,如果命中率低于五成,就检查工具的输出日志,看它是按什么特征判定的,能调规则就调规则,不能调就把工具结果当“候选清单”,用复核脚本过滤一遍再进入整改流程。
5.3 万能密码全军覆没,不是字典不行,是后台早就不拼 SQL 了
现象是工具里内置的一批万能密码 payload 在所有目标上全部失败,没有一条命中。
原因是现在的后台系统普遍使用参数化查询或 ORM 框架,用户输入被当作数据处理,不再直接拼接进 SQL 语句。万能密码这类绕过方式只对早期拼接 SQL 字符串的老系统有效,在新系统上就是一段普通文本,自然没有任何效果。
解决方法是把检测重心从万能密码转移到默认口令和弱口令上。万能密码可以作为老系统的补充测试,但不要指望它能出结果。如果你的目标清单里都是近几年部署的系统,把时间和并发额度让给口令字典,收益高得多。
5.4 跑一半被限流封禁,请求全变成 429 或 403
现象是扫描过程中段,后面的目标全部返回 429 Too Many Requests 或 403 Forbidden,有些后台甚至直接把你所在的 IP 拉黑一段时间。
原因是目标有登录失败次数限制或 WAF 防护,短时间内大量失败请求触发了封禁策略。有些后台的规则是 5 分钟内失败超过 10 次就锁定来源 IP,批量检测很容易触发。
解决方法是分段跑,把目标清单拆成几批,每批跑完停一会儿再继续;同时把线程数调低,加上延迟参数,让请求频率降到目标系统的阈值以下。公网目标我一般控制在每秒不超过 2 个请求,如果目标有明确的失败锁定策略,还要控制每个目标只试少量口令,发现连续失败就跳过,等后续再处理。
5.5 字典里明明有正确口令却测不出,编码和字段名是最常见的原因
现象是手工登录时发现某个口令能登录,但工具扫描结果里没有这一条,字典里确实包含这个口令。
原因是编码不一致或参数格式不对。最常见的坑是目标后台页面是 GBK 编码,工具按 UTF-8 发送请求,口令里的中文或特殊字符被转成乱码;还有登录数据格式不是表单编码,而是 JSON,工具默认按表单格式发送,字段对不上当然失败。
解决方法是先抓包确认真实请求体的编码和格式。如果目标用 JSON 接收登录数据,看工具是否支持指定请求体格式;如果涉及中文口令,确认工具发送前是否按目标页面编码做了转换。之前遇到过一个后台,用户名密码字段名是 user_login 和 pwd,工具默认认 username/password,怎么测都失败,手动指定字段名后一次就过了。
6. 检测完不是终点:结果分级、修复跟踪与“先窄后宽”的巡检习惯
批量检测出报告只是开始,真正有价值的是后面两步:把结果变成可执行的修复项,以及建立能重复运行的巡检机制。这一章讲我实际用的三个习惯。
6.1 结果分级:按风险类型决定修复优先级
拿到确认过的结果后,我先把口令按类型分级:默认口令未修改是最危险的,意味着系统出厂后没人管过,优先处理;万能密码命中说明认证逻辑有漏洞,不能只改口令,要从代码层面修复;弱口令命中说明管理员安全意识不足,改口令加复杂度策略就行。
# 简单分级:把报告里的结果按密码特征分类,便于派单和跟踪 awk -F, 'BEGIN{OFS=","} /admin[123]?$/ {print $0, "默认口令-高危"} /123456|password/ {print $0, "弱口令-中危"} /or .1.=.1/ {print $0, "万能密码-高危"}' report.csv > graded_report.csv这段脚本按口令特征给每条结果加一个风险等级列。实际分级规则可以更细,但核心思路是一样的:先处理高危,再处理中危,让有限的人力优先解决影响最大的问题。
6.2 修复跟踪与回归复测:改了没改,要跑一次才知道
整改动作下发后,确认修复是否生效的唯一方式是复测。复测时要注意:把已经确认过的口令组合从字典里剔除,只测“应该失效”的条目,避免用旧口令重复命中。有些后台改完口令后,旧口令会保留在历史口令里一段时间,复测看到仍可登录不要慌,先确认是不是口令复用策略的问题。
6.3 一个提高效率的小习惯:先窄后宽的两段式扫描
完整大字典直接全量扫描,又慢又容易触发封禁。我现在用的方式是两段式:第一段用弱口令 Top 100 的小字典把所有目标快速扫一遍,筛出有基础风险的;第二段只对第一段命中的目标用更大字典深挖,防止漏掉那些“有点安全意识但口令仍不够强”的目标。这样既控制了对目标的请求量,又不会漏太多风险。
这几年的感受是:弱口令问题永远不会消失,总有人在某个角落把口令设成 admin/123456,批量检测的价值不是测一次,而是把它变成定期巡检的一部分。我以前就有一次图省事,把线程开到 32 跑内网,结果把一台老后台跑崩了,恢复服务比扫描本身耗时还长,从那以后配置参数再也没激进过。希望这套流程和这些踩坑记录能帮到你,至少让你少折腾几次。
本文还有配套的精品资源,点击获取