HackedByDummies
Linkedin
  • 🤠BIENVENIDO
    • Whoami
  • 🔴PENTESTING
    • Windows Active Directory
      • Conceptos básicos
  • 🌍PENTESTING WEB
    • SQL Injection (SQLi)
    • Cross-Site Scripting (XSS)
    • Local File Inclusion (LFI)
    • Remote File Inclusion (RFI)
    • Directory Path Traversal
  • 📋CERTIFICACIONES
    • INE Security
      • eWPTv2 Review
      • eCPPTv2 Review
      • eJPT Review
  • 📦CTF
    • VulNyx
      • Brain - Walkthrough
      • Ready - Walkthrough
      • Shock - Walkthrough
      • Serve - Walkthrough
    • Vulnhub
      • Symfonos 1 + Symfonos 2 Walkthrough
Con tecnología de GitBook
En esta página
  • PoC
  • Mitigación
  1. PENTESTING WEB

Directory Path Traversal

Última actualización hace 1 año

Es una vulnerabilidad de seguridad web que permite a un atacante acceder a archivos fuera del directorio raíz designado de un servidor web. Esto podría permitir navegar por el sistema de archivos y acceda a archivos confidenciales o sensibles sin ningún tipo de control.

Esta vulnerabilidad suele ir muy de la mano de un ataque LFI, debido a que las explotaciones se realizan en parámetros de la URL sobre los ficheros propios sistema.

Dentro de los riesgos de seguridad que presentan las aplicaciones web, esta técnica se encuentra en primera posición listada como dentro del informe de 2021, que facilitó el proyecto abierto de seguridad de aplicaciones web y categorizada dentro del sistema de debilidades y vulnerabilidades de software como .

Por ejemplo, si una aplicación web permite a los usuarios ver archivos mediante una URL como la siguiente:

http://ejemplo.com/viewfile?file=archivo.txt

Un atacante podría intentar acceder a archivos fuera del directorio raíz utilizando rutas relativas como:

../../../../etc/passwd

PoC

En este apartado veremos una pequeña demostración de una explotación LFI. En este caso hemos montado un pequeño laboratorio en un docker.

Crearemos un fichero PHP con el siguiente código dónde se espera lo siguiente:

  1. Entrada del usuario no validada: El script PHP toma el valor de $_GET['file'] sin realizar ninguna validación o sanitización. Esto significa que cualquier usuario puede proporcionar cualquier ruta de archivo a través de la URL.

  2. Inclusión de archivo sin verificación: La variable $file se pasa directamente a la función include() sin ningún tipo de verificación o validación adecuada. Esto significa que el usuario podría manipular la entrada de la URL para incluir cualquier archivo del sistema de archivos al que tenga permiso de lectura.

  3. Riesgo de Directory Path Traversal: Al no haber validación, un atacante podría usar una ruta relativa en el parámetro file para retroceder en el sistema de archivos y acceder a archivos sensibles fuera del directorio raíz del servidor web. Por ejemplo, podría intentar algo como file=../../etc/passwd para acceder al archivo /etc/passwd.

Primero de todo si intentamos listar un archivo dada su ruta, no obtendremos ningún tipo resultado. Esto sucede porque se ha tomado la ruta /var/www/html como la raíz de la aplicación web.

Pero como hemos comentado anteriormente, al no haber una validación o sanitización es posible retroceder dentro de la estructura de directorios del sistema y listar archivos de configuración críticos como /etc/shadow o /etc/passwd.

Mitigación

Para evitar ser vulnerables a Directory Path Traversal es posible implementar una serie de medidas de seguridad (tomando de partida el código PHP utilizado para la PoC).

  1. Validación de la entrada del usuario: Antes de incluir el archivo, debes validar y sanitizar la entrada del usuario para asegurarte de que solo se permitan caracteres válidos y que la ruta del archivo esté dentro del directorio permitido.

  2. Utilizar rutas absolutas: En lugar de incluir la ruta del archivo proporcionada por el usuario directamente, podrías construir una ruta absoluta basada en un directorio raíz predefinido. Esto evitará que los usuarios utilicen rutas relativas para retroceder en el sistema de archivos.

  3. Limitar el acceso a directorios específicos: En lugar de permitir el acceso a cualquier archivo en el sistema de archivos, podrías restringir el acceso solo a ciertos directorios específicos que contengan archivos permitidos.

Código PHP aplicando las correspondientes mejoras de seguridad.

<?php
    // Directorio raíz permitido
    $rootDirectory = "/var/www/html/";
    
    // Obtener el nombre del archivo desde el parámetro GET
    $file = isset($_GET['file']) ? $_GET['file'] : null;

    // Validar la entrada del usuario y construir la ruta absoluta
    if ($file !== null) {
        // Filtrar caracteres no permitidos y asegurarse de que no hay retroceso en directorios
        $file = str_replace(array('/', '\\'), '', $file);
        $absolutePath = realpath($rootDirectory . $file);

        // Verificar que el archivo esté dentro del directorio raíz permitido
        if (strpos($absolutePath, $rootDirectory) === 0 && is_file($absolutePath)) {
            // Incluir el archivo si está dentro del directorio raíz permitido
            include($absolutePath);
        } else {
            // Manejar el caso en el que el archivo no está permitido
            echo "Acceso no permitido.";
        }
    } else {
        // Manejar el caso en el que no se proporciona un nombre de archivo
        echo "El parámetro 'file' no se ha proporcionado.";
    }
?>

Con estas mejoras, el código será más seguro y mitigará la vulnerabilidad de Directory Path Traversal al limitar el acceso solo a archivos dentro del directorio raíz permitido y filtrar cualquier intento de acceso a directorios fuera de este ámbito.

🌍
A01:2021-Broken Access Control
Top 10
OWASP
CWE
CWE-22
Código PHP vulnerable a Directory Path Traversal
Explotación Directory Path Traversal
Explotación Directory Path Traversal