SQL INYECTION


La vulnerabilidad consiste en conseguir añadir (inyectar) código SQL en una aplicación (normalmente una aplicación Web) para modificar la forma en que se realizan consultas a una base de datos y evadir los mecanismos de seguridad existentes, ejecutar comandos en el servidor, recuperar datos sensibles, etcétera.
Cuando un compañero investigador de Forristal envió un mensaje a Microsoft explicando el problema que habían descubierto, su respuesta fue bastante hilarante: “lo que nos describe usted no es un problema, así que no se preocupe por hacer nada para solucionarlo”. Hoy día, dieciocho años después de su primera divulgación pública, la SQLi se encuentra, repetidamente, en el puesto número uno de vulnerabilidades en el informe OWASP Top 10, que se publica cada tres años por la Fundación OWASP (Open Web Application Security Project) y que controla las perores amenazas a las que se enfrentan los sitios web en la actualidad.
Casi veinte años después, los motores de lenguaje SQL han evolucionado mucho, pero la destreza del programador de consultas es prácticamente lo único que cuenta para evitar estos ataques. La destreza y, también, la experiencia en estas lides, sabiendo en todo momento dónde debe poner las trabas necesarias para que un atacante externo no tenga acceso a la información devuelta por según qué consultas maliciosas.

Descripción


Se dice que existe o se produjo una inyección SQL cuando, de alguna manera, se inserta o "inyecta" código SQL invasor dentro del código SQL programado, a fin de alterar el funcionamiento normal del programa y lograr así que se ejecute la porción de código "invasor" incrustado, en la base de datos.
Este tipo de intrusión normalmente es de carácter malicioso, dañino o espía, por tanto es un problema de seguridad informática, y debe ser tomado en cuenta por el programador de la aplicación para poder prevenirlo. Un programa elaborado con descuido, displicencia o con ignorancia del problema, podrá resultar ser vulnerable, y la seguridad del sistema (base de datos) podrá quedar eventualmente comprometida.
La intrusión ocurre durante la ejecución del programa vulnerable, ya sea, en computadores de escritorio o bien en sitios Web, en este último caso obviamente ejecutándose en el servidor que los aloja.
La vulnerabilidad se puede producir automáticamente cuando un programa "arma descuidadamente" una sentencia SQL en tiempo de ejecución, o bien durante la fase de desarrollo, cuando el programador explicita la sentencia SQL a ejecutar en forma desprotegida. En cualquier caso, siempre que el programador necesite y haga uso de parámetros a ingresar por parte del usuario, a efectos de consultar una base de datos; ya que, justamente, dentro de los parámetros es donde se puede incorporar el código SQL intruso.

Blind SQL injection


Ataque a ciegas por inyección SQL', en inglés, Blind SQL injection, es una técnica de ataque que utiliza la inyección SQL. Se evidencia cuando en una página web, por un fallo de seguridad, no se muestran mensajes de error al no producirse resultados correctos ante una consulta a la base de datos, mostrándose siempre el mismo contenido (es decir, solo hay respuesta si el resultado es correcto).
Sentencias condicionales con el tipo "Or 1=1" o "having 1=1" ofrecen respuestas siempre correctas (true o verdadero) por lo cual suelen ser usadas por los programadores como formas de comprobación. El problema para la seguridad de la página radica en que esta técnica es utilizada en combinación con diccionarios o fuerza bruta para la búsqueda, carácter por carácter, de una contraseña, un nombre de usuario, un número de teléfono o cualquier otra información que albergue la base de datos atacada; para ello se utiliza código SQL específico que "va probando" cada carácter consiguiendo un resultado positivo acumulable cuando hay una coincidencia. De esta manera se puede saber, por ejemplo, que una contraseña comienza por "F...", luego continúa con ".i...", y luego "..r...", etc (acumula Fir...), hasta dar con la palabra completa.
Existen programas que automatizan este proceso de "tanteos" letra por letra en el resultado de la consulta SQL, que un intruso podría enviar inyectado.

  Herramientas sql injection


