lunes, 16 de mayo de 2011

Vulnerabilidad en Nintendo.com (Double Encoding Directory Transversal)



Hoy por la mañana leyendo unos Twitts, me entero que la web de la conocida consola de video juegos Nintendo tiene una vulnerabilidad.

Verificando un poco de que se trataba (ya lo corrigieron) veo fácilmente un Directory Transversal. Este fallo consiste en escalar directorios para acceder a información que no está comprendida dentro del directorio publicado en el servidor web.

Ejemplo:

1) Tenemos un URL que apunta a un archivo PHP, el cual descarga el archivo indicado en la recepción de su variable "archivo". URL ==> www.victima.com/descargar.php?archivo=documento.pdf

2) El archivo descargar.php no contiene siquiera validación o filtro alguno de caracteres para evitar la inyección de saltos de directorio.

3) Teniendo en cuenta que el SO del servidor es Linux procedemos a leer el archivo /etc/passwd inyectando los saltos de directorio de esta manera:

www.victima.com/descargar.php?archivo=../../etc/passwd

Y añadimos tantos ../ como carpetas haya que escalar. Si no sabemos la ruta exacta, comenzamos a probar añadiendo saltos.

www.victima.com/descargar.php?archivo=../../../etc/passwd
www.victima.com/descargar.php?archivo=../../../../etc/passwd
www.victima.com/descargar.php?archivo=../../../../../etc/passwd
...
...
...

Hasta que finalmente damos con el archivo /etc/passwd y voilá.

Pero este no es el escenario de la web de Nintento, ya que esta si tiene ciertas validaciones de caracteres como "/" o "." por lo que procedo a explicar un ataque más avanzado del Directory Transversal común.

El nombre de este ataque es: Directory Transversal Attack with Double Encoding y consiste en lo siguiente:

Codificar los saltos de directorio en hexadecimal dos veces para hacer el bypass de los controles de seguridad y/o causar un comportamiento inesperado en la aplicación. Con esto se vulneran los controles de seguridad que sólo decodifican una sola vez la entrada de usuario. El segundo proceso de decodificación lo realiza la plataforma del backend o los módulos que controlan correctamente la data pero no tienen controles de seguridad correspondientes en su lugar.

En su codificación simple, los caracteres ../ codificados a hexadecimal arrojan este resultado %2e%2e%2f siendo:

Caracter        Hexadecimal
--------------------------------------------
.                    %2e
/                    %2f

Pero si queremos codificar nuevamente (Double Encoding), codificamos en hexadecimal también el símbolo "%" (porcentaje), por lo que quedaría así:

Símbolo porcentaje en codificación simple: %
Símbolo porcentaje en codificación doble: %25

Y reemplazando en %2E%2E%2f el valor del símbolo porcentaje obtenido luego de codificarlo, quedarían así los saltos:

Codificado Doble      Decodificado
-------------------------------------------------------
%252e%252e/                 ../

Aplicándose así en la URL vulnerable:

www.victima.com/descargar.php?archivo=%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd

En el caso de Nintendo, la URL vulnerable era directa y no por un manejador de descargas:

http://www.nintendo.com/css/pages//%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd

No hay comentarios: