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 las 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íbete a theNET, el resumen mensual de Cloudflare sobre las ideas más populares de Internet.
Copiar el enlace del artículo
La inyección de SQL* es una técnica de inyección de código que se utiliza para modificar u obtener datos de bases de datos SQL. Al insertar sentencias SQL especializadas en un campo de entrada, un atacante puede ejecutar comandos que permiten obtener datos de la base de datos, destruir información sensible u otras acciones manipulativas.
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 simples, la inyección de código SQL ocurre cuando los atacantes envían un código ejecutable en lugares donde una aplicación espera datos comunes.
Los atacantes introducen un comando SQL en un campo de formulario. Después de que se envía el formulario, el procesador 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 que hiciera: 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 usuario, obtener privilegios de administrador, alterar o eliminar datos, recuperar todos los datos del servidor o incluso obtener el acceso principal a la máquina.
Las estrategias de prevención de inyección de código SQL incluyen el uso de sentencias preparadas, el escape de la entrada del usuario, la implementación de procedimientos almacenados y la aplicación del principio de mínimo privilegio para garantizar que solo se otorguen los permisos necesarios.
Las declaraciones 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.
Escapar la entrada del usuario asegura que los caracteres especiales se traten como texto plano en lugar de como parte de un comando SQL, esto reduce el riesgo de que la entrada del usuario sea interpretada 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 puede hacer el código inyectado, aunque no son una defensa completa por sí solos.
Aplicar el principio de mínimos privilegios significa restringir los permisos de las cuentas de la base de datos a lo que es estrictamente necesario. Esto minimiza el daño potencial si un atacante explota una vulnerabilidad de inyección de código SQL.