¿Qué necesito?

  • Cualquier servidor dedicado o virtual
  • Ubuntu
  • masilla

¿Qué es la inyección SQL?

La inyección SQL es una técnica que utilizan los atacantes para insertar consultas SQL en campos de entrada, que luego son procesados ​​por la base de datos SQL subyacente. Se puede abusar de estas debilidades cuando los formularios de entrada permiten que las declaraciones SQL generadas por el usuario consulten la base de datos directamente. Para darle un escenario de ejemplo, use un formulario de inicio de sesión típico, que consta de un campo de usuario y correo electrónico y un campo de contraseña. Una vez enviadas las credenciales, se combinan con una consulta SQL en su servidor web. En PHP, el comando se escribe de la siguiente manera:

<?php
$query = "SELECT * FROM users WHERE username="" . $_POST["username'] . 
"'";
$query .= " AND password = '" . $_POST['password'] . "'";
?>

Se envía al servidor para verificar que se le ha asignado un nombre de usuario y contraseña válidos. Un nombre de usuario ‘xander’ con la contraseña ‘drake’ resultaría en este comando:

SELECT * FROM users WHERE username="xander" AND password='drake'

Pero si escribe algo como ‘xander’; – ‘la consulta se vería así:

SELECT * FROM users WHERE username="xander"; -- ' AND password='drake'

En este escenario, el atacante utiliza la sintaxis de comentarios SQL. El código restante después de la secuencia de doble barra (-) no se ejecuta. Es decir, un SQL sería:

SELECT * FROM users WHERE username="xander";

Luego devuelve los datos del usuario ingresados ​​en el campo de contraseña. Este movimiento podría pasar por alto la pantalla de inicio de sesión. Un atacante también puede ir más allá agregando otra condición de selección «OR 1 = 1», lo que conduce a la siguiente consulta:

SELECT * FROM users WHERE username="xander" OR 1=1;

La consulta devuelve un registro no vacío para cada inicio de sesión potencial con toda la base de datos de la tabla de usuarios. El truco anterior le mostró una vulnerabilidad significativa en cualquier sitio, pero es solo un pequeño ejemplo de lo que podría hacer. Los hacks más avanzados permiten que un atacante ejecute instrucciones arbitrarias, lo que hace mucho más daño. Esto puede llevar a:

  • Extracción de datos privados como tarjetas de crédito, pasaportes, expedientes hospitalarios,
  • Lista de datos de usuario para autenticación para que estos inicios de sesión se puedan utilizar en otros sitios web,
  • una base de datos dañada, ejecución de comandos del sistema operativo, datos eliminados o insertados y operaciones destruidas para todo el sitio web
  • un compromiso de sistema completo
  1. Técnicas para prevenir la inyección de SQL

Dado que los canales de entrada del usuario son el vector principal de tales ataques, el mejor enfoque es controlar y revisar la entrada del usuario para buscar patrones de ataque. Los desarrolladores también pueden evitar las vulnerabilidades de seguridad mediante el uso de los siguientes métodos de prevención principales.

  1. Validación de entrada

El proceso de validación tiene como objetivo comprobar si el tipo de entrada enviada por un usuario es legal o no. La validación de entrada garantiza que sea del tipo, la longitud, el formato, etc. aceptados. Solo se puede procesar el valor que pasa la validación. Ayuda a contrarrestar los comandos insertados en la cadena de entrada. En cierto modo, es como comprobar quién llama antes de abrir la puerta.

  1. Consultas parametrizadas

Las consultas parametrizadas son un medio de precompilar una declaración SQL para que luego pueda especificar los parámetros para ejecutar la declaración. Esta técnica permite que la base de datos reconozca el código y lo distinga de los datos de entrada. La entrada del usuario se cita automáticamente y la entrada proporcionada no causa un cambio en la intención, por lo que este estilo de codificación ayudará a prevenir un ataque de inyección SQL. Es posible utilizar consultas parametrizadas con la extensión MySQLi, pero PHP 5.1 ofrece un mejor enfoque para trabajar con bases de datos: PHP Data Objects (PDO). PDO utiliza métodos que simplifican el uso de consultas parametrizadas. Además, hace que el código sea más fácil de leer y más portátil porque se ejecuta en varias bases de datos, no solo en MySQL.

  1. Procedimientos almacenados

Los procedimientos almacenados (SP) requieren que el desarrollador agrupe una o más sentencias SQL en una unidad lógica para crear un plan de ejecución. Las siguientes explicaciones permiten la parametrización automática de instrucciones. En pocas palabras, es un tipo de código que puede guardarse para más tarde y usarse muchas veces. Entonces, siempre que necesite ejecutar la consulta en lugar de escribirla una y otra vez, puede simplemente llamar al procedimiento almacenado.

  1. Escapar

Utilice siempre escapes de caracteres para la entrada proporcionada por el usuario, que es proporcionada por cualquier sistema de administración de bases de datos (DBMS). Esto se hace para asegurar que el DBMS nunca lo confunda con la declaración SQL proporcionada por el desarrollador.

  1. Evitar los derechos de administrador

No conecte su aplicación a la base de datos a través de una cuenta con acceso de root. Esto solo debe hacerse cuando sea absolutamente necesario, ya que el atacante podría obtener acceso a todo el sistema. Incluso el servidor con cuentas no administrativas puede comprometer una aplicación, incluso más si el servidor de base de datos es utilizado por múltiples aplicaciones y bases de datos. Por esta razón, es mejor forzar el mínimo privilegio en la base de datos para proteger la aplicación contra la inyección de SQL. Asegúrese de que cada aplicación tenga sus propias credenciales de base de datos y de que esas credenciales tengan los derechos mínimos que necesita la aplicación. En lugar de intentar averiguar qué privilegios revocar, concéntrese en determinar qué privilegios o privilegios elevados necesita su aplicación. Si un usuario solo necesita acceder a algunas partes, puede crear un modo que sea únicamente para esta función.

  1. Firewall de aplicaciones web

Una de las mejores prácticas para detectar ataques de inyección de SQL es utilizar un firewall de aplicaciones web (WAF). Un WAF que opera frente a los servidores web monitorea el tráfico de datos entrante y saliente de los servidores web e identifica patrones que representan una amenaza. En esencia, es una barrera entre la aplicación web e Internet.

Un WAF funciona utilizando reglas de seguridad web definidas y personalizables. Estos conjuntos de pautas informan al WAF qué puntos débiles y comportamiento del tráfico debe buscar. Con base en esta información, un WAF monitorea las aplicaciones y las solicitudes GET y POST recibidas para encontrar y bloquear el tráfico malicioso.

El valor de un WAF proviene en parte de la facilidad con la que se pueden aplicar los cambios de política. Se pueden agregar nuevas políticas sobre la marcha, lo que permite una rápida implementación de reglas y respuesta a incidentes.

Conclusión

Las técnicas de prevención como la validación de entrada, las consultas parametrizadas, los procedimientos almacenados y el escape funcionan bien con diferentes vectores de ataque. Sin embargo, debido a la amplia variación en el patrón de ataques de inyección de SQL, a menudo no pueden proteger las bases de datos.

Por lo tanto, si desea cubrir todos los aspectos básicos, considere usar las estrategias anteriores combinadas con un WAF confiable. La principal ventaja del WAF es que protege las aplicaciones web personalizadas que de otro modo estarían desprotegidas.