Salida del Directorio Base

En las aplicaciones web, los sistemas de seguridad se ponen para evitar ataques de path traversal. Sin embargo estas defensas no siempre son a prueba de todo. Debajo está el código de una aplicación que insiste en que el nombre de archivo dado por el usuario debe comenzar con un directorio base predeterminado y también dividirá las strings de traversal para proteger la aplicación de ataques de file traversal:

php
function containsStr($str, $subStr){
    return strpos($str, $subStr) !== false;
}

if(isset($_GET['page'])){
    if(!containsStr($_GET['page'], '../..') && containsStr($_GET['page'], '/var/www/html')){
        include $_GET['page'];
    }else{ 
        echo 'You are not allowed to go outside /var/www/html/ directory!';
    }
}

Es posible cumplir con estos requerimientos y navegar a otros directorios. Esto puede ser conseguido añadiendo las secuencias de directory traversal después del archivo base.

Por ejemplo, ve a http://IP/lfi.php y usa el payload /var/www/html/..//..//..//etc/passwd.

La función PHP constrainsStr comprueba si unasubstring existe en una string. La condición if comprueba dos cosas. Primero, si $_GET['page'] no contiene la substring ../.., y si $_GET['page'] contiene la substring /var/www/html. Sin embargo, ..//..// bypassea este filtro porque navega dos directorios hacia arriba, como ../../. No coincide, sin embargo, exactamente con el patrón bloqueado ../.. debido a las / extra.

Base Directory Breakouts


Ofuscación

Las técnicas de ofuscación son normalmente usadas para bypassear filtros de seguridad básicos que puedan tener las aplicaciones. Estos filtros suelen buscar secuencias obvias de directory traversal como ../. Sin embargo, los atcantes pueden evadir la detección de estas srtings ofuscándolas.

El encodeo transforma caracteres a un formato diferente. En LFI, los atacantes suelen usar URL encoding, donde los caracteres se representan usando símbolos de porcentaje seguidos de valores hexadecimales. Por ejemplo, ../ puede encodearse de varias maneras:

  • Encoding URL Estándar: ../ se convierte en %2e%2e%2f.
  • Doble Encoding: Útil si la aplicación decodifica el input 2 veces. ../ se convierte en %252e%252e%252f.
  • Ofuscación: Los atacantes pueden usar payloads como ....//, lo que puede ayudar a evitar la detección mediante coincidencia de string o mecanismos de filtrado. Esta técnica de ofuscación pretende ocultar los intentos de directory traversal, haciéndolos menos obvios para filtros básicos.

Por ejemplo, imagina una aplicación que mitiga LFI filtrando ../:

php
$file = $_GET['file'];
$file = str_replace('../', '', $file);

include('files/' . $file);

Un atacante puede potencialmente sobrepasar este filtro usando los siguientes métodos.

  1. URL Encoded Bypass: El atacante usa la versión URL-encodeada del payload como ?file=%2e%2e%2fconfig.php. El servidor decodea este input a ../config.php.
  2. Double Encoded Bypass: El atacante puede usar doble encoding si la aplicación decodea el input dos veces. El payload sería ?file=%252e%252e%252fconfig.php, donde hay un punto es %252e y donde hay una barra es %252f.
  3. Obfuscation: Un atacante podría usar el payload ....//config.php lo que después de aplicar los filtros de la aplicación se convierte en ../config.php.