Las aplicaciones Web permiten a los visitantes enviar y obtener datos desde y hacia una base de datos ubicada en Internet. Las bases de datos son el corazón de la mayoría de las aplicaciones Web. Ellas almacenan los datos requeridos por las aplicaciones para entregar contenido específico a los visitantes y proveer información a clientes, proveedores, etc.
La inyección SQL es quizá la técnica más común de hacking a aplicaciones Web la cual tiene como objetivo transpasar comandos SQL directamente a la base de datos en el back-end utilizando como plataforma la misma aplicación.
La vulnerabilidad se presenta cuando alguna entrada de usuario no valida correctamente los parámetros que se le entregan y por ende son ejecutados. Algunas de estas herramientas o por lo menos lo más importante son.

SQLmap


SQLMap es una herramienta de inyección SQL ciega automática, desarrollada en Python, es capaz de generar una huella digital activa del sistema de administración de bases de datos y mucho más

SQLier


SQLIer toma una URL vulnerable e intenta obtener toda la información necesaria para explotar la vulnerabilidad de inyección SQL por si mismo, no requiriendo ninguna intervención del usuario.

SQLbftools


SQLbftools consta de una colección de herramientas para obtener información de... MySQL disponible utilizando un ataque de inyección SQL ciega (blind SQL Injection).


Bobcat


BobCat es una herramienta que permite ayudar a un auditor a tomar completa ventaja de las vulnerabilidades de inyección SQL. Está basado en AppSecInc. Puede listar los servidores enlazados, esquemas (schema) de bases de datos y permite obtener datos de cualquier tabla a la cual la aplicación tenga acceso.

SQLNinja 


SQLNinja es una herramienta para explotar vulnerabilidades de inyección SQL en aplicaciones web que utilizan Microsoft SQL Server como su motor de base de datos

 Automagic SQL Injector 


 Automagic SQL Injector es una herramienta de inyección SQL automatizada que fue diseñada para ahorrar tiempo en los tests de intrusión y solamente funciona con agujeros de Microsoft SQL que devuelven errores. 

NGSS SQL Injector 


 NGSS SQL Injector explota vulnerabilidades de inyección SQL en distintos servidores para obtener acceso a la data almacenada. Actualmente soporta las siguientes bases de datos: Access, DB2, Informix, MSSQL, MySQL, Oracle, Sysbase. 

Listado básico de comandos SQL


ü  Grant Utilizado para otorgar privilegios
ü  Revoke Utilizado para eliminar privilegios
ü  Create Utilizado para crear nuevos elementos (tablas, dices…)
ü  Drop Utilizado para eliminar elementos
ü  Alter Utilizado para alterar campos de las tablas
ü  Select Utilizado para consultar registros de una tabla y comprobar que satisfagan una condición determinada
ü  Insert Utilizado para cargar lotes de datos en la base de datos
ü  Update Utilizado para cambiar valores de registros y campos
ü  Delete Elimina registros de una tabla de la base de datos

Lista de cláusulas básicas en SQL


ü  From Selecciona la tabla sobre la cual se va a operar (o sobre sus registros)
ü  Where Especifica las condiciones que se deben cumplir los registros que se seleccionan
ü  Group by Utilizado para separar registros en grupos
ü  Having Especifica las condiciones que cumple cada grupo
ü  Order by Ordena registros seleccionados

  ¿Evitar ataques de inyección sql?


El principal problema de estos ataques es que si dejamos que el usuario del programa introduzca libremente caracteres sin control ninguno (mediante formularios, por ejemplo) puede llegar a aprovecharse de las comillas (simples y dobles con las que declaramos cadenas de texto o strings). Las sentencias dinámicas son sentencias SQL que se crean como cadenas de texto (strings) y en las que se insertan/concatenan valores obtenidos de alguna fuente (normalmente proveniente del usuario), lo que puede hacer que sean vulnerables a inyección SQL si no se sanean las entradas, como por ejemplo:
$id_usuario = $_POST["id"];
mysql_query("SELECT * FROM usuarios WHERE id = $id_usuario");
Eso es un ejemplo de una vulnerabilidad grave en la seguridad de una aplicación (web o no) porque si el usuario introdujese un valor como 1; DROP TABLE usuarios;.




Como protegerse ante una inyección sql?


Existen diferentes medidas para prevenir ataques de inyección SQL y proteger la base de datos. Para ello es necesario familiarizarse con todos los componentes involucrados: el servidor, las aplicaciones individuales y el sistema de gestión de base de datos.

Supervisar las modificaciones automáticas en las aplicaciones


Comprueba y filtra los métodos y parámetros que utilizan las aplicaciones para acceder a la base de datos. Los datos transferidos siempre deben estar en el formato de datos esperado. Si, por ejemplo, se requiere un parámetro numérico, lo puedes comprobar mediante un script PHP incluyendo la función is_numeric (). El proceso de filtrado se encarga de ignorar caracteres especiales. Otro punto importante es asegurarse de que las aplicaciones no generen ningún mensaje de error externo que pueda revelar información sobre el sistema o la estructura de la base de datos utilizada.

Proporcionar una protección completa al servidor


Lógicamente, la seguridad del servidor en el que se ejecuta el sistema de gestión de base de datos juega un papel fundamental en la prevención de ataques de inyección SQL. La primera medida de seguridad es el endurecimiento del sistema operativo de acuerdo con el siguiente patrón:

ü  Instala y activa únicamente aquellas aplicaciones y servicios que son realmente relevantes para la base de datos.
ü  Elimina todas las cuentas de usuario que no sean necesarias.
ü  Asegúrate de instalar todas las actualizaciones relevantes para el sistema y el programa.



Blindar la base de datos y utilizar códigos más seguros


De la misma forma que un sistema operativo, una base de datos debería estar libre de factores externos irrelevantes y ser actualizada regularmente. Para ello es recomendable desactivar todos los servicios y cuentas de usuario inactivos, así como eliminar todos los procedimientos almacenados que no sean necesarios. Configura una cuenta de base de datos que esté destinada únicamente para el acceso desde la web y que tenga derechos de acceso mínimos. Recuerda almacenar toda la información confidencial, por ejemplo, las contraseñas, de manera cifrada en la base de datos.

Recomendaciones


6.2.1 No usar sentencias dinámicas ni funciones mySQL_*


Las funciones mysql_* (mysql_connect, mysql_query, etc.) son inseguras por naturaleza y su uso no sólo no está recomendado, sino que se consideran obsoletas y se han eliminado completamente a partir de PHP7.
Incluso los métodos nativos que existen en PHP para sanear las entradas de usuario (como mysql_real_escape_string) pueden presentar (raros) problemas y fallar en algunos casos como cuando se usan codificación de caracteres diferentes a UTF-8 junto a versiones no actualizadas de MySQL (en las páginas de PHP para estas funciones se avisa de este riesgo).

No usar sentencias preparadas y consultas parametrizadas


Aunque se podrían sanear las entradas usando métodos como mysqli_real_escape_string, es más recomendable la utilización de sentencias preparadas o parametrizadas. Las sentencias preparadas te permitirán ejecutar la misma sentencia con gran eficiencia.
En PHP, tienes dos alternativas principales: PDO y MySQLi. Hay varias diferencias entre ambas, pero la principal es que PDO se puede usar con diferentes tipos de base de datos (dependiendo del driver utilizado) mientras que MySQLi es exclusivamente para bases de datos MySQL. Es por ello que recomendaría PDO sobre MySQLi.


VÍDEO TUTORIAL

Conclusión

 

 

Después de haber visto todo sobre la inyección SQL, la importancia de una buena programación en las páginas, la manera de identificar cuando una página es vulnerable a ataques y la manera en la que podemos protegernos de dichos ataques.


Hoy día hay diferentes formas de obtener información de otras personas o de empresas y mediante la inyección SQL podemos lograr tener esa información que deseamos de terceros, de igual manera existen personas que solo quieren esa información para hacerle daño a otras.

 

 

 

 Referencias


         https://es.stackoverflow.com/questions/18232/c%C3%B3mo-evitar-la-inyecci%C3%B3n-sql-en-php




0 comentarios: