Hace unos días veíamos la manera de realizar una inyección SQL de forma manual, pero lo hicimos con el nivel básico. Hoy retomamos las inyecciones SQL pero lo vamos a hacer sobre el nivel medio.
Ya no me voy a enrollar en decir que hay que cambiar el nivel de la prueba ni donde. Ya tenemos que tenerlo "mascao", así que, al tajo.
Igual que en el nivel básico, vamos a meter un 1' para comprobar que la aplicación es vulnerable.
Una vez comprobado vamos a lo que importa. En este caso le pasamos el famoso 1 OR 1=1 y vemos que ocurre.
Podemos ver que nos devuelve los nombres y apellidos de los usuarios. Vamos a inyectar union select 1,2,3. Lo que le estamos diciendo es que nos muestre la columna uno, la dos y la tres.
Y nos dice que tiene un número diferente de columnas. Vamos a decirle que solo nos muestre dos, ya que sabemos que con tres falla, a ver que ocurre.
En este caso si que nos devuelve resultados. Vamos a continuar sacando más datos.
1 OR 1=1 union select null, table_name from information_schema.tables
Volvemos a tener la información del nombre de la tabla, en este caso "users". Continuamos.
1 OR 1=1 union select null, concat(table_name, 0x0a, column_name) from information_schema.columns
Hemos obtenido el nombre de la tabla y el nombre de la columna. Si no sabes lo que hace el 0x0a te recomiendo que pinches aquí.
Vamos a probar ahora con
1 OR 1=1 union select null, concat(table_name, 0x0a, column_name) from information_schema.columns where table_name=users
para sacar ahora información de la tabla "users" para ver que contiene.
Pues parece que no le gusta y nos devuelve un error. No podemos sacar datos de "users", ¿o si? Vamos a echarle imaginación al asunto y vamos a pasar la cadena "users" a hexadecimal. Para esto suelo usar la web http://www.asciitohex.com.
Y vamos a tunear un poco el resultado para poder utilizarlo, quedando así.
1 OR 1=1 union select null, concat(table_name, 0x0a, column_name) from information_schema.columns where table_name=0x7573657273
Bien, ya tenemos los campos necesarios. Por último, vamos a sacar las contraseñas sustituyendo los valores que acabamos de sacar (first_name y password).
1 OR 1=1 union select null, concat(first_name, 0x0a, password) from users
Y ya tenemos nuestros resultados de la SQLi manopla style xD.
Surname: admin
5f4dcc3b5aa765d61d8327deb882cf99
Surname: Gordon
e99a18c428cb38d5f260853678922e03
Surname: Hack
8d3533d75ae2c3966d7e0d4fcc69216b
Surname: Pablo
0d107d09f5bbe40cade3de5c71e9e9b7
Surname: Bob
5f4dcc3b5aa765d61d8327deb882cf99
Y como ya aprendimos en la entrada de cracking, seamos eficientes jeje.
Ya hemos completado los niveles básico y medio de SQLi sin usar ninguna herramienta. El que se anime, que vaya a por el nivel alto xD.
Roberto García (@1GbDeInfo)