SQL Injection
La inyección SQL ocurre cuando datos del usuario acaban dentro de una consulta a la base de datos sin separarse del código de la consulta. Según el caso permite leer tablas enteras, saltarse un inicio de sesión o modificar datos. La defensa es conocida (consultas parametrizadas), pero sigue apareciendo en filtros, ordenaciones y búsquedas avanzadas.
Guía: SQL Injection, qué es y cómo se busca →Inyección SQL en MariaDB Connector/C++: el escapador vuelve a escapar su propia salida en los métodos de metadatos
Un fallo en la función replace del conector C++ de MariaDB multiplicaba las barras invertidas al escapar, dejando una impar que rompía el literal. Un nombre de tabla o esquema controlado por el atacante permitía inyectar SQL a través de getTables y otros métodos de metadatos.
7 min
Inyección SQL en el identificador de cliente de la ruta URL de un servicio de seguro de dispositivos de MTN
Una comilla en el customerId que viaja dentro de la ruta de la URL bastaba para romper la consulta SQL de un servicio de seguro de dispositivos de MTN, con riesgo de volcar la base de datos de usuarios.
2 min
Inyección SQL en las utilidades cliente de MariaDB: mariadb-show ejecuta SQL oculto en nombres de tabla
mariadb-show, mariadb-dump y mariadb-convert-table-format montaban consultas con nombres de tablas o servidores sin escapar. Conectarse a una base controlada por un atacante bastaba para ejecutar su SQL; mariadb-dump tenía además bucles infinitos y desbordamientos.
7 min
Django: inyección SQL en PostgreSQL con alias de FilteredRelation que usan cadenas con dólar ($tag$)
El filtro de alias de Django no bloqueaba el símbolo $. En PostgreSQL, un alias controlado por el usuario en annotate() con FilteredRelation permitía inyectar SQL y, en la prueba, leer /etc/passwd del servidor de base de datos.
3 min
MariaDB Connector/C++ activa siempre las consultas múltiples e inserta sin escapar el nombre del savepoint en el SQL
El driver C++ de MariaDB ignoraba allowMultiQueries=false y concatenaba el nombre de los savepoints en el SQL sin comillas. Juntos, un nombre de savepoint manipulado bastaba para ejecutar sentencias arbitrarias.
5 min
Inyección SQL en MariaDB Connector/ODBC: nombres de columna sin comillas en DELETE y UPDATE posicionados
El driver ODBC de MariaDB pegaba el nombre de columna sin entrecomillar en el WHERE de los DELETE y UPDATE posicionados. Una columna llamada `1 OR 1=1#` convertía el borrado de una fila en el borrado de toda la tabla.
6 min
MariaDB: SHOW CREATE y mariadb-dump generaban SQL sin escapar y permitían inyectar órdenes al restaurar una copia
Varias órdenes SHOW de MariaDB y la herramienta mariadb-dump reconstruían SQL a partir de metadatos sin escaparlos. Un usuario podía esconder SQL en una tabla y conseguir que se ejecutara con los permisos de quien restaurase la copia.
7 min
Inyección SQL basada en errores en el login y el reset de contraseña de Essity
El parámetro username del login y del restablecimiento de contraseña de un dominio de Essity se concatenaba en la consulta SQL. Con updatexml() se extraían versión, usuario y datos del esquema a través de los mensajes de error.
4 min
Inyección SQL sin autenticación en WordPress por confusión de rutas en el endpoint batch de la REST API
El endpoint batch de la REST API de WordPress (/wp-json/batch/v1) permitía una inyección SQL ciega sin autenticación encadenando una desincronización en el reparto de subpeticiones con la falta de validación de tipo en author__not_in.
4 min
Inyección SQL sin autenticación en la API WDMProduct (Essity)
Un parámetro de búsqueda sin sanear en GET /api/WDMProduct permitía inyección SQL ciega y consultas apiladas contra un SQL Server, exponiendo lectura y escritura de datos de producción sin autenticarse.
4 min
Una inyección SQL escondida en la cabecera User-Agent de labs.data.gov
Un endpoint del panel de data.gov metía la cabecera User-Agent directamente en una consulta MySQL; se confirmó la inyección a ciegas midiendo cuánto tardaba el servidor en responder.
2 min