Professional Documents
Culture Documents
SQL es un lenguaje textual utilizado para interactuar con bases de datos relacionales. La unidad
tpica de ejecucin de SQL es la consulta "query", conjunto de instrucciones que permiten modificar
la estructura de la base de datos (mediante instrucciones del tipo Data Definition Language) o
manipular el contenido de la base de datos (mediante instrucciones del tipo Data Manipulation
Language). En los servidores Web se utiliza este lenguaje para acceder a bases de datos y ofrecer
pginas dinmicas o nuevas funcionalidades a los sistemas.
Se conoce como Inyeccin SQL, indistintamente, al tipo de vulnerabilidad, al mtodo de infiltracin,
al hecho de incrustar cdigo SQL intruso y a la porcin de cdigo incrustado.
El ataque por inyeccin de cdigo SQL se produce cuando no se filtra de forma adecuada la
informacin enviada por el usuario. Un usuario malicioso podra incluir y ejecutar textos que
representen nuevas sentencias SQL que el servidor no debera aceptar. Este tipo de ataque es
independiente del sistema de bases de datos subyacente, ya que depende nicamente de una
inadecuada validacin de los datos de entrada.
Como consecuencia de estos ataques y dependiendo de los privilegios del usuario de base de
datos bajo el cual se ejecutan las consultas, se podra acceder no solo a las tablas relacionadas
con la operacin de la aplicacin del servidor Web, sino tambin a las tablas de otras bases de
datos alojadas en el mismo servidor Web.
Tambin pueden propiciar la ejecucin de comandos arbitrarios del sistema operativo del equipo
del servidor Web.
Ejemplos
As, como ejemplos de ataques de inyeccin de cdigo SQL podramos considerar las siguientes:
Ejemplo 1:
Si en el servidor se va a ejecutar una sentencia SQL del tipo:
UPDATE tabla set PASSWORD='$INPUT[password]' WHERE user='$INPUT[user_id]';
pensada en principio para actualizar la contrasea de un determinado usuario registrado en el
sistema, se podra llevar a cabo un ataque por inyeccin de cdigo SQL con una direccin URL
preparada de forma maliciosa tal y como sigue:
http://www.servidor.com/script?pwd=clave%uid=1'+or+uid+like'%"admin%';
la cual tendra como consecuencia que el atacante conseguira acceder a la base de datos con el
perfil de administrador.
Ejemplo 2:
Si en el servidor se va a ejecutar una sentencia SQL del tipo:
SELECT nombre FROM productos WHERE id LIKE '%$INPUT[cod_prod]%';
pensada para devolver el nombre de un producto a partir de su cdigo identificador, se podra
producir un ataque por inyeccin de cdigo SQL con una direccin URL preparada as:
http://www.servidor.com/script?' EXEC+ master..xp_cmdshell(cmd.exe+/c)"
la cual tendra como consecuencia que el atacante podra ejecutar una aplicacin del sistema
operativo
del
equipo,
en
este
caso
el
propio
interprete
de
comandos
Ejemplo 3:
Si en el servidor se va a ejecutar una sentencia SQL del tipo:
SELECT * FROM usuarios WHERE username = " + username + "AND password=" +
password +";
se podra producir un ataque si el usuario especifica lo siguiente:
username: ; drop table users ;
password:
ya que entonces la tabla 'usuarios' seria borrada de la base de datos, denegando el acceso a todos
los dems usuarios (ataque de denegacin de servicio).
Ejemplo 4:
Por ejemplo, asumiendo que el siguiente cdigo reside en una aplicacin web y que existe un
parmetro "nombreUsuario" que contiene el nombre de usuario a consultar, una inyeccin SQL se
podra provocar de la siguiente forma:
El cdigo SQL original y vulnerable es:
consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario +
"';"
Si el operador escribe un nombre, por ejemplo "Alicia", nada anormal suceder, la aplicacin
generara una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se
seleccionaran todos los registros con el nombre "Alicia" en la base de datos:
SELECT * FROM usuarios WHERE nombre = 'Alicia';
Pero si un operador malintencionado escribe como nombre de usuario a consultar:
Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE
'%
se generara la siguiente consulta SQL, (el color verde es lo que pretende el programador, el azul
es el dato, y el rojo, el cdigo SQL inyectado):
SELECT * FROM usuarios WHERE nombre = 'Alicia';
DROP TABLE usuarios;
SELECT * FROM datos WHERE nombre LIKE '%';
Ntese por qu se llama "Inyeccin" SQL. Si se observa el cdigo malicioso, de color rojo, se
notar que est insertado en el medio del cdigo bueno, el verde. As, el cdigo rojo ha sido
"inyectado" dentro del verde.
Ejemplo 5:
Si se tiene la siguiente pagina web
Simula una aplicacin que requiere identificacin de usuario y password. Si se intenta entrar un
usuario y password al azar la aplicacin dir Acceso denegado El login y password correcto son:
admin y admin1234. Se puede comprobar introducindolo.
Ahora se va a conseguir acceso PERMITIDO usando inyeccin SQL, sin conocer ni el Login ni el
Password.
Y variantes de consultas:
Ejemplos de ataques:
-Obtencin de la base de datos completa usando sentencias SELECT
-Modificacin o insercin de datos usando INSERT o UPDATE
-Borrado de la base de datos usando DELETE
-Ejecucin de comandos del sistema operativo usando EXEC master.dbo.xp_cmdshell por
ejemplo, el valor de pass sera pass=hack' EXEC master.dbo.xp_cmdshell'cmd.exe dir c:'--Apagado remoto del servidor pass=hack' EXEC master.dbo.xp_cmdshell'cmd.exe shutdown'--
MS SQL
La ejecucin de sentencias mltiples SI est permitida
Anidamiento de consultas SELECT Uso de UNION posible
Uso de procedimientos invocables desde la inyeccin (mencion especial de 'xp_cmdshell' )
Sin embargo, NO ACONSEJA DEL TODO SU USO, pues a menudo lleva a errores una mala
gestin de las barras.
En su lugar se propone usar la siguiente funcin.
2. Mysql_real_scape_string( $cadena)
Evita todos los caracteres especiales de la $cadena argumento, teniendo en cuenta el juego de
caracteres usado en la conexin, de forma que sea segura usarla con Mysql_query.
Coloca barras en los siguientes 7 caracteres:\x00 \n \r \ ' \x1a que se consideran peligrosos pues
pueden ser usados para varios tipos de ataques.
La funcin retorna la cadena con barras, pero la variable original $cadena entrada no se modifica.
Algo parecido a esta funcin se puede realizar colocando comillas dobles de la
forma $sql=SELECT * FROM tabla WHERE usuario =' $_POST[usuario ] ' ;
No haga suposiciones sobre el tamao, tipo o contenido de los datos que recibir la
aplicacin. Por ejemplo, debe hacer la siguiente evaluacin:
Cuando trabaje con documentos XML, valide todos los datos con respecto a su esquema a
medida que se vayan indicando.
Utilice procedimientos almacenados para validar los datos indicados por el usuario.
En entornos de varios niveles, todos los datos deben validarse antes de que se admitan en
la zona de confianza. Los datos que no superen el proceso de validacin deben
rechazarse, y debe devolverse un error al nivel anterior.
Implemente varias capas de validacin. Las precauciones que tome contra usuarios
malintencionados ocasionales pueden resultar ineficaces contra piratas informticos con
determinacin. Lo ms recomendable es validar los datos especificados por el usuario en
la interfaz de usuario y, despus, en todos los puntos posteriores en que atraviesen un
lmite de confianza.
Por ejemplo, la validacin de datos en una aplicacin de cliente puede evitar la inyeccin de
scripts. Sin embargo, si en el siguiente nivel se asume que ya se ha validado la entrada, cualquier
usuario malintencionado que sea capaz de eludir un cliente puede disfrutar de un acceso sin
restricciones a un sistema.
No acepte las siguientes cadenas en campos a partir de los que puedan construirse
nombres de archivo: AUX, CLOCK$, COM1 a COM8, CON, CONFIG$, LPT1 a LPT8, NUL
y PRN.
HERRAMIENTAS
http://www.taringa.net/posts/linux/15058932/Miedo-a-una-injeccion-SQL_-_-8Tool_s-para-enfrentarlas.html
http://www.hacktimes.com/sqlihelper_2_7_sql_injection/
Se trata de una aplicacin cuyo objetivo es facilitar la extraccin de informacin procedente
de bases de datos, utilizando tcnicas de inyeccin de SQL.
La ltima versin, 2.7, cuenta con soporte para motores de bases de datos SQL Server,
Mysql y access. Aunque no se trata de una herramienta tan slida y potente como, por
ejemplo, Pangolin, s que tiene multitud de ventajas sobre todo para bases de datos
MySQL
http://www.hacktimes.com/pangolin_automatizaci_n_de_inyecci_n_sql/
Pangoln es una herramienta grfica para plataformas win32 programada en C++ destinada
a explotar vulnerabilidades del tipo inyeccin SQL e inyeccin SQL ciega (Blind SQL) muy
fcil de usar y muy rpida.
En aquellos motores donde la vulnerabilidad lo permita, la herramienta implementa
explotacin para conseguir informacin y datos del servidor, ejecucin de shell, acceso al
registro, escritura o descarga de ficheros del servidor, navegador de archivos, etc. Las
consultas y peticiones a la base de datos pueden efectuarse via Proxy y utilizar mtodos de
evasin contra firewalls e IDS.
SQLMap
http://sqlmap.org/
SQLMap es una herramienta para pruebas de acceso, de cdigo abierto que automatiza el
proceso de deteccin y explotacin de vulnerabilidades SQL, y control de los servidores de
bases de datos. Posee un poderoso motor de deteccin, caractersticas para pruebas de
acceso y un amplio rango de interruptores de duracin que van desde bases de datos con
toma de huellas dactilares, sobre captacin de datos, hasta el acceso a archivos del
sistema subyacentes y la ejecucin de comandos en el sistema operativo va conexiones
fuera de banda.
http://code.google.com/p/enema/
Videos de Inters
http://www.youtube.com/watch?v=PB7hWlqTSqs&feature=related
http://www.youtube.com/watch?v=-uqotuscuQE&feature=related