Inyección de SQL

Eduardo Viernes 29 de Diciembre del 2006

¿Qué es SQL? y ¿cómo que inyectar SQL? ¿qué es todo eso? pues es una de las vulnerabilidades más comunes que hay entre los programadores, pues sobre todo lenguajes como php y asp son muy vulnerables a este tipo de cosas, ¿porqué?, por su manera de hacer consultas a bases de datos.

SQL es un lenguaje de consulta a bases de datos, por ejemplo wordpress usa en algun momento consultas a bases de datos, es más cuando entran a Yahoo Mail y ponen su user y password, al poner enviar estan enviando algo a una base de datos.

Y bueno lo importante de todo esto es que el que tu pantallita de login sea vulnerable a SQL Injection quiere decir que probablemente los usuarios podrán entrar sin problemas a cualquier mail, cosa que sería bastante importante no lo creen y no solo eso, si saben bien como usarlo podrían llegar a borrar una base de datos entera, lo que realmente sería un problema.

A grandes rasgos esta es una consulta sql:

SELECT * FROM usuarios WHERE usuario = 'pedrito' AND password = 'miperrosellamajuan'

Ésto seleccionaría los datos de la base de datos en la fila donde el usuario es pedrito y el password es miperrosellamajuan, entonces si encuentra este registro quiere decir que el user y password estan bien, y lo dejará pasar.

Lo que hace php a grandes rasgos es:
$usuario = "pedrito";
$password = "miperrosellamajuan";

$sql = "SELECT * FROM usuarios WHERE usuario = '$usuario' AND password = '$password' ";

mysql_query($sql);

Lo que hace es que como PHP todas sus variables o sea las cosas que pueden cambiar tienen un $ como prefijo entonces las variables serían usuario, password, y sql, y como todas las cadenas o strings se encierran con comillas como en casi todos los lenguajes de programación entonces por eso dice que usuario vale pedrito, y password vale miperrosellamajuan.

Para quienes no sepan que es una cadena, simplemente veanlo como que las computadoras para que puedan cambiar una frase ejemplo: miperrosellamajuan a binario, entonces necesitan de números, los cuales cada caracter equivale a un número, o sea a, b, c, d, e, etc. equivalen a números. Y para unir los caracteres hay que hacer secuencias de números y una cadena es como si cada eslabón fuera una letra, entonces formara una frase.

El caso es que cuando tu pones en el formulario o sea en el campo de texto usuario y password algo, ese algo se consultará directamente a la base de datos o sea tu escribirías pedrito como usuario y en password podrías miperrosellamajuan. Al enviar los datos al otro lado o sea en el lado del servidor se haría la siguiente consulta:

SELECT * FROM usuarios WHERE usuario = 'pedrito' AND password = 'miperrosellamajuan'

Pero ya llendo directamente al grano que pasa si pones:

usuario ‘ or ‘a’ = ‘a
password ‘ or ‘b’ = ‘b

quedaría algo asi:

SELECT * FROM usuarios WHERE usuario = '' or 'a' = 'a' AND password = '' or 'b' = 'b'

Y bueno ¿con esto qué?

Pues la consulta esta comparando donde el usuario sea nada o a = a y pues a es igual a a al igual que b para el caso del password así que podrías entrar fácilmente, al igual también puedes poner usuario:pedrito password:’or”=’ y que pasaría pues entrarías a la cuenta de pedrito sin saber su password o de quien fuera.

Nótese que ésto lo estoy poniendo no para que corran a aprovecharse de malos programadores, el propósito de éste blog es que cuiden más de su seguridad y lo pongo para que sepan quienes usen php o asp piensen en esto y procuren reemplazar las comillas de las cadenas entrantes y en el caso de php pues hay una función para evitarnos problemas llamada mysql_real_escape_string($string a checar);

Trackback URI | RSS de los comentarios

Deja un Comentario

Posts relacionados