
Escanea WordPress Forminator en busca de CVE-2026-15748, RCE sin autenticación. Detecta sitios vulnerables, rastrea formularios, extrae nonces y ejecuta pruebas de subida seguras.
Elaborado por Yora
Solo para fines educativos y pruebas autorizadas
CVE-2026-15748 es una vulnerabilidad relacionada con el plugin Forminator de WordPress.
Esta herramienta está diseñada para ayudar en la investigación de seguridad y las pruebas autorizadas en instalaciones de WordPress que utilizan Forminator.
El escáner realiza varias etapas de verificación, desde la detección de WordPress, la búsqueda de Forminator, la identificación de la versión, el rastreo de páginas, hasta la comprobación de la configuración de formularios específicos.
⚠️ Utiliza esta herramienta únicamente en sitios web, servidores, laboratorios o sistemas que poseas o para los cuales hayas obtenido autorización de prueba.
| Características | Descripción |
|---|---|
| 🔎 Detección de WordPress | Detecta si el objetivo utiliza WordPress |
| 🔌 Detección de Forminator | Detecta la instalación del plugin Forminator |
| 🏷️ Detección de versión | Obtiene la versión de Forminator de las fuentes disponibles |
| 📊 Comprobación de versión | Compara la versión con el límite 1.56.1 |
| 🕷️ Rastreo de sitios web | Busca páginas relevantes en el objetivo |
| 🗺️ Detección de sitemaps | Comprueba varios sitemaps de WordPress |
| 📝 Detección de formularios | Detecta formularios específicos de Forminator |
| 🔐 Detección de nonce | Intenta encontrar el nonce de Forminator |
| ⚡ Multihilo | Admite varios objetivos simultáneamente |
| 🔁 Reintentos | Las solicitudes fallidas se reintentan |
| ⏱️ Retraso de solicitudes | Utiliza un retraso aleatorio entre solicitudes |
| 📄 Resultados detallados | Guarda los resultados de la verificación en un archivo |
La herramienta requiere:
requestspackagingurllib3Instalar dependencias:
pip install requests packaging urllib3
O bien:
python -m pip install requests packaging urllib3
Clonar el repositorio:
git clone https://github.com/yora1928/cve-2026-15748.git
Entrar al directorio:
cd cve-2026-15748
Instalar dependencias:
pip install requests packaging urllib3
Verificar Python:
python --version
La configuración principal se encuentra en la sección CONFIG del script:
TIMEOUT = 15
THREADS = 8
VULN_MAX = "1.56.1"
MAX_RETRIES = 3
DELAY_MIN = 1.0
DELAY_MAX = 2.5
CRAWL_DEPTH = 2
Dicha configuración está directamente en el código fuente.
La herramienta admite dos métodos de entrada de objetivos:
python cve-2026-15748.py -u https://target.com
Parámetro:
-u
--url
Se utiliza para ingresar un solo objetivo.
Crea un archivo:
targets.txt
Ejemplo:
https://target1.com
https://target2.com
https://target3.com
Luego ejecuta:
python cve-2026-15748.py -f targets.txt
Parámetro:
-f
--file
El código fuente lee cada línea como un objetivo y elimina las líneas vacías.
Por defecto:
8 threads
Para cambiarlo:
python cve-2026-15748.py -f targets.txt -t 10
Otro ejemplo:
python cve-2026-15748.py -f targets.txt -t 5
Parámetro:
-t
El script también tiene una opción:
--upload
Ejemplo:
python cve-2026-15748.py -u https://target.com --upload
o:
python cve-2026-15748.py -f targets.txt --upload
⚠️ Este modo realiza solicitudes POST/subida al endpoint de Forminator. Úsalo únicamente en sistemas que permitan explícitamente dichas pruebas.
La implementación de --upload llama a la función upload_test() cuando se cumplen ciertas condiciones de verificación.
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
python cve-2026-15748.py -f authorized-targets.txt -t 5 --upload
En general, el escáner funciona con el siguiente flujo:
Target
│
▼
Normalize URL
│
▼
WordPress Detection
│
├── Tidak ditemukan
│ └── NOT WORDPRESS
│
▼
Crawl Pages
│
▼
Forminator Detection
│
▼
Version Detection
│
▼
Version Comparison
│
▼
Form Detection
│
▼
Result
El escáner verifica varios endpoints:
/wp-login.php
/wp-json
/xmlrpc.php
/wp-content
Además de ciertos estados HTTP, el escáner también busca indicadores como:
wp-content
wp-includes
en la respuesta de la página.
Si no se encuentra ningún indicador de WordPress:
[NOT WORDPRESS]
El escáner crea una lista de páginas de varias fuentes.
Algunas rutas que se verifican incluyen:
/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
El código fuente también verifica:
/sitemap.xml
/sitemap_index.xml
/wp-sitemap.xml
y obtiene enlaces internos de la página principal.
El escáner busca identificadores de Forminator como:
forminator-form-<ID>
así como otros patrones HTML.
Para los formularios encontrados, el escáner verifica la presencia de:
type="file"
y:
<select>
El escáner también intenta obtener:
form_id
nonce
del HTML del formulario.
La versión de Forminator se puede extraer de recursos HTML como:
/wp-content/plugins/forminator/...
con el parámetro:
?ver=X.X.X
El escáner también tiene un respaldo para buscar:
Stable tag:
en el HTML y en readme.txt.
El método mostrado en la salida puede ser:
html-source
o:
readme.txt
El límite de versión en el código fuente:
1.56.1
La verificación se realiza comparando la versión encontrada con VULN_MAX.
El resultado interno puede ser:
VULNERABLE
o:
PATCHED
Si la versión es desconocida pero se cumplen ciertas condiciones, el código fuente usa el estado:
INSTALLED (unknown version)
El formato de salida principal de la herramienta sigue la estructura:
[STATUS] URL VERSION (METHOD) [PAGES] [FORM STATUS] [VULNERABILITY STATUS] [UPLOAD STATUS]
Ejemplo:
[FOUND] https://target.com v1.56.0 (html-source) [25 pages] [HAS UPLOAD FORM] [VULNERABLE]
Si se detecta un formulario de subida:
[FOUND] https://target.com v1.56.0 (html-source) [25 pages] [HAS UPLOAD FORM] [VULNERABLE]
Si no hay formulario:
[FOUND] https://target.com v1.56.0 (html-source) [25 pages] [VULNERABLE]
FOUNDForminator fue encontrado y se obtuvo información importante con éxito.
NOT FOUNDNo se pudo encontrar Forminator.
Ejemplo:
[NOT FOUND] https://target.com [17 pages]
NOT WORDPRESSEl objetivo no fue detectado como WordPress.
Ejemplo:
[NOT WORDPRESS] https://target.com
INSTALLED (unknown version)Se indica que Forminator está instalado, pero no se pudo determinar la versión.
VULNERABLELa versión encontrada es igual o inferior a:
1.56.1
PATCHEDLa versión encontrada supera el límite:
1.56.1
Después de procesar todos los objetivos, la herramienta muestra un resumen.
Ejemplo:
========== SUMMARY ==========
VULNERABLE : 10
PATCHED : 5
UNKNOWN VERSION : 3
NOT FOUND : 20
NOT WORDPRESS : 2
TOTAL SCANNED : 40
[+] HAVE UPLOAD FORM: 2
El resumen se calcula a partir de los resultados de cada objetivo recopilados por el escáner.
La herramienta crea automáticamente:
scan_results_detailed.txt
Ese archivo se crea después de que finaliza el proceso de escaneo.
Su estructura:
=== VULNERABLE (with upload form) ===
=== VULNERABLE (no upload form) ===
=== UNKNOWN VERSION (assume vulnerable) ===
Ejemplo:
=== 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
Es recomendable no hacer commit del archivo de resultados al repositorio si contiene objetivos o información sensible.
cve-2026-15748/
│
├── cve-2026-15748.py
├── README.md
├── targets.txt
└── scan_results_detailed.txt
cve-2026-15748.pyEscáner principal.
README.mdDocumentación del proyecto.
targets.txtLista de objetivos que se procesarán.
scan_results_detailed.txtArchivo de resultados de escaneo creado automáticamente.
El código fuente consta de varias partes principales:
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()
Esas funciones corresponden a la estructura real del código fuente.
El escáner utiliza:
El User-Agent utilizado incluye varios navegadores comunes.
Las solicitudes GET utilizan la configuración de reintentos y retraso:
TIMEOUT = 15 seconds
MAX_RETRIES = 3
DELAY = 1.0–2.5 seconds
El escáner tiene varias limitaciones:
UNKNOWN requiere verificación manual.Se recomienda a los administradores de WordPress:
Antes de ejecutar el escáner contra un sistema:
✓ Asegúrate de que el sistema esté dentro del alcance
✓ Asegúrate de tener permiso
✓ Utiliza un entorno de pruebas si es posible
✓ Evita datos reales de usuarios
✓ No realices pruebas fuera del alcance
✓ Guarda los resultados de la evaluación de forma segura
Solo para fines educativos y pruebas autorizadas.
Esta herramienta fue creada con los siguientes propósitos:
No utilices esta herramienta contra sistemas que no poseas o que no hayan otorgado permiso para realizar pruebas.
El usuario es totalmente responsable del uso de esta herramienta.
El autor no se hace responsable por daños, pérdida de datos, interrupción del servicio o consecuencias legales derivadas del mal uso de la herramienta.
Yora
GitHub:
Repositorio:
https://github.com/yora1928/cve-2026-15748
Si este proyecto es útil para el aprendizaje o la investigación de seguridad legítima, puedes dar una ⭐ al repositorio.
MIT License
Elaborado con ❤️ por Yora
| Variable | Por defecto | Función |
|---|
TIMEOUT | 15 | Tiempo de espera de la solicitud HTTP |
THREADS | 8 | Número de workers/hilos |
VULN_MAX | 1.56.1 | Límite de versión considerada afectada |
MAX_RETRIES | 3 | Número de reintentos de solicitud |
DELAY_MIN | 1.0 | Retraso mínimo |
DELAY_MAX | 2.5 | Retraso máximo |
CRAWL_DEPTH | 2 | Profundidad de rastreo |