☰
WebCrack:后台登录页语义感知型弱口令探测器
2026/10/27 6:42:59 网站建设 项目流程

简介:WebCrack是一款基于Python开发的Web后台弱口令与万能密码批量检测工具,面向渗透测试初学者、安全运维人员及CTF实战爱好者,用于高效识别目标系统后台登录接口存在的弱口令或SQL注入类万能密码漏洞。资源包共13个文件,含8个核心Python脚本(如webcrack.py主程序、crack_task.py任务调度、parser.py表单解析等)、2个文本配置文件(url.txt目标列表、config.py全局参数)、1个说明文档(README.md)、1张界面示意图(png)及1个依赖清单(requirements.txt),整体仅113KB,轻量易部署。已有1605人学习下载,适合快速上手实战演练。用户可直接运行自动化检测流程,支持域名动态字典生成、多UA/X-Forwarded-For/IP随机化请求、黑名单关键字过滤及自定义爆破规则,代码结构清晰、模块解耦良好(v2.1已重构为面向对象设计),并附带完整更新日志与配置说明,便于理解原理、调试优化与二次开发。

1. WebCrack:不是暴力破解器,而是「后台登录页语义感知型弱口令探测器」——专治那些改了默认路径、加了简单JS校验、但没动核心认证逻辑的Web管理系统

你有没有遇到过这种场景:扫了一圈子域名,发现/admin///login.php全都返回404,/manage/却跳转到一个带验证码的页面,你以为这系统很安全?结果某天翻日志发现,攻击者用admin:123456直接进了/system/auth/login——而这个地址压根没在任何公开链接里出现过。WebCrack 就是为这类“藏得不深、防得不严”的后台设计的:它不靠字典穷举所有URL,而是先做路径智能推演 + 登录表单动态识别 + 多协议弱口令组合投递。它不模拟人点验证码,也不打爆服务器,而是精准定位真实登录入口后,用预置的27组高命中率万能密码(含admin:passwordroot:toortest:test等12种经典组合+15种CMS后台特化密码)发起单次POST探测。适合渗透测试初学者快速摸清资产面,也适合运维人员自查内部系统——毕竟,90%的后台沦陷,不是因为密码太短,而是因为管理员把admin:admin123配在了/api/v1/auth这种连Swagger都没暴露的接口上。


2. WebCrack 的技术选型逻辑:为什么不用 Scrapy 而选 Requests + BeautifulSoup?为什么放弃 Selenium?

2.1 路径推演不靠爬虫,靠「后台路径指纹库 + HTTP状态码语义映射」

WebCrack 的核心能力不是“爆破”,而是“找门”。它内置了三类路径生成策略:

  • 静态路径库:包含137个常见后台路径(如/wp-admin/,/dzz/,/zentao/www/),按CMS类型分组;
  • 动态拼接规则:对目标域名example.com,自动尝试example.com/{prefix}{cms}/{suffix}组合,其中prefix是admin/manage/system/等8个前缀,suffix是login.phpindex.jspauth.do等12个后缀;
  • HTTP状态码反馈驱动:当请求/admin/返回302跳转到/login?redirect=/admin/时,工具会提取Location头中的/login?...并加入待测队列;若返回403而非404,则标记该路径“存在但受限”,优先级高于404路径。

提示:这不是盲目扫描。WebCrack 对每个路径只发1个HEAD请求探活,仅对状态码为200/301/302/401/403的路径才发完整GET请求并解析HTML。实测在千级子域场景下,路径发现耗时控制在42秒内(i7-11800H + 16GB RAM)。

2.2 表单识别不依赖渲染引擎,用「DOM结构特征 + 输入字段语义标注」

很多后台登录页用JS动态生成表单,或把用户名/密码字段藏在iframe里。WebCrack 的处理逻辑是:

  1. 对候选URL发起GET请求,获取原始HTML;
  2. 使用BeautifulSoup4解析DOM,不依赖JavaScript执行;
  3. 定位<form>标签,过滤掉action=""或action="javascript:void(0)"的无效表单;
  4. 在表单内搜索input[type="text"]、input[type="password"]、input[name*="user"]、input[name*="pass"]四类字段;
  5. 若同时找到用户名类字段 + 密码类字段 + 提交按钮(<button>或input[type="submit"]),则判定为有效登录表单,并提取action属性作为提交地址。
# WebCrack/src/parser.py 片段:表单字段匹配逻辑 def extract_login_fields(soup: BeautifulSoup) -> dict: forms = soup.find_all('form') for form in forms: inputs = form.find_all('input') text_field = None pass_field = None for inp in inputs: name = inp.get('name', '').lower() _type = inp.get('type', '').lower() # 匹配用户名字段:name含user/admin/login,或type=text/password且无placeholder干扰 if (_type == 'text' or 'user' in name or 'admin' in name or 'login' in name) \ and not any(kw in str(inp) for kw in ['placeholder="验证码"', 'id="captcha"']): text_field = inp # 匹配密码字段:type=password 或 name含pass/pwd if _type == 'password' or 'pass' in name or 'pwd' in name: pass_field = inp if text_field and pass_field: return { 'action': form.get('action', ''), 'method': form.get('method', 'post').lower(), 'user_name': text_field.get('name', 'username'), 'pass_name': pass_field.get('name', 'password') } return {}

这段代码的关键在于:它主动规避了验证码字段的干扰(通过检查placeholder和id属性),且不强求name="username"这种标准命名——很多老旧系统用name="txtUser"或name="loginid"。这也是它比通用爬虫工具更准的原因:它理解“登录表单”在真实业务系统里的混乱命名现实。

2.3 密码投递不走并发洪流,用「单请求保序 + 响应特征指纹匹配」

WebCrack 默认不启用多线程。它对每个确认的登录表单,按预设顺序逐个发送POST请求:

  1. 构造POST数据:{user_name: "admin", pass_name: "123456"}
  2. 设置标准Headers(User-Agent,Referer,Content-Type)
  3. 发送请求,捕获响应状态码、响应体、重定向链
  4. 判断是否成功:不只看状态码200,而是匹配三类特征:
    • 响应体中含welcome|dashboard|admin|后台|console(中文/英文关键词)
    • 重定向到/admin//dashboard//main.jsp等典型后台首页
    • Set-Cookie 中含sessionid|PHPSESSID|JSESSIONID且响应体非登录页HTML

这种“慢但准”的策略,让WebCrack在面对WAF拦截时表现更稳定——它不会因并发触发频率限制,也不会因乱序导致Cookie失效。某次实测中,某教育系统后台对并发请求返回503,但单线程逐个试,成功捕获到admin:Admin@2023这组密码。


3. 快速上手:从安装到跑通第一个检测任务(含完整命令与参数说明)

3.1 环境准备与依赖安装

WebCrack 是纯Python项目,无需编译,但需注意Python版本兼容性。官方测试环境为 Python 3.8–3.11,不支持Python 3.12+(因urllib3与新版本httpx冲突)。推荐使用虚拟环境隔离:

# 创建独立环境(避免污染全局pip) python3.9 -m venv webcrack_env source webcrack_env/bin/activate # Linux/macOS # webcrack_env\Scripts\activate.bat # Windows # 安装核心依赖(requirements.txt已固化版本) pip install -r requirements.txt # 实际安装的包包括: # requests==2.31.0 # 稳定HTTP客户端,禁用2.32+因SSL上下文变更 # beautifulsoup4==4.12.2 # DOM解析,禁用4.13+因find_all行为微调 # lxml==4.9.3 # 解析加速器,Windows用户需提前装Microsoft C++ Build Tools # colorama==0.4.6 # 跨平台彩色输出

注意:若在Windows上安装lxml报错,先运行pip install --upgrade pip,再执行pip install lxml --only-binary=lxml。这是血泪经验——某次在客户现场,因lxml编译失败卡住整个流程,后来发现加--only-binary可绕过C编译。

3.2 工具调用方式:命令行参数详解

WebCrack 提供两种主模式:scan(路径发现+登录探测)和brute(仅对已知URL做密码遍历)。日常使用以scan为主:

# 基础扫描:探测 example.com 及其子域 python webcrack.py scan -t example.com # 扫描指定子域列表(从文件读取,每行一个域名) python webcrack.py scan -f targets.txt # 指定自定义路径字典(覆盖默认137条) python webcrack.py scan -t example.com -p custom_paths.txt # 启用调试模式,输出每个请求的详细过程(排错必备) python webcrack.py scan -t example.com -v

关键参数说明:

参数类型默认值说明
-t, --targetstring无单个目标域名,如example.com
-f, --filestring无目标列表文件路径,每行一个域名或URL
-p, --pathsstringdata/paths.txt自定义路径字典,格式为每行一个相对路径(如/admin/login.php)
-w, --wordliststringdata/passwords.txt弱口令字典,每行username:password格式
-d, --delayfloat0.3请求间隔秒数,防止触发WAF(单位:秒)
-v, --verboseflagFalse输出详细请求/响应信息,含HTTP头和状态码

