授权的 SQL 注入利用框架,针对 phpMyAdmin 中的 CVE-2020-5504,具备自动化数据库枚举、盲注、代理支持以及结构化报告功能,适用于渗透测试与安全研究。
用于识别和验证 phpMyAdmin 部署中 CVE-2020-5504 的授权安全测试与研究框架
负责任使用声明: 本项目仅适用于您拥有或明确授权评估的系统。未经书面许可和明确的测试范围,请勿将其用于公共、第三方或生产系统。
| CLI 输出 | 使用方法 |
|---|---|
![]() | ![]() |
CVE-2020-5504 是一个影响 phpMyAdmin 用户账户页面的 SQL 注入漏洞。根据 phpMyAdmin 官方公告,phpMyAdmin 4.x 系列中早于 4.9.4 的版本以及 phpMyAdmin 5.0.0 均受影响;公告建议 4.x 系列升级至 4.9.4 或更高版本,5.x 系列升级至 5.0.1 或更高版本。[1] 国家漏洞数据库记录显示,利用该漏洞需要有效的 MySQL 账户才能访问服务器。[2]
本项目为授权渗透测试、受控验证和安全研究提供了结构化的工作流程。它旨在帮助评估人员对目标进行指纹识别、验证目标是否疑似受影响、记录证据,并生成结构化报告以用于修复跟踪。
该框架围绕四个目标进行组织:
识别 phpMyAdmin 安装并收集与版本相关的指标。
验证 在可能的情况下,使用受控、非破坏性的检查来验证疑似暴露。
评估 使用可配置的限制、重试行为和可选代理来评估授权目标。
报告 以易于审查、归档和集成到工作流程中的格式呈现发现结果。
本项目不能替代补丁修复、供应商指导、安全配置或正式的渗透测试授权流程。它不保证能检测到每种部署、配置、版本或网络状况。所有结果都应人工审查,并作为评估证据而非自动安全结论来处理。
仅当您获得资产所有者的明确授权时,才可对资产运行此工具。授权应明确目标、允许的测试时间窗口、允许使用的技术、源 IP、数据处理要求、升级联系人和停止条件。
切勿仅仅因为互联网系统可访问就对其进行测试。 可访问性不等于许可。
评估模式可能会产生有关数据库、表、列或记录的信息。将所有输出视为潜在敏感信息。使用适当的访问控制存储报告,避免在 shell 历史记录中留下机密信息,在参与规则要求时加密报告,并在参与结束后安全删除临时数据。
在开始评估之前,请确认您拥有已知良好的备份或恢复流程、与系统所有者的沟通渠道,以及记录在案的回滚或停止计划。只要有可能,优先使用隔离的测试环境。使用能够回答评估问题的最低侵入性模式。
推荐的工作流程有意采用分阶段方式,以便评估人员可以从影响最小的活动开始,仅在获得授权后才扩大范围。``` ┌──────────────────┐ │ Define scope │ Confirm written authorization and test boundaries └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ Detect │ Identify phpMyAdmin and collect version indicators └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ Verify │ Perform controlled vulnerability checks └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ Assess, if │ Continue only when explicitly authorized │ approved │ └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ Report │ Preserve evidence, limits, timestamps, and conclusions └──────────────────┘
阳性结果应结合目标版本、认证上下文、请求证据及参与范围进行复核。阴性结果并不能证明部署是安全的;它可能反映出版本差异、访问控制、路由、应用定制、速率限制或可见性不足等问题。
---
## 要求
### 运行时要求
| 要求 | 支持的基线 |
| --- | --- |
| 操作系统 | Linux、macOS 或 Windows |
| Python | 3.6 或更高版本,受依赖兼容性约束 |
| 包管理器 | `pip` |
| 版本控制 | Git(从仓库安装时) |
| 网络访问 | 可连接到明确授权的评估目标 |
### Python 依赖
项目目前预期使用以下包:```
requests>=2.31.0
rich>=13.7.0
colorama>=0.4.6
dataclasses>=0.6; python_version < "3.7"
对于可复现的安装,建议优先使用仓库中的 requirements.txt 文件,而不是逐个安装软件包。
git clone https://github.com/CerberusMrXi/phpMyAdmin-CVE-2020-5504-Exploit cd phpMyAdmin-CVE-2020-5504-Exploit
python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r requirements.txt
chmod +x start.sh quick.sh exploit.py
启动引导式界面:```bash
./start.sh
git clone https://github.com/CerberusMrXi/phpMyAdmin-CVE-2020-5504-Exploit Set-Location phpMyAdmin-CVE-2020-5504-Exploit
py -m venv .venv ..venv\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install -r requirements.txt
.\start.bat
如果 PowerShell 执行策略阻止启动器运行,请在授权环境中使用该仓库文档中记载的 PowerShell 入口点:```
powershell -ExecutionPolicy Bypass -File .\start.ps1
仅在 requirements.txt 不可用,或您有意自行管理依赖时,才使用此方法:```bash
python -m pip install "requests>=2.31.0" "rich>=13.7.0" "colorama>=0.4.6"
---
## 使用方法
以下示例使用 `https://authorized.example/phpmyadmin` 作为占位符。请仅将其替换为明确属于您授权范围内的目标。
### 检测模式
检测模式是推荐的起点。它旨在对应用程序进行指纹识别并收集版本信息,而不会尝试进行漏洞利用。```bash
python exploit.py \
--url https://authorized.example/phpmyadmin \
--mode detect
原始界面中的短格式标志在适用时同样受支持:```bash python exploit.py -u https://authorized.example/phpmyadmin -m detect
### 验证模式
验证模式旨在用于受控的漏洞测试。仅在参与方明确允许验证活动,且所需凭据已通过批准的方式提供时,方可使用。```bash
python exploit.py \
--url https://authorized.example/phpmyadmin \
--mode verify \
--username "$PMADB_USERNAME" \
--password "$PMADB_PASSWORD"
避免在命令中直接放置真实密码,因为命令行可能会被存储在 Shell 历史记录中,或暴露给本地进程检查。
研究模式可能会执行更广泛的授权评估活动和数据枚举。它应仅限于专用测试环境,或已获得针对所请求范围明确书面批准的参与项目。```bash
python exploit.py
--url https://authorized.example/phpmyadmin
--mode research
--username "$PMADB_USERNAME"
--password "$PMADB_PASSWORD"
--max-databases 20
--max-tables 50
### 试运行模式
试运行模式可用于验证命令构造、审查工作流行为以及测试配置,而无需执行侵入性操作。```bash
python exploit.py \
--url https://authorized.example/phpmyadmin \
--dry-run
在测试期间需要检查请求和响应时,可通过经授权的拦截代理路由流量:```bash
python exploit.py
--url https://authorized.example/phpmyadmin
--mode verify
--proxy http://127.0.0.1:8080
仅在交战规则允许且代理配置为避免收集或保留不必要敏感数据时,才使用代理。
### 定向数据库评估
当范围文档指定了特定数据库时,在实现支持的情况下,将评估限制在该数据库范围内:```bash
python exploit.py \
--url https://authorized.example/phpmyadmin \
--mode research \
--database target_database \
--max-tables 25
在排查连接失败、意外响应或配置问题时,启用详细输出:```bash
python exploit.py
--url https://authorized.example/phpmyadmin
--mode verify
--verbose
### 交互式界面
交互式启动器推荐给首次使用的用户,因为它提供引导式提示、模式选择、进度指示器以及彩色编码的状态输出。```bash
# Linux/macOS
./start.sh
# Windows
start.bat
模式名称描述的是预期工作流,而非每种配置下的行为保证。在对任何在线系统使用任何模式之前,请先审查实现方式和测试规则。
以下选项由当前项目接口提供。运行 python exploit.py --help 以确认您当前版本中可用的确切选项名称。
重要提示: 禁用 TLS 证书验证会削弱传输安全性,应仅限于受控测试条件。切勿将其视为生产环境的修复方案。
当流量必须通过已批准的代理路由时,该工具可以使用标准代理变量:```bash export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080
不要将凭据存储在已提交的 `.env` 文件中。如果使用环境变量来存放测试凭据,请保护 shell 会话,并在测试结束后清除这些变量:```bash
export PMADB_USERNAME='authorized-test-user'
export PMADB_PASSWORD='use-an-approved-secret-source'
# Remove them when finished
unset PMADB_USERNAME PMADB_PASSWORD
创建 config.yaml 以保存持久化、非机密的评估设置:```yaml
scan:
timeout: 10
retries: 3
max_databases: 50
max_tables: 100
max_columns: 50
max_rows: 100
delay_between_requests: 0.5
report: format: json output: report.json include_sensitive: false
将凭据保留在此文件之外,除非该文件受贵组织批准的机密管理流程保护。将包含敏感值的本地配置文件添加到 `.gitignore`。
---
## 报告
该框架支持 JSON、HTML 和 TXT 输出。选择与评估的受众和留存要求相匹配的格式。
### JSON 报告
JSON 适用于自动化、归档以及导入评估流水线。下面展示了一个具有代表性的报告结构;具体字段可能因版本和模式而异。```json
{
"scan_info": {
"target": "https://authorized.example/phpmyadmin",
"timestamp": "2024-01-15T10:30:00Z",
"mode": "verify",
"scanner": "CVE-2020-5504 Security Assessment Tool v1.2",
"author": "Sudeepa Wanigarathna"
},
"fingerprint": {
"is_phpmyadmin": true,
"version": "5.0.0",
"confidence": "CONFIRMED"
},
"verification": {
"vulnerable": true,
"confidence": "CONFIRMED",
"status": "VULNERABLE_CONFIRMED"
},
"authentication": {
"authenticated": true,
"user": "authorized-test-user",
"score": 8
},
"extracted_data": {
"databases": ["information_schema", "mysql", "test"]
}
}
HTML 输出用于人工审阅。它可以包含样式化区块、状态指示器、证据摘要、元数据以及可打印布局。将生成的报告存储在访问受控的位置。
TXT 输出适用于终端审阅、日志收集、工单附件以及不需要富文本格式的环境。
在共享报告之前,确认其仅包含参与约定所允许的信息。检查 URL、用户名、数据库名称、记录值、Cookie、令牌、请求头以及调试输出中是否包含机密或个人数据。当敏感内容并非支持发现所必需时,应进行脱敏或删除。
该项目被组织为分阶段的评估流水线:``` Target │ ├── Fingerprinting │ ├── Version detection │ └── Path discovery │ ├── Vulnerability checks │ ├── Controlled verification │ └── Confidence analysis │ ├── Authentication │ ├── CSRF token extraction │ ├── Multi-signal validation │ └── Session management │ ├── Authorized assessment │ ├── Database enumeration │ ├── Table extraction │ └── Scoped data requests │ └── Reporting ├── JSON ├── HTML └── TXT
### 响应分析层
响应分析层集中处理对 HTTP 响应和应用程序行为的解读。以下概念性接口说明了其预期职责:```
ResponseAnalyzer
├── status_code( )
├── content_type()
├── authenticated()
├── error_detected()
├── verification_result()
└── extract_metadata()
集中化这些检查有助于保持指纹识别、身份验证、验证和报告阶段的一致性。
Login request │ ▼ CSRF token extraction │ ▼ Login submission │ ▼ Cookie and session validation │ ▼ Authenticated-page access test │ ▼ Expected-content verification │ ▼ Authenticated result
---
## 故障排查
### SSL 证书错误
如果受控测试环境使用内部或自签名证书,仅在风险已明确且测试项目允许的情况下,才使用该项目的 TLS 选项:```bash
python exploit.py \
--url https://authorized.example/phpmyadmin \
--mode detect \
--no-verify-ssl
推荐的解决方案是修正证书链或信任配置,而不是禁用验证。
仅在检查了路由、DNS、代理配置和目标可用性之后,再增加超时时间:```bash
python exploit.py
--url https://authorized.example/phpmyadmin
--mode detect
--timeout 30
使用保守的请求速率和延迟,以避免对目标造成不必要的负载。
### 身份验证失败
确认测试账户有效、该账户被允许访问目标,并且所提供的 URL 指向正确的 phpMyAdmin 安装。查看详细输出中的 CSRF、Cookie、重定向和内容类型指示信息,但不要共享凭据或会话值。
### 缺少 `rich` 包
在激活的虚拟环境中安装项目的依赖项:```bash
python -m pip install -r requirements.txt
如果当前版本支持,可禁用富文本格式以获得极简终端体验:```bash
python exploit.py
--url https://authorized.example/phpmyadmin
--mode detect
--no-rich
### Linux 或 macOS 上提示权限被拒绝
使启动器可执行:```bash
chmod +x start.sh exploit.py
将意外结果视为停止并调查的理由。检查目标版本、反向代理行为、认证状态、请求/响应证据、配置的限制、重试行为,以及是否有其他安全控制措施改变了响应。不要仅仅为了获得期望的结果而反复重跑高影响模式。
权威的 phpMyAdmin 公告建议按如下方式升级受影响的安装:[1]
| 受影响分支 | 受影响版本 | 建议操作 |
|---|---|---|
| phpMyAdmin 4.x | 早于 4.9.4 | 升级至 4.9.4 或更高版本。 |
| phpMyAdmin 5.x | 5.0.0 | 升级至 5.0.1 或更高版本。 |
组织还应审查 MySQL 账户权限、限制管理界面、强制强认证、限制网络暴露、监控管理活动,并遵循供应商当前的发布和安全指南。这些措施是对修补的补充,而非替代。
修复后,在经批准的环境中重复验证,并保留显示已安装版本、部署路径、测试日期和结果的证据。除非授权明确包含修复后验证,否则避免测试生产系统。
git clone https://github.com/CerberusMrXi/phpMyAdmin-CVE-2020-5504-Exploit cd phpMyAdmin-CVE-2020-5504-Exploit
python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r requirements-dev.txt
在 Windows 上,使用以下命令激活环境:```
.\.venv\Scripts\Activate.ps1
python -m pytest tests/
### 代码质量期望
贡献应遵循 PEP 8,在实用处使用类型提示,包含描述性文档字符串,保留清晰的错误处理,并避免记录凭据、Cookie、令牌或不必要的提取数据。影响评估范围、请求行为、身份验证或报告的更改应包含测试和文档更新。
### 建议的仓库布局```
.
├── exploit.py
├── requirements.txt
├── requirements-dev.txt
├── config.yaml.example
├── start.sh
├── start.bat
├── start.ps1
├── tests/
├── docs/
│ └── images/
└── reports/
请勿提交生成的报告、凭据、会话工件或目标特定数据。请在适当位置将其添加到 .gitignore 中。
欢迎有助于提高可靠性、文档、测试覆盖率、可访问性或安全评估工作流程的贡献。
复刻(Fork)该仓库。
创建一个聚焦的分支,例如 feature/improved-fingerprint-parser。
做出能够解决问题的最小且连贯的更改。
添加或更新测试和文档。
在本地运行测试套件。
使用清晰的信息提交(Commit)。
推送分支并开启一个拉取请求(Pull Request),描述更改内容、已执行的测试以及任何安全或兼容性影响。```bash git checkout -b feature/improved-fingerprint-parser git add . git commit -m "Improve fingerprint result handling" git push origin feature/improved-fingerprint-parser
请勿提交添加未授权目标、削弱安全防护、暴露真实凭据、包含实时系统数据或鼓励在文档规定范围之外进行测试的更改。
---
## 更新日志
### 版本 1.2
- 修复了 `FingerprintResult` 详情属性错误。
- 在富终端格式不可用时增加了回退路径。
- 改进了版本检测模式。
- 在整个工作流程中加强了错误处理。
- 为受控测试增加了 TLS 验证控制。
- 改进了跨平台兼容性。
### 版本 1.1
- 新增了专用指纹识别模块。
- 实现了安全验证模式。
- 增加了多信号身份验证校验。
- 增加了全面的报告生成功能。
- 集成了富终端界面。
### 版本 1.0
- 初始版本。
- 增加了基础 SQL 注入评估功能。
- 增加了数据库枚举功能。
- 增加了 JSON 输出。
---
## 许可证
本项目采用 MIT 许可证授权。完整文本请参见 [LICENSE](https://github.com/cerberusmrxi/phpmyadmin-cve-2020-5504-exploit/blob/HEAD/LICENSE) 文件。```
MIT License
Copyright (c) 2024 Sudeepa Wanigarathna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
该软件不提供任何担保。在重新分发本项目之前,请阅读完整的 LICENSE 文件。
本项目感谢 phpMyAdmin 团队提供的安全公告和补丁、报告该漏洞的研究人员,以及框架所使用库背后的开源维护者。
| 渠道 | 链接 |
|---|---|
| 作者 | Sudeepa Wanigarathna |
| GitHub 主页 | @sudeepawanigarathna |
如需报告与本项目相关的漏洞,请勿在公开场合发布敏感细节。请使用私人安全联系方式,或使用仓库中已配置的安全报告流程。
https://www.phpmyadmin.net/security/PMASA-2020-1/ "phpMyAdmin PMASA-2020-1 安全公告"
https://nvd.nist.gov/vuln/detail/CVE-2020-5504 "NIST 国家漏洞数据库:CVE-2020-5504"
通过负责任披露保障安全。
| 领域 | 能力 | 描述 |
|---|
| 发现 | 自动化指纹识别 | 识别可能的 phpMyAdmin 部署并收集版本指标。 |
| 验证 | 漏洞验证 | 执行受控检查,并以面向置信度的方式处理结果。 |
| 工作流程 | 多种操作模式 | 支持检测、验证、研究和试运行工作流程。 |
| 会话处理 | CSRF 令牌管理 | 提取并管理应用程序流程所需的 CSRF 相关值。 |
| 认证 | 多信号验证 | 使用多个指标以减少错误的认证结果。 |
| 评估 | 数据库枚举 | 支持对数据库、表、列和选定数据进行授权枚举。 |
| 注入研究 | 盲注技术 | 在实现允许的情况下,支持基于布尔和基于时间的盲注研究工作流程。 |
| 报告 | JSON、HTML 和 TXT | 为不同受众生成结构化、样式化和纯文本输出。 |
| 可靠性 | 重试和退避 | 以可配置的行为重试瞬时请求。 |
| 集成 | 代理支持 | 可与 Burp Suite 或其他 HTTP 拦截代理配合使用。 |
| 可用性 | 丰富的终端界面 | 提供彩色输出、进度指示器和可读的状态消息。 |
| 诊断 | 详细日志记录 | 为授权的故障排除提供额外的诊断信息。 |
| 模式 | 用途 | 预期影响 | 推荐使用场景 |
|---|
detect | 对应用程序进行指纹识别并确定版本指标。 | 无或极小 | 在授权范围内进行初步侦察。 |
verify | 通过受控检查测试目标是否存在漏洞。 | 低 | 在授权评估期间进行确认。 |
research | 开展更广泛的评估和授权枚举。 | 高 | 专用实验室或获得明确批准的测试项目。 |
dry-run | 模拟工作流行为,不执行侵入性操作。 | 无 | 配置和命令验证。 |
| 选项 | 描述 | 示例 |
|---|
-u, --url | 已授权的 phpMyAdmin 基础 URL。 | --url https://authorized.example/phpmyadmin |
-m, --mode | 选择 detect、verify 或 research。 | --mode verify |
--dry-run | 模拟工作流,不执行侵入性操作。 | --dry-run |
--username | 已批准测试账户的用户名。 | --username "$PMADB_USERNAME" |
--password | 已批准测试账户的密码。 | --password "$PMADB_PASSWORD" |
-p, --proxy | HTTP 代理 URL。 | --proxy http://127.0.0.1:8080 |
-f, --format | 报告格式,如 json、html 或 txt。 | --format html |
-o, --output | 输出文件路径。 | --output report.html |
-d, --database | 在支持的情况下将活动限制为指定的数据库。 | --database target_database |
-t, --timeout | 请求超时时间(秒)。 | --timeout 30 |
--max-databases | 要枚举的最大数据库数量。 | --max-databases 20 |
--max-tables | 要枚举的最大表数量。 | --max-tables 50 |
--max-columns | 要枚举的最大列数量。 | --max-columns 50 |
--max-rows | 在支持的情况下请求的最大行数。 | --max-rows 100 |
-v, --verbose | 启用诊断输出。 | --verbose |
--no-verify-ssl | 仅限受控测试时禁用 TLS 证书验证。 | --no-verify-ssl |
--no-rich | 禁用富终端格式。 | --no-rich |
| 问题跟踪器 | 仓库 Issues |
| 邮箱 | [email protected] |