jueves, 28 de febrero de 2008

SQL Injection: Atacar bases de datos con este método

SQL Injection

Aquí voy a daros a conocer lo que es el SQL Injection, creo que es algo bastante interesante y que llama la atención, así que a pesar de que puede que le tengas tirria a las bases de datos no pasa nada si te culturizas un poco y tal vez hasta te parezca interesante :P


¿Qué es el SQL Injection?

SQL Injection es una conocida técnica (que tiene unos años) para atacar bases de datos, se basa en inyectar código SQL no deseado dentro de otro código SQL para causar un comportamiento no esperado en la base de datos, normalmente, destruirla o bien lograr un acceso en modo privilegiado a la base de datos mediante alguna aplicación que gestione la base de datos.


¿Cómo se logra esto?

Hay muchas formas de inyectar código intruso, la primera y más conocida es el simple

' or '1'='1

Y funciona de la siguiente forma, imaginemos el típico formulario web para entrar como administrador/usuario a una determinada página, algo de este estilo:



A nivel de aplicación ejecuta un código SQL parecido a este:

SELECT * FROM miembros WHERE username ='user' AND password ='password';

Si el sistema no está protegido contra SQL injection nos podríamos loguear como administradores simplemente poniendo de usuario administrador y de password la cadena mágica de antes (' or '1'='1), quedando así:

SELECT * FROM miembros WHERE username ='admin' AND password ='' or '1'='1';

Cómo veis, el funcionamiento es sencillo: Se basa en cerrar la comilla del campo password y añadir una condición OR que siempre se cumplirá: '1' = '1', de modo que aunque falle la comprobación de la contraseña, el '1' = '1' si que devolverá true, con lo que podremos entrar al sistema como administradores sin saber la contraseña.

Otro ejemplo:

También se puede acceder a un sitio vulnerable aprovechando el comentario en SQL (recordad que en SQL todo lo que hay a continuación de dos barras (--) es un comentario), este exploit es con el username (el otro era con el password) y se realiza de la siguiente forma:

Select * from usuarios where username ='user' and password ='password';

Volvamos a nuestro select, y esta vez en el campo usuario vamos a poner admin'-- con lo que la sentencia inyectada queda de la siguiente forma

SELECT * FROM miembros WHERE username = 'admin'--' AND password = 'password';

Tal y cómo se aprecia la sentencia que ejecuta es:

SELECT * FROM miembros WHERE username = 'admin'

Con lo que te logueará como administrador porque lo demás es un comentario y es ignorado.


¿Quién tiene la culpa?

Es tarea del programador de la aplicación evitar este tipo de riesgos, actualmente las aplicaciones están protegidas contra ataques de SQL injection y la solución es bastante asequible, sólo hace falta comprobar que los datos que se introduzcan sean números y letras, para así evitar que se añadan las dichosas comillas, etc...

Y por último el detalle friki solo para fanáticos:

Sin comentarios.


Espero que os haya gustado la clase de bases de datos gratuita :P Y si te ha parecido interesante comenta ;)

Saludos!

3 comentarios:

Jose dijo...

La verdad es que es una entrada bastante chula e interesante. Es algo que no te enseñan por clase jeje. Me ha gustado bastante, y eso que yo, al igual que Victor, odio las bases de datos.

Unknown dijo...

al parecer esto ya esta resuelto por las nuevas versiones de php creo por que ise unas pruebas y cuando los codigos sql son procesados se les agrega \ para que no afecte directamente la consulta solo pasando a una variable el valor recojido por post y pasando esas variables a la query. mmm no se ejecuta codigo malintencionado sql.

Anónimo dijo...

Very nice post - thanks!