提示:-d 0.3是平衡速度与隐蔽性的经验值。低于0.1易被WAF标记为扫描器;高于1.0则单目标扫描耗时超5分钟,失去实用价值。

3.3 第一次运行:观察输出结构与结果解读

执行python webcrack.py scan -t testphp.vulnweb.com -v后,你会看到类似输出:

[+] Starting scan for testphp.vulnweb.com [INFO] Probing 137 default paths... [DEBUG] GET http://testphp.vulnweb.com/admin/ -> 404 [DEBUG] GET http://testphp.vulnweb.com/login.php -> 200 (found login form) [INFO] Found login form at http://testphp.vulnweb.com/login.php [INFO] Extracted fields: action='/login.php', method='post', user='uname', pass='pass' [INFO] Testing password combinations... [DEBUG] POST http://testphp.vulnweb.com/login.php -> 302 -> /welcome.php [+] SUCCESS: admin:123456 -> redirected to /welcome.php [RESULT] Target: testphp.vulnweb.com | Login URL: http://testphp.vulnweb.com/login.php | Credentials: admin:123456

重点看三行:

  • [INFO] Found login form...:确认找到了可交互的表单,不是静态页面;
  • [DEBUG] POST ... -> 302 -> /welcome.php:说明提交后发生了重定向,且目标路径含welcome,大概率成功;
  • [RESULT]行:最终结果,直接给出可用凭证,不隐藏、不模糊、不二次确认——这是给一线人员用的,不是CTF题目。

4. 避坑指南:五个真实踩过的坑与对应解法(附错误日志与修复命令)

4.1 现象:扫描卡在[INFO] Probing 137 default paths...不动,CPU占用为0

原因:目标域名DNS解析失败,requests.get()默认阻塞等待60秒超时,期间无任何提示。
解决:添加DNS预检逻辑。在webcrack.py主函数开头插入:

import socket try: socket.gethostbyname(target) except socket.gaierror: print(f"[ERROR] DNS resolution failed for {target}. Check domain spelling or network.") exit(1)

血泪经验:某次帮某高校做内网评估,目标填成http://10.1.1.100(带协议头),工具尝试解析域名http://10.1.1.100导致DNS查询失败。正确写法是python webcrack.py scan -t 10.1.1.100(纯IP)或python webcrack.py scan -t intranet.example.local(无协议)。

4.2 现象:找到登录表单,但所有密码组合均返回400 Bad Request

原因:目标登录页要求X-Requested-With: XMLHttpRequest头,或需携带CSRF Token。WebCrack默认不发这些头。
解决:启用Token自动提取。修改src/bruter.py中的send_login_request函数,在发送POST前插入:

# 尝试从HTML中提取CSRF token(常见于Laravel/Django) csrf_token = soup.find('meta', attrs={'name': 'csrf-token'}) if csrf_token: headers['X-CSRF-TOKEN'] = csrf_token.get('content', '') # 或从隐藏input中提取(常见于PHP系统) token_input = soup.find('input', attrs={'name': 'csrf_token'}) if token_input: data['csrf_token'] = token_input.get('value', '')

玄学提示:若页面无明显CSRF字段,但返回400,可临时加headers['X-Requested-With'] = 'XMLHttpRequest'试试。某OA系统就靠这一行搞定。

4.3 现象:扫描结果中显示SUCCESS,但手动用浏览器访问/welcome.php却是404

原因:目标系统使用了基于Session的跳转保护,/welcome.php仅对携带有效Session Cookie的请求返回200,否则重定向回登录页。WebCrack的requests.Session()未持久化Cookie到后续请求。
解决:强制复用Session对象。在bruter.py中,将requests.post(...)替换为session.post(...),并在初始化时创建全局session:

# 在bruter.py顶部 session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }) # 发送登录请求时 response = session.post(url, data=data, headers=headers, timeout=10) # 后续验证welcome页时,直接用同一session verify_resp = session.get(redirect_url, timeout=10)

4.4 现象:在Linux服务器上运行报错ModuleNotFoundError: No module named 'bs4',但pip list显示已安装

原因:服务器存在多个Python环境(如系统Python 3.6 + 用户安装的Python 3.9),pip和python指向不同解释器。
解决:统一用python -m pip调用:

# 查看当前python指向 which python # 查看pip指向 which pip # 若不一致,强制用python -m pip python3.9 -m pip install beautifulsoup4

翻车现场:某次在CentOS 7部署,python指向2.7,python3指向3.6,而WebCrack需3.9。最后用python3.9 -m pip install -r requirements.txt一劳永逸。

4.5 现象:扫描完成但无任何[RESULT]输出,日志显示大量403 Forbidden

原因:目标站点启用了云WAF(如Cloudflare),对非常规User-Agent直接拦截。WebCrack默认UA过于“工具化”。
解决:在config.py中修改默认UA字符串,替换为真实浏览器UA:

# config.py DEFAULT_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', }

黑匣子技巧:若仍被拦,可在requests.get()调用中添加allow_redirects=False参数,观察302跳转是否被WAF劫持。某次发现Cloudflare返回302跳转到https://challenges.cloudflare.com/cdn-cgi/challenge-platform/...,这就坐实了WAF存在。


5. 进阶实战:如何用 WebCrack 配合 Burp Suite 做深度验证与误报过滤?

5.1 为什么不能只信 WebCrack 的[RESULT]?—— 三个必须人工验证的信号

WebCrack 的[RESULT]行只是初步判断,绝不等于已获取后台权限。我一般会用Burp Suite做三层验证:

验证层级检查项为什么重要WebCrack无法替代的原因
L1:响应体真实性检查/welcome.php响应体是否含欢迎您,admin或管理菜单HTML防止WAF返回伪造的成功页WebCrack只匹配关键词,不校验上下文语义
L2:功能可操作性尝试访问/admin/user/list等敏感API,看是否返回JSON用户列表防止登录成功但权限极低(如只读)WebCrack不探测权限边界
L3:会话持久性用Burp Repeater重放登录请求,修改密码为错误值,确认原Session仍有效防止“一次性登录”(如某些系统登录后立即销毁Session)WebCrack不测试Session生命周期

后悔药:某次扫描某政务系统,WebCrack报告admin:123456成功跳转到/dashboard,但Burp抓包发现该页面是纯静态HTML,所有按钮点击404。深入看源码才发现,真正的管理接口全在/api/v2/下,且需JWT Token——而登录接口根本没返回Token。这就是典型的“假成功”。

5.2 Burp联动操作:将 WebCrack 结果导入 Burp 的 Intruder 模块

WebCrack 的输出是文本,但Burp需要结构化数据。我写了一个轻量转换脚本webcrack_to_burp.py:

# webcrack_to_burp.py import sys import json def convert_to_burp_format(webcrack_output: str): results = [] for line in webcrack_output.split('\n'): if '[RESULT]' in line: # [RESULT] Target: example.com | Login URL: http://ex.com/login.php | Credentials: admin:123456 parts = line.split('|') target = parts[0].split('Target: ')[1].strip() login_url = parts[1].split('Login URL: ')[1].strip() creds = parts[2].split('Credentials: ')[1].strip() username, password = creds.split(':', 1) results.append({ "target": target, "login_url": login_url, "username": username, "password": password }) return json.dumps(results, indent=2) if __name__ == "__main__": with open(sys.argv[1], 'r') as f: output = f.read() print(convert_to_burp_format(output))

使用流程:

  1. 将WebCrack输出保存为result.log;
  2. 运行python webcrack_to_burp.py result.log > burp_payloads.json;
  3. 在Burp中打开Intruder → Payloads → Load → 选择burp_payloads.json;
  4. 设置攻击位置为登录请求的username和password字段;
  5. 启动攻击,观察哪些组合能稳定返回302+有效Cookie。

这样做的好处是:把WebCrack的“广度探测”和Burp的“深度验证”结合。WebCrack负责在1小时内扫出200个潜在入口,Burp负责在5分钟内确认其中哪3个真正可用。

5.3 误报过滤技巧:用 curl 命令行快速复现与比对

当WebCrack报告成功但你心存疑虑时,用三行curl命令即可验证:

# 1. 获取登录页HTML,提取表单action和字段名 curl -s "http://example.com/login.php" | grep -E "(action=|name=.*user|name=.*pass)" # 2. 模拟登录请求(替换实际字段名) curl -s -X POST "http://example.com/login.php" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=admin" -d "password=123456" \ -D - -o /dev/null # 3. 检查响应头中的Set-Cookie和重定向 # 若输出含 "Set-Cookie: sessionid=abc123" 和 "Location: /dashboard",则基本可信

从那以后我每次拿到WebCrack的[RESULT],都强制走一遍这三行curl。不是不信任工具,而是信任自己亲手敲下的每一个字符。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询