Escudos por tecnología

Ver en Markdown

Ocho protecciones concretas tras las reglas del WAF: WordPress, SSRF, redirecciones abiertas, paginación, source maps, GraphQL e inyección de prompts.

En esta página

Los escudos son comprobaciones pequeñas y específicas que el borde ejecuta después de OWASP CRS y de las reglas de OpenWAF. Cada uno tiene un pseudoidentificador de regla entre 1001 y 1008: es el que aparece en los eventos de seguridad y el rule_id que usas en una excepción del WAF para apagar el escudo en una ruta.

Los escudos siguen el modo del sitio: bloquean en active, solo registran en log y no se ejecutan en off (ni con waf_level=off).

IdEscudoBloqueaRespuesta
1001Endurecimiento de WordPressSolo en sitios con stack=wordpress.404
1002SSRF (query)Parámetros de la query que llevan una URL a una dirección interna.403
1003Redirección abiertaParámetros de la query que redirigen a otro sitio.403
1004PaginaciónUna IP que recorre muchas páginas consecutivas.429
1005Source mapsPeticiones de ficheros .map.404
1006GraphQLIntrospección y consultas muy profundas.404
1007Inyección de promptsFrases de jailbreak enviadas a rutas de endpoints de IA.403
1008SSRF (cuerpo JSON)URL a direcciones internas dentro de cuerpos JSON.403

Una excepción con rule_id 0 (todas las reglas del WAF) no apaga los escudos: usa el identificador del propio escudo.

Endurecimiento de WordPress

En los sitios con stack=wordpress, responde 404 a /xmlrpc.php, a /wp-json/wp/v2/users sin cabecera Authorization (enumeración de usuarios), a /wp-includes/version.php y /readme.html (revelan la versión) y a cualquier ruta que contenga wp-config.

SSRF

Revisa los valores de los parámetros de la query llamados url, webhook_url, callback_url, target_url, redirect_url, return_url, dest, destination, uri, endpoint, proxy, fetch, src, href, link, next o continue (1002), y cada texto con forma de URL absoluta dentro de un cuerpo JSON (1008). Bloquea:

  • los esquemas file, gopher, dict, ldap, jar y netdoc;
  • los nombres localhost, metadata, metadata.google.internal, metadata.azure.com y cualquier nombre que acabe en .localhost o .internal;
  • las direcciones de loopback, privadas, de enlace local, sin especificar y de CGNAT (100.64.0.0/10), también escritas en hexadecimal, octal o decimal, como 0x7f.1 o 2130706433.

Las rutas relativas y el texto libre nunca se bloquean.

Redirección abierta

Revisa los parámetros de la query llamados redirect, redirect_url, redirect_uri, return, return_url, returnto, return_to, next, dest, destination, rurl, continue, callback, callback_url, forward, goto, success_url, cancel_url, checkout_url o payment_url. Una URL absoluta o relativa al protocolo (//evil.example, https:\\evil.example) solo pasa si apunta a:

  • el mismo dominio registrable que el sitio (api.example.com puede redirigir a example.com);
  • un host de redirect_allow_hosts del sitio (ajustes): cada entrada vale para sí misma y sus subdominios;
  • un proveedor de pagos que cualquier sitio puede usar, como stripe.com.

Paginación

Bloquea una IP que pide 40 páginas consecutivas de la misma ruta en 5 minutos (?page= u ?offset= con limit, take, size, per_page, pageSize, page_size o perPage). El scroll infinito de una persona queda muy por debajo.

Source maps

Responde 404 a cualquier ruta que acabe en .map, para que nunca se sirvan los source maps que revelan tu código fuente.

GraphQL

En las rutas que acaban en /graphql: bloquea la introspección (__schema, __type…) y las consultas con más de 10 niveles de anidación.

Inyección de prompts

En las rutas que contienen /ai/, /search-ai/, /chat/, /assistant/, /copilot/, /api/ai/, /api/chat/ o /api/assistant/: bloquea los cuerpos con frases de jailbreak conocidas en inglés, como «ignore previous instructions», la extracción del prompt de sistema o «developer mode». Para una política completa en tus propios endpoints de IA (detectores en inglés y español, tope de cuerpo, límites por IP y por sesión), usa la protección de endpoints de IA.

Inspección del cuerpo

Los escudos de cuerpo (GraphQL, inyección de prompts, SSRF en JSON) leen hasta 1 MiB de un cuerpo JSON, GraphQL o de endpoint de IA y siempre reenvían el cuerpo entero. No inspeccionan las subidas multipart. Un cuerpo mayor que ese límite se rechaza con 413, salvo que la ruta tenga una excepción del WAF para la regla 10101 (consulta Solución de problemas).

Última actualización:

↑↓ para moverte↵ para abriresc para cerrar