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:
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.

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 ../:
$file = $_GET['file']; $file = str_replace('../', '', $file); include('files/' . $file);
Un atacante puede potencialmente sobrepasar este filtro usando los siguientes métodos.
- 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. - 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%252ey donde hay una barra es%252f. - Obfuscation: Un atacante podría usar el payload
....//config.phplo que después de aplicar los filtros de la aplicación se convierte en../config.php.
