一个基于 Python 的安全研究与漏洞评估扫描器,用于识别使用 Forminator 插件的 WordPress 安装,并评估与版本相关的暴露风险。
仅供教育及授权测试使用
仅对你拥有或已获得明确评估许可的系统运行此项目。
CVE-2026-15748 是一个与 WordPress 的 Forminator 插件相关的漏洞。
本项目为安全研究和授权测试提供了一个扫描器。它执行一系列被动检查和应用层检查,以识别 WordPress、定位 Forminator、在可能的情况下确定已安装版本、检查相关页面和表单,并报告最终的评估结果。
该扫描器旨在帮助安全研究人员了解已授权 WordPress 环境的暴露情况,而不将扫描器结果视为可利用性的绝对证据。
该扫描器遵循以下总体工作流程:
Target
|
v
Normalize URL
|
v
Detect WordPress
|
+---- not detected ----> NOT WORDPRESS
|
v
Crawl relevant pages
|
v
Detect Forminator
|
v
Detect Forminator version
|
v
Compare version
|
v
Inspect forms
|
v
Generate result
| 功能 | 描述 |
|---|---|
| WordPress 检测 | 检测目标是否疑似使用 WordPress。 |
| Forminator 检测 | 搜索 Forminator 插件的相关迹象。 |
| 版本检测 | 尝试从可用来源识别已安装的 Forminator 版本。 |
| 版本检查 | 将检测到的版本与配置的 VULN_MAX 值进行比较。 |
| 网站爬取 | 收集相关页面和内部链接以供进一步检查。 |
| Sitemap 检测 | 检查常见的 WordPress sitemap 位置。 |
| 表单检测 | 查找相关的 Forminator 表单和表单元素。 |
| Nonce 检测 | 尝试在检测到的表单数据中识别 Forminator nonce。 |
| 多线程 | 支持并发处理多个目标。 |
| 重试处理 | 根据配置的限制重试失败的请求。 |
| 请求延迟 | 在请求之间添加可配置的随机延迟。 |
| 详细结果 | 将收集到的评估结果写入详细结果文件。 |
requestspackagingurllib3安装所需软件包:
pip install requests packaging urllib3
或:
python -m pip install requests packaging urllib3
克隆仓库:
git clone https://github.com/yora1928/cve-2026-15748.git
进入项目目录:
cd cve-2026-15748
安装依赖:
pip install requests packaging urllib3
验证 Python 安装:
python --version
扫描器配置直接在源代码中定义:
TIMEOUT = 15
THREADS = 8
VULN_MAX = "1.56.1"
MAX_RETRIES = 3
DELAY_MIN = 1.0
DELAY_MAX = 2.5
CRAWL_DEPTH = 2
| 变量 | 默认值 | 描述 |
|---|---|---|
TIMEOUT | 15 | HTTP 请求超时时间。 |
THREADS | 8 | 用于扫描的工作线程数量。 |
VULN_MAX | 1.56.1 | 扫描器版本评估中被视为受影响的最大版本。 |
MAX_RETRIES | 3 | 失败请求的最大重试次数。 |
DELAY_MIN | 1.0 | 最小请求延迟。 |
DELAY_MAX | 2.5 | 最大请求延迟。 |
CRAWL_DEPTH | 2 | 最大爬取深度。 |
上述数值描述了扫描器当前的源代码配置。
扫描器接受单个目标 URL 或包含多个目标 URL 的文本文件。
python cve-2026-15748.py -u https://target.com
-u 和 --url 指定一个目标 URL。
在对单个授权环境进行评估时使用此模式。
创建一个文件,例如 targets.txt:
https://target1.example
https://target2.example
https://target3.example
然后运行:
python cve-2026-15748.py -f targets.txt
-f 和 --file 用于指定目标列表。
每个非空行都被视为一个目标。
默认配置使用 8 个线程。
例如:
python cve-2026-15748.py -f targets.txt -t 10
或:
python cve-2026-15748.py -f targets.txt -t 5
-t 用于更改扫描器使用的工作线程数量。
扫描器还提供了一个可选的 --upload 模式:
python cve-2026-15748.py -u https://lab.example.com --upload
对于多个已授权目标:
python cve-2026-15748.py -f authorized-targets.txt -t 5 --upload
当满足相关条件时,此模式可以对 Forminator 端点执行 POST/上传请求。
仅在明确授权进行此测试的系统上使用 --upload。
| 命令 | 用途 |
|---|---|
-u、--url | 扫描单个目标 URL。 |
-f、--file | 从文件中读取多个目标。 |
-t | 设置扫描线程数。 |
--upload | 为已授权目标启用上传测试模式。 |
单个目标:
python cve-2026-15748.py -u https://target.com
多个目标:
python cve-2026-15748.py -f targets.txt
多个目标并支持自定义并发:
python cve-2026-15748.py -f targets.txt -t 10
授权实验室上传测试:
python cve-2026-15748.py -u https://lab.example.com --upload
扫描器在评估过程中会执行多个阶段。
在发起请求之前,目标 URL 会被规范化,以便后续检查使用一致的 URL 格式。
扫描器会检查常见的 WordPress 标识和端点,包括:
/wp-login.php
/wp-json
/xmlrpc.php
/wp-content
它还会在响应中搜索以下指示符:
wp-content
wp-includes
如果无法识别 WordPress,扫描器会报告:
[NOT WORDPRESS]
扫描器会根据常见路径、sitemap 位置以及从目标中发现的内部链接构建页面列表。
检查的路径示例包括:
/contact
/kontak
/hubungi-kami
/form
/forms
/formulir
/upload
/unggah
/submit
/kirim
/gallery
/kontribusi
/daftar
/pendaftaran
/registration
/register
/file-upload
/submit-document
/unggah-berkas
/upload-file
常见的 sitemap 位置包括:
/sitemap.xml
/sitemap_index.xml
/wp-sitemap.xml
爬虫受 CRAWL_DEPTH 限制。
扫描器会搜索 Forminator 标识符,例如:
forminator-form-<ID>
对于检测到的表单,它会检查相关元素,例如:
type="file"
和:
<select>
它还会尝试获取:
form_id
nonce
从表单 HTML 中。
扫描器尝试根据目标暴露的信息确定 Forminator 版本。
其中一个来源是类似以下的资源路径:
/wp-content/plugins/forminator/...
带版本参数:
?ver=X.X.X
扫描器还有一个回退机制,用于搜索:
Stable tag:
in HTML 或 readme.txt 中。
报告的检测方法可以包括:
html-source
或:
readme.txt
配置的评估边界为:
1.56.1
检测到的版本会与 VULN_MAX 进行比较。
可能的评估状态包括:
VULNERABLE
PATCHED
如果检测到 Forminator 但无法确定其版本,扫描器可以报告:
INSTALLED (unknown version)
扫描器分类应被视为一种评估结果,而非目标可利用的绝对证据。
主要输出遵循以下总体结构:
[STATUS] URL VERSION (METHOD) [PAGES] [FORM STATUS] [VULNERABILITY STATUS] [UPLOAD STATUS]
示例:
[FOUND] https://target.com v1.56.0 (html-source) [25 pages] [HAS UPLOAD FORM] [VULNERABLE]
当未检测到上传表单时:
[FOUND] https://target.com v1.56.0 (html-source) [25 pages] [VULNERABLE]
FOUND已检测到 Forminator,并成功收集了相关信息。
NOT FOUND无法检测到 Forminator。
示例:
[NOT FOUND] https://target.com [17 pages]
NOT WORDPRESS目标未被检测为 WordPress 安装。
示例:
[NOT WORDPRESS] https://target.com
INSTALLED (unknown version)Forminator 似乎已安装,但扫描器无法确定其版本。
VULNERABLE检测到的版本等于或低于配置的边界:
1.56.1
PATCHED检测到的版本高于配置的边界:
1.56.1
扫描目标后,该工具会显示类似以下的摘要:
========== SUMMARY ==========
VULNERABLE : 10
PATCHED : 5
UNKNOWN VERSION : 3
NOT FOUND : 20
NOT WORDPRESS : 2
TOTAL SCANNED : 40
[+] HAVE UPLOAD FORM: 2
这些值表示当前扫描期间收集的结果。
扫描完成后,该工具会创建:
scan_results_detailed.txt
结果文件按如下部分组织:
=== VULNERABLE (with upload form) ===
=== VULNERABLE (no upload form) ===
=== UNKNOWN VERSION (assume vulnerable) ===
示例:
=== VULNERABLE (with upload form) ===
https://target.example - v1.56.0 (html-source) - form_data: ...
=== VULNERABLE (no upload form) ===
https://target.example - v1.55.0 (html-source)
=== UNKNOWN VERSION (assume vulnerable) ===
https://target.example
如果扫描结果包含目标信息或其他敏感数据,请勿将其提交到公共仓库。
cve-2026-15748/
|
├── cve-2026-15748.py
├── README.md
├── targets.txt
└── scan_results_detailed.txt
| 文件 | 用途 |
|---|---|
cve-2026-15748.py | 主扫描器实现。 |
README.md | 项目文档。 |
targets.txt | 待处理目标列表。 |
scan_results_detailed.txt | 自动生成的扫描结果。 |
源代码按若干功能区域组织:
cve-2026-15748.py
|
├── CONFIG
| ├── TIMEOUT
| ├── THREADS
| ├── VULN_MAX
| ├── MAX_RETRIES
| ├── DELAY_MIN
| ├── DELAY_MAX
| └── CRAWL_DEPTH
|
├── HTTP / REQUEST
| ├── get_headers()
| └── safe_get()
|
├── URL
| └── normalize()
|
├── VERSION
| ├── is_vulnerable()
| └── extract_version_from_html()
|
├── WORDPRESS
| └── check_wordpress()
|
├── CRAWLING
| └── get_all_pages()
|
├── FORM DETECTION
| └── extract_form_data_advanced()
|
├── FORMINATOR
| └── check_forminator_full()
|
├── TESTING
| └── upload_test()
|
├── SCANNING
| └── scan_target()
|
└── MAIN
└── main()
扫描器使用:
配置的请求行为为:
TIMEOUT = 15 seconds
MAX_RETRIES = 3
DELAY = 1.0–2.5 seconds
该扫描器存在若干局限性:
UNKNOWN 结果需要人工验证。对于 WordPress 管理员:
在运行扫描器之前: