尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

WebCrack实战:弱口令批量检测与万能密码绕过原理

WebCrack实战:弱口令批量检测与万能密码绕过原理 简介WebCrack是一款面向网站安全审计与渗透测试场景的开源免费工具主要用于对Web后台常见弱口令及万能密码进行批量检测帮助管理员提前发现登录入口的脆弱点适合安全工程师、运维人员及合规测试学习者使用。压缩包共18个文件大小仅114KB其中12个Python脚本承担核心爆破、解析与任务调度逻辑3个txt文档提供默认字典与URL配置另有README说明及示意图片结构清晰便于二次开发。已有406人浏览学习。通过阅读源码和配置文件可以掌握弱口令字典构造、并发请求参数调整以及结果日志解析等思路借助项目自带的密码字典与输入输出模块可直接替换目标地址展开受控环境下的合规测试也可作为学习Python安全脚本编写的完整范例兼顾实用性与教学价值。1. WebCrack 到底是什么开源的 web 后端弱口令批量检测工具先说结论WebCrack 不是扫描器是一个跑在 Python 环境里的 web 后端登录爆破器。它把“目标地址 用户名列表 密码字典”三者组合起来自动发 HTTP 请求通过返回内容判断是否登录成功并且额外集成了一批万能密码 payload 用于测试后台登录接口的注入式绕过。开源免费命令行驱动适合批量验证内网或授权项目的后台弱口令风险。它解决的核心问题很具体当你有几十个后台地址要检查时手工一个一个试密码是不现实的而 WebCrack 这类工具能把“弱口令检测”这件事做成半自动流水线。适用人群是安全测试、运维、开发自测前提是目标授权明确。它并不能发现未知漏洞也不是爬虫必须由你先给定后台登录 URL 和用于判断登录成功的特征。把这件事想清楚后面用起来才不会翻车。2. 快速上手先跑通最小命令再谈批量爆破2.1 环境准备Python 版本与依赖安装WebCrack 常见实现基于 Python 3依赖 requests、beautifulsoup4 这类 HTTP 解析库。安装依赖之前先确认 Python 版本避免在 2.7 环境里折腾半天发现语法不兼容。python3 --version pip3 install requests beautifulsoup4逻辑说明第一条命令确认解释器版本第二条把 HTTP 客户端和 HTML 解析库装上。requests 负责发送登录请求beautifulsoup4 用于从响应里提取提示信息。如果你用的发行版自带 python3-requests 系统包也可以用 apt 或 yum 安装但我一般建议用 pip 装到虚拟环境里省得污染系统环境。参数说明这里没有指定版本号因为工具本身对依赖版本不敏感。若你本机已有旧版 requests出现响应乱码时再升级不迟不必提前锁版本。2.2 启动命令从单目标测试到批量模式WebCrack 命令行参数在大多数开源实现里遵循同一套风格目标文件、线程数、超时、延时、字典路径。先跑单目标确认逻辑通再上批量。python3 webcrack.py -u http://192.168.1.10/admin/login.php -U users.txt -P pass.txt -t 1 --timeout 8 --delay 1逻辑说明-u指定单个登录 URL-U指定用户名字典-P指定密码字典-t 1表示单线程--delay 1表示每次请求间隔 1 秒。第一次跑单线程是为了看输出格式确认工具能正确识别“登录失败”的页面特征避免批量时全是误报。参数说明--timeout 8是单次请求超时单位为秒。内网目标可以压到 5公网目标建议给到 10 以上避免网络抖动导致大量假超时。--delay是请求间隔批量时建议不低于 0.5 秒这个值是对目标服务器最基本的礼貌。2.3 确认批量目标文件格式批量模式用-f指定目标文件每一行一个后台登录地址。注意URL 必须带协议头且最好是完整的登录接口地址不是站点根目录。python3 webcrack.py -f targets.txt -U users.txt -P pass.txt -t 5 --timeout 8 --delay 0.5 --save result.txt逻辑说明-f targets.txt批量模式下从文件读取目标--save result.txt把成功条目写入结果文件。targets.txt 格式参考http://192.168.1.10/admin/login.php http://192.168.1.11/wp-login.php http://test.example.com:8080/user/login参数说明-t 5表示 5 个并发线程。线程数不是越大越好超过 10 之后目标服务器的连接数限制会触发大量连接失败。公网目标建议 3 到 5内网目标可以到 8 到 10视目标吞吐量调整。跑通最小命令之后你已经掌握了这个工具 80% 的日常用法。剩下的是理解它的判断逻辑以及知道为什么有些目标爆破结果不可信。3. 爆破原理与万能密码工具为什么能判断登录成功3.1 登录请求的构造逻辑后端登录爆破工具要解决的核心问题有三个表单参数名是什么、密码字段叫什么、登录成功和失败在响应里怎么区分。WebCrack 的做法是先让用户提供示例请求或者自动从 URL 对应的 HTML 表单里解析 input 字段。import requests from bs4 import BeautifulSoup # 自动解析登录表单的字段名 def parse_form(url): resp requests.get(url, timeout8) soup BeautifulSoup(resp.text, html.parser) form soup.find(form) inputs {} for inp in form.find_all(input): name inp.get(name) if name: inputs[name] inp.get(value, ) # 常见登录表单会有 username / password 字段 return inputs # 构造登录请求 def try_login(url, username, password): data { username: username, password: password, } resp requests.post(url, datadata, timeout8, allow_redirectsFalse) return resp逻辑说明第一段从登录页 HTML 里解析出所有 input 字段名第二段用解析结果构造 POST 请求。allow_redirectsFalse很关键——很多后端登录成功后会 302 跳转到首页如果自动跟随跳转判断逻辑会被干扰。参数说明parse_form只适用于表单直出的传统后端。如果目标用 JavaScript 动态渲染登录框解析结果为空这种目标就需要把参数名手动写进配置文件。不要指望一条命令通吃所有前后端分离的项目。3.2 登录成功的判定特征关键字、状态码、跳转工具判断“这一组用户名密码是否有效”靠的不是猜测而是三种响应特征的组合。第一种是响应体中的关键字比如“欢迎”“dashboard”“logout”第二种是 HTTP 状态码比如登录失败返回 200 但带错误提示登录成功返回 302第三种是响应长度成功页和失败页的 HTML 体量通常差很多。正确密码响应: 302 - /admin/index.php (响应体 512 字节) 错误密码响应: 200 - 用户名或密码错误 (响应体 206 字节) 万能密码响应: 302 - /admin/index.php (响应体 512 字节)这是 WebCrack 这类工具判断的核心拿“正确登录”的响应特征作为基准批量测试时用同样的特征去比对。所以使用前最好先手工登录一次目标后台保存成功响应特征然后在工具配置里指定关键字为“logout”或“欢迎”比默认判断精准得多。3.3 万能密码为什么能绕过认证本质是 SQL 注入万能密码不是“一个密码通杀所有后台”而是一组利用后端 SQL 拼接漏洞的 payload。常见形式是 or 11和admin--前者让 WHERE 条件恒真后者把后续密码校验注释掉。WebCrack 内置的万能密码模块本质是把这些 payload 作为密码字典的一部分发送。# 内置万能密码表常见实现中的子集 universal_payloads [ or 11 --, or 11 #, admin --, or 11 --, 1 or 11, ]逻辑说明上面这段 payload 列表是工具里最常见的几种。关键在于后端代码里 SQL 语句是字符串拼接而不是参数化查询用户名和密码直接进入 SQL 条件闭合引号后注释掉剩余条件。WebCrack 批量发送时把每个 payload 当作密码用户名用admin或目标已知用户名。参数说明万能密码测试不需要完整字典只需要少量 payload 加高频用户名。很多内网后台用的是select * from user where name$name and pwd$pwd这种代码一条 or 11 --就能直接登进去。如果目标用 PDO 参数化查询万能密码模块会全部失败这本就是预期结果。3.4 漏洞原理的边界不要把万能密码想得太神万能密码有效的前提是后端存在 SQL 注入并且登录逻辑没有做二次校验。现在稍微规范点的框架默认参数化查询这个模块大概率一无所获。但老旧 PHP 项目、asp 项目、内部管理系统里这种问题仍然存在。WebCrack 把万能密码做成内置模块价值在于批量检测时不需要额外准备 payload 文件省去手工拼接的时间。实际使用中万能密码成功率远低于弱口令成功率。弱口令靠的是用户安全意识差万能密码靠的是代码写得糙。两个方向都测覆盖的是不同的风险面。4. 批量爆破的实操细节字典、线程与结果判定4.1 用户名字典和密码字典怎么准备弱口令爆破的成败有七成取决于字典质量。好的字典不是网上随便下载的千万级大字典而是符合目标业务场景的小字典。比如目标后台是 OA 系统用户名优先试 admin、administrator、sysadmin密码优先试 Admin123、a123456、1qazWSX。# 用户名列表 admin administrator sysadmin root test demo manager # 密码列表 admin 123456 admin123 Admin123 password 12345678 admin123逻辑说明上面两组内容是我常用的起步字典。用户名 7 个、密码 7 个组合 49 次请求单线程半分钟跑完先快速摸底。如果 49 次请求全失败再上大字典而不是一开始就拿 2000 万条密码的大字典做全量测试那等于让工具在做无用功。参数说明字典文件编码建议 UTF-8 无 BOM每行一个条目末尾换行。Windows 记事本保存的 UTF-8 BOM 会让第一个用户名变成\ufeffadmin导致登录请求带了不可见字符结果全部失败。这个问题我遇到不下五次排查时肉眼根本看不出来。4.2 并发数、超时和延时三个参数的调优逻辑批量爆破不是把线程调到最大就能跑得更快。目标服务器有连接数限制、有带宽限制、有 WAF 限速线程过高会换来大量超时和连接重置实际有效请求反而更少。目标类型 推荐线程数 推荐延时 推荐超时 内网后台 8-10 0.2-0.5s 5-8s 公网后台(无WAF) 5-8 0.5-1s 8-10s 公网后台(有WAF) 2-3 1-2s 10s逻辑说明上面这张参数表是我常用的配置组合。内网目标吞吐量高可以放开一点公网目标过了 WAF快速连续请求会触发封禁必须主动降速。判别目标有没有 WAF 很简单连续发 20 个请求后看是否出现验证码或 403。参数说明--delay在工具里通常只控制单个线程内请求间隔多线程下全局请求频率会乘以线程数。比如-t 3 --delay 1每秒大约 3 个请求而不是 1 个。4.3 输出结果与误报筛除爆破结束后工具会把判定成功的条目写进结果文件但“成功”不一定真的成功。响应体里包含“welcome”但只是页面公共部分的情况很常见这时需要二次验证。# 用结果文件里的账号密码手工登录一次确认是否真的能进后台 cat result.txt # 期望输出格式 http://192.168.1.10/admin/login.php [admin/Admin123] http://192.168.1.11/wp-login.php [admin/password]逻辑说明结果文件每一行是目标 URL 加账号密码这个文件是后续复核的清单。拿到结果后挑两个条目手工登录验证如果手工登录失败说明工具判定特征配置有误需要回去调关键字参数。参数说明部分实现支持--verify二次确认模式对成功条目再发一次请求并验证状态码。有就开没有就手工抽验不要直接信任全部结果。4.4 验证码和动态 token 处理带验证码的后台登录页面是 WebCrack 这类工具的克星。常见做法是检测到验证码图片后跳过该目标而不是试图去识别验证码。跳过是理性的为了一个弱口令检测去训练一套 OCR 模型投入产出比太低。处理思路分三种第一种是验证码只在连续失败后出现此时降低线程、加长延时可以避开触发机制第二种是每个登录页都有验证码工具基本无能为力只能标记跳过第三种是验证码但后端校验不严比如验证码不刷新、验证码不绑定会话这种情况下空验证码或固定验证码也可能通过可以手工改请求把验证码字段写成固定值。5. 避坑指南批量爆破翻车现场与排查清单5.1 目标数量太多导致线程假死现象、原因、解决现象批量任务跑到三分之一时输出日志停住不动进程还在但没有任何新请求发出。原因--timeout设置过短加上目标服务器慢速响应线程池里的线程全部卡在等待响应状态新任务排不上队。解决把超时从 8 秒放宽到 15 秒线程数降低一半。如果日志里大量出现ReadTimeout和ConnectionResetError说明不是工具问题是目标服务器已经扛不住直接停掉换更小的字典。5.2 全部目标返回“登录成功”误报的典型场景现象跑完一批目标结果文件里几十条记录全是“成功”手工验证却一条都进不去。原因登录失败页面和成功页面的响应体里含有相同的关键字工具默认用“用户名或密码错误”做失败特征但目标把错误提示写在了 JavaScript 变量里HTML 响应里没有这个字符串。解决先手工抓一个失败响应看实际失败特征是什么。比如失败时状态码是 200 且页面标题为“登录”成功时状态码是 302那就把判定条件改成“状态码为 302”而不是依赖页面内容。如果工具支持自定义成功关键字把成功页里特有的字符串填进去效果最稳。5.3 提示“No form found”登录页不是标准表单现象目标 URL 确认无误但工具报错找不到登录表单。原因前端框架渲染的页面HTML 里没有传统form标签input 全是 JavaScript 动态生成的。工具自动解析表单失败。解决手工抓包看登录请求把 POST 参数名和提交地址写进工具的配置模板。比如 Vue 项目常见提交格式是{username:xxx,password:xxx}的 JSON 格式此时工具默认的application/x-www-form-urlencoded请求头不可用要改成application/json。5.4 万能密码模块全军覆没不一定是工具问题现象内置万能密码跑完所有目标都是失败一条成功都没有。原因目标用了参数化查询或者登录接口是 API 网关转发后端逻辑里根本不存在 SQL 拼接。这不是工具坏了是这类脆弱点在当前目标上不存在。解决先用弱口令字典跑一遍确认弱口令有结果万能密码没结果的组合是合理的。如果弱口令也没有结果先回头检查字典和目标文件大概率是第一步就没走对。5.5 合规边界明确授权再跑别碰不该碰的系统这个必须要说清楚弱口令爆破工具天然带有攻击属性使用边界是所测目标已获得书面授权。未经授权对公网目标发起爆破属于违法行为这一点没有任何争议。内网测试也要先确认目标系统是测试环境还是生产环境生产环境爆破导致账号锁定、后台卡顿账都会算在测试者头上。做安全检测的正确姿势是先拿授权单再限定目标范围最后固定时间段执行。工具是放大器解决了批量效率问题但不会替你判断目标是否合法。6. 让批量爆破结果更可信二次验证与报告整理6.1 结果二次验证脚本过滤误报的实用办法爆破结束只是开始真正的产出是“可信的结果清单”。我习惯把 WebCrack 的输出结果再过一道验证脚本import requests with open(result.txt, r) as f: lines f.readlines() verified [] for line in lines: url, cred line.strip().split( [) username, password cred.strip(]).split(/) # 对成功条目逐一验证 data {username: username, password: password} resp requests.post(url, datadata, allow_redirectsFalse, timeout10) if resp.status_code 302 or /index in resp.headers.get(Location, ): verified.append((url, username, password)) print(f[OK] {url} {username}/{password}) else: print(f[FAIL] {url} 判定失败疑似误报)逻辑说明脚本重新对所有标记成功的条目发送真实登录请求用状态码 302 或跳转地址里的关键字做二次确认。这一步能过滤掉大部分工具误报。说明脚本里的status_code 302是我常测 PHP 项目时的行为不同后端可能返回 200 加首页内容按实际调整。参数说明allow_redirectsFalse在这里格外重要跟随跳转后状态码会变成 200丢失判断依据。如果你要验证的目标登录成功不跳转就把条件改成“响应体里面包含指定特征”。6.2 按网段批量测试的常用姿势目标不是单台服务器而是一个网段时需要先做资产梳理再喂给 WebCrack。常见做法是用 nmap 扫描网段内开放的 80/443/8080 端口然后把存活的 web 服务 URL 整理成 target 文件。# 扫描网段内 web 服务 nmap -p 80,443,8080,8443 -oG - 192.168.1.0/24 | grep open | awk {print $2} live_hosts.txt # 给存活主机拼上后台路径 while read ip; do echo http://${ip}/admin/login.php echo http://${ip}:8080/login done live_hosts.txt targets.txt逻辑说明第一段扫描网段里开放 web 端口的存活主机第二段给每个 IP 拼上常见后台路径。目标文件生成后交给 WebCrack 批量跑比手工维护列表省事得多。参数说明后台路径建议用登录入口聚合的思路包括/admin/login.php、/wp-login.php、/user/login等常见位置。不同框架的默认后台路径不一样这一步没有统一的答案只能按经验枚举。6.3 字典迭代与增量测试把爆破越做越准跑完一轮以后别急着删字典每次爆破的结果都是在给字典做反馈。某个目标系统用admin/Admin123登进去了说明该公司管理员偏好大小写加数字的组合后续在同类目标上优先试这种模式。我的习惯是维护一个“高频账号密码”小字典放进每次测试都会优先跑的那一组再配合一个大字典做兜底。先用小字典快速摸底没收获再上大字典整个流程在时间上的开销是可控的。爆破这一类工具用久了会形成一个直觉同一个后台系统如果小字典一轮跑下来完全无结果通常不是密码有多强而是登录接口做了额外的防护比如 IP 限速、账号锁定、加密传输。这时候换大字典没有意义应该回头分析请求构造和防护机制。如果你准备在自己的测试环境里长期使用 WebCrack还有一件值得做的事把每次跑完的结果按日期归档连同当时使用的字典版本一起保存。时间久了你会积累出一套针对不同框架的测试方案这才是批量爆破真正值钱的部分。希望这些经验能帮到你。本文还有配套的精品资源点击获取
返回列表