Mediante la inyección de código SQL, los atacantes pueden ejecutar comandos no autorizados en la base de datos SQL de la víctima.
Después de leer este artículo podrás:
Contenido relacionado
¿Qué es la seguridad de aplicaciones web?
Falsificación de solicitud entre sitios
¿Qué es una fuga de datos?
Ataque de desbordamiento de búfer
¿Qué es el OWASP Top 10?
Suscríbase a theNET, el resumen mensual de Cloudflare sobre las ideas más populares de Internet.
Copiar enlace del artículo
La inyección de código SQL* (Structured Query Language) es una técnica de inyección de código que se utiliza para modificar u obtener datos de bases de datos SQL. Mediante la inserción de sentencias SQL especializadas en un campo de entrada, un atacante puede ejecutar comandos que permitan obtener datos de la base de datos, destruir datos confidenciales u otras manipulaciones.
Con la ejecución de comandos SQL adecuada, el usuario no autorizado es capaz de suplantar la identidad de un usuario con más privilegios, convertirse a sí mismo o a otros en administradores de la base de datos, manipular los datos existentes, modificar las transacciones y los balances, y recuperar o destruir todos los datos del servidor.
En la informática moderna, la inyección de código SQL suele producirse a través de Internet mediante el envío de consultas SQL maliciosas a un punto final de la API proporcionado por un sitio web o un servicio (más información al respecto más adelante). En su forma más grave, la inyección de código SQL puede permitir que un atacante consiga acceso raíz a una máquina, lo que le da el control total.
*SQL es un lenguaje de programación usado para mantener la mayoría de las bases de datos.
Imaginemos una sala de un tribunal en la que un hombre llamado Bob está siendo juzgado y está a punto de comparecer ante el juez. Al rellenar los papeles antes del juicio, Bob escribe su nombre como "Bob es libre de irse". Cuando el juez llega a su caso y lee en voz alta "Llamamos a Bob es libre de irse", el alguacil deja ir a Bob, porque eso es lo que ha dicho el juez.
Aunque hay variedades ligeramente diferentes de SQLi, la vulnerabilidad principal es esencialmente la misma: un campo de consulta SQL que se supone que está reservado para un tipo particular de datos, como un número, se pasa en su lugar información inesperada, como un comando. El comando, cuando se ejecuta, va más allá de los límites previstos, permitiendo un comportamiento potencialmente nefasto. Un campo de consulta se suele rellenar a partir de los datos introducidos en un formulario de una página web.
Veamos una simple comparación entre las sentencias SQL normales y las maliciosas:
En esta consulta SQL normal, la cadena studentId se pasa a una sentencia SQL. El objetivo es buscar un alumno en la lista de estudiantes que coincida con el studentId introducido. Una vez encontrado, se devolverá el registro de ese estudiante. En pocas palabras, el comando dice "ve a buscar a este usuario y dame sus datos".
El código podría ser algo así:
studentId = getRequestString("studentId");
lookupStudent = "SELECT * FROM students WHERE studentId = " + studentId
Si un estudiante introduce una identificación de estudiante de 117 en un formulario de la página web etiquetado como "Por favor, introduce tu número de identificación de estudiante
la consulta SQL resultante tendrá el siguiente aspecto:
SELECT * FROM students WHERE studentId = 117;
Este comando devolverá el registro del estudiante concreto con un studentId, que es lo que el desarrollador que escribió la API espera que suceda.
En este ejemplo, un atacante en vez de introducir un comando SQL o una lógica condicional en el campo de entrada, introduce un número de identificación de estudiante de:
Donde normalmente la consulta buscaría en la tabla de la base de datos la ID correspondiente, ahora busca una ID o comprueba si 1 es igual a 1. Como es de esperar, la sentencia es siempre verdadera para cada estudiante de la columna, y como resultado, la base de datos devolverá todos los datos de la tabla de estudiantes al atacante que realiza la consulta.
SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQLi funciona al atacar a una interfaz de programación de aplicaciones o API vulnerable. En este caso, una API es la interfaz de software a través de la cual un servidor recibe y responde a las solicitudes.
Existen herramientas de uso común que permiten que un agente malicioso busque formularios automáticamente en un sitio web, y luego intente introducir varias consultas SQL, que pueden generar una respuesta que los desarrolladores del software del sitio web no pretendían con el fin de aprovechar una vulnerabilidad en la base de datos.
Las inyecciones de código SQL son fáciles de implementar y, curiosamente, también son bastante fáciles de prevenir si se aplican las prácticas de desarrollo adecuadas. La realidad es más turbia, ya que con plazos ajustados, desarrolladores inexpertos y código heredado suelen producirse prácticas de seguridad y una calidad de código variables. Un solo campo vulnerable en cualquier formulario o punto final de la API en un sitio web que tenga acceso a una base de datos puede ser suficiente para exponer una vulnerabilidad.
Hay varios métodos para reducir el riesgo de que se produzca una fuga de datos debido a una inyección de código SQL. Como práctica recomendada, se deben utilizar varias estrategias. Exploremos algunas de las implementaciones más comunes:
Para evadir las medidas de seguridad, los atacantes más astutos a veces implementan ataques multivectoriales contra un sitio web objetivo. Aunque un solo ataque puede ser mitigado, también puede convertirse en el centro de atención de los administradores de bases de datos y de los equipos de seguridad de la información. Los ataques DDoS, el secuestro de DNS y otros métodos de interrupción se utilizan a veces como distracción para implementar ataques de inyección de código SQL de gran alcance. Por ello, una estrategia integral de mitigación de amenazas proporciona la más amplia protección. El firewall de aplicaciones web de Cloudflare, la mitigación de DDoS y la seguridad de DNS constan de elementos básicos de una estrategia de seguridad holística.
La inyección de código SQL es un tipo de ciberataque en el que los atacantes insertan comandos SQL maliciosos en los campos de entrada. Si se ejecutan los comandos, los atacantes pueden manipular o recuperar información de una base de datos sin autorización. En términos más sencillos, la inyección de código SQL se produce cuando los atacantes envían código ejecutable a lugares en los que una aplicación espera datos normales.
Los atacantes introducen un comando SQL en un campo de formulario. Después de que se envía el formulario, el backend de la aplicación recibe el comando y luego lo ejecuta realmente. Esto genera una respuesta o una acción que los desarrolladores de la aplicación no pretendían. Los atacantes pueden usar la inyección de código SQL para obtener información confidencial de una base de datos o alterar su contenido.
Una inyección de código SQL exitosa puede permitir a los atacantes suplantar identidades de usuarios, obtener privilegios de administrador, alterar o eliminar datos, recuperar todos los datos del servidor o incluso obtener acceso root a la máquina.
Las estrategias de prevención de inyecciones SQL incluyen el uso de sentencias preparadas, el escape de entradas de los usuarios, la implementación de procedimientos almacenados y la aplicación de un acceso con privilegios mínimos para garantizar que solo se concedan los permisos necesarios.
Las sentencias preparadas separan el código SQL de las entradas del usuario mediante la precompilación del código SQL. Esto impide que los atacantes inyecten código malicioso, ya que la base de datos trata la entrada como datos y no como comandos ejecutables.
Al escapar la entrada del usuario, se garantiza que los caracteres especiales se traten como texto sin formato en lugar de como parte de un comando SQL, lo que reduce el riesgo de que la entrada del usuario se interprete como instrucciones ejecutables.
Los procedimientos almacenados pueden limitar los tipos y el alcance de las operaciones en la base de datos. Cuando se diseñan adecuadamente, limitan lo que el código inyectado puede hacer, aunque no constituyen una defensa completa por sí mismos.
Aplicar el principio de privilegio mínimo significa restringir los permisos de las cuentas de la base de datos únicamente a lo necesario. Esto minimiza el daño potencial si un atacante explota una vulnerabilidad de inyección de código SQL.