Los datos son uno de los componentes más importantes de los sistemas de información. La organización utiliza aplicaciones web con base de datos para obtener datos de los clientes. SQL es el acrónimo de Structured Query Language. Se utiliza para recuperar y manipular datos en la base de datos.
¿Qué es una inyección SQL?
La inyección SQL es un ataque que envenena las declaraciones SQL dinámicas para comentar ciertas partes de la declaración o agregar una condición que siempre será cierta. Aprovecha las fallas de diseño en aplicaciones web mal diseñadas para explotar declaraciones SQL para ejecutar código SQL malicioso.
En este tutorial, aprenderá técnicas de inyección SQL y cómo puede proteger las aplicaciones web de tales ataques.
- Cómo funciona la inyección SQL
- Actividad de piratería: SQL inyecta una aplicación web
- Otros tipos de ataques de inyección SQL
- Herramientas de automatización para inyección SQL
- Cómo prevenir los ataques de inyección de SQL
- Actividad de piratería: utilice Havji para la inyección SQL
Cómo funciona la 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 declaraciones SQL dinámicas . Una declaración dinámica es una declaración que se genera en tiempo de ejecución utilizando la contraseña de parámetros de un formulario web o una cadena de consulta URI.
Consideremos una aplicación web simple con un formulario de inicio de sesión. El código del formulario HTML se muestra a continuación.
AQUÍ,
- El formulario anterior acepta la dirección de correo electrónico y la contraseña luego los envía a un archivo PHP llamado index.php.
- Tiene la opción de almacenar la sesión de inicio de sesión en una cookie. Hemos deducido esto de la casilla de verificación Remember_me. Utiliza el método de publicación para enviar datos. Esto significa que los valores no se muestran en la URL.
Supongamos que la declaración en el backend para verificar el ID de usuario es la siguiente
SELECCIONE * DE los usuarios DONDE correo electrónico = $ _POST ['correo electrónico'] Y contraseña = md5 ($ _ POST ['contraseña']);
AQUÍ,
- La declaración anterior usa los valores de la matriz $ _POST [] directamente sin desinfectarlos.
- La contraseña se cifra mediante el algoritmo MD5.
Ilustraremos el ataque de inyección SQL usando sqlfiddle. Abra la URL http://sqlfiddle.com/ en su navegador web. Obtendrá la siguiente ventana.
Nota: tendrá que escribir las declaraciones SQL
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 ('This email address is being protected from spambots. You need JavaScript enabled to view it.',md5('abc'));
Paso 2) Haga clic en Crear esquema
Paso 3) Ingrese este código en el panel derecho
seleccionar * de los usuarios;
Paso 4) Haga clic en Ejecutar SQL. Verás el siguiente resultado
Supongamos que el usuario proporciona Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. y 1234 como contraseña. La declaración que se ejecutará contra la base de datos sería
SELECT * FROM users WHERE email = ' Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. ' Y contraseña = md5 ('1234');
El código anterior puede explotarse comentando la parte de la contraseña y agregando una condición que siempre será cierta. Supongamos que un atacante proporciona la siguiente entrada en el campo de la dirección de correo electrónico.
Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. ' O 1 = 1 LÍMITE 1 - ']
xxx para la contraseña.
La declaración dinámica generada será la siguiente.
SELECT * FROM users WHERE email = ' Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. ' O 1 = 1 LÍMITE 1 - '] Y contraseña = md5 (' 1234 ');
AQUÍ,
- Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. termina con una comilla simple que completa la cita de cadena
- O 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 en el cuadro de texto SQL FiddleRun SQL como se muestra a continuación
Actividad de piratería: SQL inyecta una aplicación web
Tenemos una aplicación web simple en http://www.techpanda.org/ que es vulnerable a los ataques de inyección SQL solo con fines de demostración. El código de formulario HTML anterior se toma de la página de inicio de sesión. La aplicación proporciona seguridad básica, como desinfectar el campo del correo electrónico. Esto significa que nuestro código anterior no se puede utilizar para omitir el inicio de sesión.
Para evitar eso, podemos aprovechar el campo de contraseña. El siguiente diagrama muestra los pasos que debe seguir
Supongamos que un atacante proporciona la siguiente entrada
- Paso 1: Ingrese Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. como la dirección de correo electrónico
- Paso 2: Ingrese xxx ') O 1 = 1 -]
- Haga clic en el botón Enviar
- Serás dirigido al tablero
La declaración SQL generada será la siguiente
SELECT * FROM users WHERE email = ' Esta dirección de correo electrónico está protegida contra spambots. Necesita tener JavaScript habilitado para verlo. ' Y contraseña = md5 ('xxx') O 1 = 1 -] ');
El siguiente diagrama ilustra que se ha generado la declaración.
AQUÍ,
- La declaración asume inteligentemente que se usa el cifrado md5
- Completa la cotización única y el paréntesis de cierre.
- Agrega una condición a la declaración que siempre será verdadera.
En general, un ataque de inyección SQL exitoso intenta una serie de técnicas diferentes, como las demostradas anteriormente, para llevar a cabo un ataque exitoso.
Otros tipos de ataques de inyección SQL
Las inyecciones de SQL pueden hacer 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.
- Exportación de datos valiosos, como detalles de tarjetas de crédito, correo electrónico y contraseñas al servidor remoto del atacante
- Obtener los detalles de inicio de sesión del usuario, etc.
La lista de arriba no es exhaustiva; solo te da una idea de lo que es la inyección SQL
Herramientas de automatización para inyección SQL
En el ejemplo anterior, usamos técnicas de ataque manual basadas en nuestro vasto conocimiento de SQL. Existen herramientas automatizadas que pueden ayudarlo a realizar los ataques de manera más eficiente y en el menor tiempo posible. Estas herramientas incluyen
- SQLSmack: https://securiteam.com/tools/5GP081P75C
- SQLPing 2: http://www.sqlsecurity.com/downloads/sqlping2.zip?attredirects=0&d=1
- SQLMap: http://sqlmap.org/
Cómo prevenir los ataques de inyección de SQL
Una organización puede adoptar la siguiente política para protegerse contra los ataques de inyección de SQL.
- La entrada del usuario nunca debe ser confiable: siempre debe desinfectarse antes de que se use 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 que funcionen creando primero la declaración SQL y luego tratando todos los datos de usuario enviados como parámetros. Esto no tiene ningún efecto sobre la sintaxis de la instrucción SQL.
- Expresiones regulares: se pueden usar para detectar código potencialmente dañino y eliminarlo antes de ejecutar las declaraciones SQL.
- Derechos de acceso de usuario de conexión a la base de datos: solo 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 pueden realizar las sentencias SQL en el servidor.
- Mensajes de error: estos no deben revelar información confidencial y dónde ocurrió exactamente un error. Mensajes de error personalizados simples como "Lo sentimos, estamos experimentando errores técnicos. Se ha contactado 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 la inyección de SQL
En este escenario práctico, vamos a utilizar el programa Havij Advanced SQL Injection para escanear un sitio web en busca de vulnerabilidades.
Nota: su programa antivirus puede marcarlo 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
La herramienta anterior se puede utilizar para evaluar la vulnerabilidad de un sitio web / aplicación.
Resumen
- 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 y actualizar y eliminar datos.
- Las herramientas de inyección SQL incluyen SQLMap, SQLPing y SQLSmack, etc.
- Una buena política de seguridad al escribir una declaración SQL puede ayudar a reducir los ataques de inyección de SQL.