Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ataques Por Inyección de Código SQL
Ataques Por Inyección de Código SQL
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.
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:
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:
Ejemplo 3:
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:
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:
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):
En resumen, cualquier dato de la base de datos puede quedar disponible para ser ledo o
modificado por un usuario malintencionado.
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:
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:
MySQL
Se ejecuta con privilegios de 'root' por defecto
Volcado a ficheros con INTO OUTFILE
La ejecucin de sentencias mltiples es POCO PROBABLE, pocos mdulos lo permiten
Oracle
La ejecucin de sentencias mltiples NO est permitida
Anidamiento de consultas SELECT Uso de UNION posible
Uso de procedimientos invocables desde la inyeccin
Postgres
La ejecucin de sentencias mltiples SI est permitida
Anidamiento de consultas SELECT Uso de UNION posible
Uso de procedimientos invocables desde la inyeccin Uso de COPY posible como
superusuario
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' )
Es muy difcil desarrollar una aplicacin segura a la primera. Ni siquiera las grandes aplicaciones
escritas por programadores expertos estn libres de fallos. La falta de tiempo y el nmero de
programadores implicados en la aplicacin son factores habituales que juegan en contra de la
seguridad. Por este motivo son necesarias las auditoras de cdigo, para localizar vulnerabilidades
en el cdigo.
La auditora puede realizarse manualmente o mediante herramientas existentes para tales fines.
- Sin embargo hay muchos errores de lgica que estas herramientas son incapaces de hallar
1. Magic_quotes
Es una variable que se encuentra en el fichero .ini de configuracin de PHP. Cuando su valor es
On, todas las entradas por parmetros sufrirn la adicin de la barra invertida delante de la comilla
simple.
Si entra user=pe'dro se convertir en pe\'dro , de forma que el interprete SQL no tomar la comilla
como parte sintctica, sino como dato carcter.
Estas prcticas son una medida de seguridad habitualmente recomendada por autores de cdigo.
Sin embargo, NO ACONSEJA DEL TODO SU USO, pues a menudo lleva a errores una mala
gestin de las barras.
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 ] ' ;
Aunque el valor de la consulta sea un entero, delimitarlo siempre entre comillas simples. Una
sentencia del estilo
Si se espera recibir un entero, no confiar en que lo sea, es mejor verificar con is_int(). Igualmente
si es un long con is_long(), o un char, un varchar, o cualquier tipo con gettype(). Si se prefiere
tambin se puede convertir al tipo de dato que se espera con intval() settype().
Comprobar tambin la longitud de las cadenas con strlen() o su formato con strpos(). Con esto se
evitar posibles tcnicas avanzadas de inyeccin SQL.
Es muy pesado programar vigilando y revisando constantemente cada variable, cada tipo, cada
caracter. Es mejor crear libreras propias, una clases que acten como capa de abstraccin de
todas estas ideas necesarias a tener en cuenta constantemente. Se programar ms rpido, se
evitarn descuidos, y simplemente se usa la seguridad que ya se program.
El paquete DB del grupo PEAR va ms all de la seguridad. Es una capa de abstraccin para
bases de datos. El inconveniente es que se depende siempre de sus paquetes. Pero la ventaja es
la despreocupacin.
7. Filtrando los datos enviados por el usuario antes de que estos sean procesados por el servidor,
para evitar que se puedan incluir y ejecutar textos que representen nuevas sentencias SQL.
9. Valide siempre los datos especificados por el usuario mediante comprobaciones de tipo,
longitud, formato e intervalo. A la hora de implementar medidas de precaucin frente a la
especificacin de datos dainos, tenga en cuenta la arquitectura y los escenarios de
implementacin de la aplicacin. Recuerde que los programas diseados para ejecutarse en un
entorno seguro pueden copiarse en un entorno no seguro. Las sugerencias que se muestran a
continuacin deben considerarse prcticas recomendadas:
No haga suposiciones sobre el tamao, tipo o contenido de los datos que recibir la
aplicacin. Por ejemplo, debe hacer la siguiente evaluacin:
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_-_-8-
Tool_s-para-enfrentarlas.html
http://www.hacktimes.com/sqlihelper_2_7_sql_injection/
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.
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/
Enema no es un software de auto-hackeo. Es una herramienta dinmica para testers de
intrusin profesionales. Versin estable actual: 1.7
Videos de Inters
http://www.youtube.com/watch?v=PB7hWlqTSqs&feature=related
http://www.youtube.com/watch?v=-uqotuscuQE&feature=related