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: