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);





