Un investigador de seguridad identificó una clase de vulnerabilidades en WordPress basadas en expresiones regulares mal configuradas que permiten inyectar código XSS (Cross-Site Scripting) en sitios. El fallo expone cómo fallos aparentemente técnicos en la validación de datos se convierten en puertas abiertas para atacantes, y qué tienen que hacer desarrolladores y administradores para protegerse.
En 30 segundos
- Las expresiones regulares mal diseñadas en WordPress pueden dejar pasar código HTML y JavaScript ejecutable que se vuelve XSS
- El investigador Stealthcopter documentó cómo funciona este patrón de ataque y qué plugins son vulnerables
- La solución es sanitizar entradas de datos con funciones nativas de WordPress, no confiar en regex caseras
- Actualizar plugins y temas regularmente reduce drásticamente el riesgo de exposición a estos fallos
¿Qué es la vulnerabilidad XSS en WordPress?
XSS (Cross-Site Scripting) es una vulnerabilidad que permite a un atacante inyectar código JavaScript ejecutable en la página de un sitio. Si vos visitás la página comprometida, ese script corre en tu navegador, puede robar tu cookie de sesión, redirigirte a otro sitio, cambiar contenido, o hacer prácticamente cualquier cosa en tu nombre (spoiler: no son cosas buenas).
En WordPress, el XSS es especialmente peligroso porque afecta lectores que no tienen nada que ver con la seguridad del sitio. Un lector llega a una nota, toca un botón falso que parece legítimo, y el atacante ya tiene acceso a su sesión. Si ese lector es administrador del sitio, el daño escala.
Lo que diferencia este caso es que el fallo no está en WordPress core propiamente dicho. Está en cómo algunos plugins y temas validan lo que entra, especialmente cuando usan expresiones regulares para filtrar código HTML.
Cómo la regex abre la puerta a XSS en WordPress

Ponele que vos escribís un plugin y querés permitir que el usuario agregue atributos HTML básicos a un campo, pero no querés que inyecte onclick, onload, o cualquier evento que ejecute JavaScript. La solución obvia es usar una expresión regular para «filtrar» esos atributos maliciosos (spoiler: eso casi nunca funciona bien). Tema relacionado: valida entrada de forma automática.
El problema es que una regex casera deja huecos. Una expresión regular que intenta bloquear atributos peligrosos usando patrones como `on\w+\s*=` puede bypassearse fácilmente con espacios, tabs, saltos de línea, codificación HTML, o simplemente estructurando el atributo de forma que el patrón no lo reconozca. Dicho esto, un atacante motivado prueba esos huecos y tarde o temprano encuentra uno.
Stealthcopter documentó esto en el blog de WordPress Directo, mostrando cómo una regex que se ve robusta en un vistazo deja pasar payloads XSS reales cuando el atacante sabe cómo estructurar la entrada. El HTML resultante tiene atributos ejecutables que la regex no detectó, y boom: el navegador del usuario ejecuta el código.
Casos públicos de XSS en WordPress
Este patrón no es nuevo. En 2023 se reportó XSS en el plugin Schema & Structured Data for WP & AMP, que usaba filtración con regex para permitir datos estructurados. Un usuario motivado subía JSON con atributos HTML inyectados, la regex los dejaba pasar, y el plugin los insertaba directo en el HTML de la página. XSS puro.
Otro caso similar afectó plugins que «sanitizaban» campos de configuración usando regex en lugar de usar funciones nativas de WordPress como wp_kses_post(). El resultado siempre fue el mismo: gente confiando en que su patrón regex era hermético, cuando en realidad no lo era.
El tema es que regex es una herramienta terrible para validar HTML seguro. Eso es lo que aprende cualquiera que trata de «resolver» la seguridad con expresiones regulares caseras en lugar de usar librerías especializadas.
Cómo evitar la vulnerabilidad XSS en WordPress
La solución es directa: no uses regex caseras para sanitizar entrada de datos. WordPress tiene funciones que existen justamente para esto. Cubrimos ese tema en detalle en desarrolla plugins con seguridad integrada.
Si recibís entrada de usuario (desde un formulario, un custom post type, una API), usá sanitize_text_field() para texto plano, wp_kses_post() para HTML que necesita preservar ciertos tags (como <strong>, <em>, <a>), o wp_kses_allowed_html() si necesitás un whitelist personalizado. Estas funciones conocen los patrones de ataque XSS reales porque el equipo de WordPress las mantiene actualizadas.
En el lado de quien publica, validá que la entrada cumple con lo que esperas. Si un campo es un número, asegurate que sea número. Si es una URL, asegurate que sea URL válida. Si es un email, que sea email válido. Cada validación que hagas en la entrada reduce la superficie de ataque exponencialmente.
No confíes en que la seguridad venga de terceros. Si usás un plugin, revisar su código es raro que alguien lo haga, pero fijate al menos que los desarrolladores sepan sobre sanitización. Podés inspeccionar rápido buscando `wp_kses`, `sanitize_`, o `esc_` en el código del plugin.
La importancia de actualizar plugins y temas en WordPress
Cuando se reporta XSS en un plugin, el desarrollador bien intencionado suelta un parche en días. Ese parche va a una nueva versión que publicá en el repositorio de WordPress. Si vos no actualizás, tenés código vulnerable corriendo en tu sitio, esperando que alguien lo explote.
No es paranoia. Los atacantes automáticos escanean WordPress todo el tiempo, identifican versiones viejas de plugins vulnerables, y lanzan exploit scripts que funcionan masivamente. Tu sitio está en internet. Está expuesto. La actualización es tu defensa más básica. En verifica la salud de tu WordPress profundizamos sobre esto.
WordPress hace fácil actualizarse: el dashboard avisa cuando hay actualizaciones disponibles, las instalás con un click, y listo. Si algún plugin se rompe después de una actualización, es raro — y si pasa, tenés la opción de downgrade. Pero quedarte con versiones viejas de plugins sabidamente vulnerables es exponerte voluntariamente a riesgos que cualquiera puede explotar.
Errores comunes que cometen los desarrolladores y administradores
Error 1: Confiar en que «escondiendo» un formulario es seguro. Un atacante no necesita acceder a tu admin para inyectar datos. Si el formulario existe en el frontend, existe. Si vos no sanitizás, el atacante sabe cómo bypassearte. Ojo con los formularios Custom Post Types, formularios de Contact Form 7 mal configurados, o cualquier entrada que toque la DB sin validación. Nuestros colegas de donweb.news lo analizan en descubre más vulnerabilidades sin resolver.
Error 2: Usar stripslashes() en lugar de sanitize_. Algunos desarrolladores viejos todavía hacen esto. stripslashes() solo quita backslashes; no bloquea XSS. Es peor que nada porque te da la falsa sensación de seguridad. Más sobre esto en conoce otros tipos de vulnerabilidades.
Error 3: No revisar los plugins instalados regularmente. Un administrador instala un plugin, lo configura, y después nunca más mira si está actualizado. Dos años después, ese plugin tiene una vulnerabilidad reportada hace un año, y vos ni enterado. Acá viene lo bueno: WordPress tiene plugins como Wordfence que te avisan de vulnerabilidades conocidas en los plugins que tenés instalados.
Preguntas Frecuentes
¿Se supone que WordPress es seguro de entrada?
WordPress core es relativamente seguro en lo que respecta a XSS porque el equipo conoce los patrones de ataque. Pero WordPress es extensible — plugins y temas agregan código nuevo constantemente. Ese código nuevo es donde fallan las cosas. Si vos usás solo WordPress core sin plugins, el riesgo es bajo. Con plugins, depende enteramente de quién los escribió. Esto se conecta con lo que analizamos en compara soluciones de protección.
¿Cómo sé si un sitio WordPress fue atacado por XSS?
Es difícil detectarlo si el ataque está dirigido a lectores específicos. Si el atacante inyectó código que roba cookies de administrador, vos no verías nada en el frontend — pero tu sesión estaría comprometida. Si inyectó un redirect, notarías que el sitio redirige a otro lugar. Si es malware que inyecta ads o phishing, aparece en el HTML. Wordfence tiene un scanner que busca inyecciones conocidas.
¿Qué hago si descubro XSS en mi sitio?
Primero, identificá si viene de un plugin conocido o código custom. Si es un plugin, actualiza inmediatamente. Si es código custom, arreglá la sanitización. Después, forzá logout de todas las sesiones de admin, cambiá las contraseñas, y revisá logs (si los tenés) para ver qué información se robó. Si el ataque fue reciente y masivo, considerar un backup limpio y restauración.
¿Qué plugins de seguridad previenen XSS?
Wordfence es el estándar — bloquea ataques XSS conocidos, avisa de vulnerabilidades en plugins, y tiene un WAF (Web Application Firewall) que filtra patrones de ataque. Sucuri y iThemes Security también ofrecen protección similar. Ninguno es perfecto, pero cada uno agrega una capa de defensa que reduce tu superficie de ataque.
Conclusión
El patrón que documentó Stealthcopter no es un fallo de WordPress en sí. Es un recordatorio de que regex casera no es herramienta para seguridad. Si vos construís plugins o temas WordPress, o administrás un sitio, la lección es simple: sanitizá entrada con funciones de WordPress, validá datos de forma explícita, y actualizá regularmente.
La mayoría de ataques XSS en WordPress se previenen con tres acciones: usar wp_kses_post() o sanitize_text_field(), actualizar plugins, y revisar qué plugins tenés instalados (eliminá los que no usás). No es sexy, pero funciona.