Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/sanaullahamanullah/xss2shell-check
Herramientas DefensivasEscáneres de VulnerabilidadesEscáneres de Vulnerabilidades WebAnálisis de VulnerabilidadesRecopilación de InformaciónSeguridad WebPruebas de Penetración
GitHub

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
sanaullahamanullah/xss2shell-check

xss2shell-check

Detector no destructivo para CVE-2026-64638 (XSS2Shell) — primitiva de reflexión XSS pre-autenticación de WordPress

Ver Repositorio
hace 3 díasAún no revisado

xss2shell-check

Detector no destructivo y sin dependencias para la primitiva de reflexión CVE-2026-64638 ("XSS2Shell") en wp-login.php de WordPress.

Antecedentes

CVE-2026-64638 es un XSS reflejado preautenticado en el núcleo de WordPress, divulgado por PWN.AI el 2026-08-07 (CVSS 8.9, CWE-79) y corregido en 7.0.3 con backports a todas las ramas con soporte (6.9.6, 6.8.7, 6.7.6, 6.6.6, 6.5.9, …).

La causa raíz es una diferencia de análisis sintáctico entre strip_tags() de PHP y el sanitizador KSES de WordPress:

  • strip_tags() se niega a reconocer una etiqueta cuando hay espacios en blanco después de <, por lo que un nombre de usuario como < area id=x> sobrevive como texto plano.
  • KSES no tiene esa regla y vuelve a analizar el texto convirtiéndolo en un elemento <area id="x"> vivo dentro del mensaje de error del inicio de sesión.

Eso produce inyección de DOM elegida por el atacante con atributos id/class/href elegidos — la primitiva detrás de la cadena de múltiples etapas publicada (DOM clobbering → REST JSONP → robo de contraseñas de aplicación → subida de plugins → RCE contra una víctima administradora con sesión iniciada).

Qué hace esta herramienta

Dos sondas no destructivas (un inicio de sesión fallido con un nombre de usuario marcador aleatorio):

  1. RAW_HTML — <b>marker</b> aparece sin escapar en la respuesta de error.
  2. AREA_BYPASS — < area id=marker> sobrevive a strip_tags() y reaparece como un elemento vivo/normalizado (p. ej. area id="marker") en la respuesta.

Ningún payload ejecuta nada; la herramienta solo comprueba si el HTML del atacante se renderiza como DOM vivo. Extras opcionales:

  • --version — identifica la versión del núcleo mediante la etiqueta <generator> del feed.
  • --jsonp — verifica que el envoltorio JSONP de REST (_jsonp/_envelope) usado por la cadena publicada es alcanzable.

Uso

root@kitploit:~
python3 xss2shell_check.py https://example.com
python3 xss2shell_check.py --jsonp --verbose https://example.com
python3 xss2shell_check.py --version https://example.com
python3 xss2shell_check.py --json https://example.com

Python 3.6+, solo biblioteca estándar. Sin dependencias.

Códigos de salida

CódigoSignificado
0VULNERABLE (primitiva de reflexión presente)
1CORREGIDO / NO VULNERABLE
2ERROR (inalcanzable, desafío WAF, respuesta inesperada)

Matriz de detección

Notas de detección

  • La firma vulnerable es el elemento normalizado (<area id="…">). El entrecomillado de atributos varía según la generación de KSES (antiguo analizador personalizado: <area id=x>; DOMDocument: <area id="x"> / <area id="x" />), por lo que se comparan todas las formas. Un paso directo de < area …> crudo sin re-análisis es texto inerte en el navegador, no la primitiva — se informa como RAW_TEXT_ONLY y no provoca un falso positivo.
  • La etiqueta de versión es solo orientativa: los backports corregidos (6.9.6, 6.8.7, 6.7.6, 6.6.6, 6.5.9, 4.7.34, …) caen dentro de la serie 4.7.0–7.0.2 y se contabilizan por rama; la comprobación de reflexión sigue siendo la autoritativa.
  • Peticiones: 1 GET (página de inicio de sesión — también captura cookies WAF/pegajosas y la URL efectiva tras las redirecciones) + 2 POST con marcadores aleatorios únicos. Las redirecciones POST se reemiten como POST. Los bloqueos del WAF aparecen como salida 2, no como un silencioso "no vulnerable".
  • Es posible un falso negativo si un filtro personalizado login_errors o una CDN/WAF reescriben las respuestas, o si el error de inicio de sesión nunca refleja el nombre de usuario.

Descargo de responsabilidad

Solo pruebas de seguridad autorizadas. Esta herramienta está pensada exclusivamente para probar sistemas que usted posee o para los que tiene permiso explícito por escrito de evaluar. Las pruebas no autorizadas son ilegales en la mayoría de las jurisdicciones.

Referencias

  • Criminal IP — Vulnerabilidad de WordPress CVE-2026-64638: del XSS en la página de inicio de sesión a la ejecución de código en el servidor
  • CUHK ITS — Vulnerabilidad XSS preautenticado en WordPress "XSS2Shell" (CVE-2026-64638)

Licencia

MIT

Descargar herramienta
FlagPropósito
--versionidentifica la versión del núcleo (etiqueta generator del feed, respaldo mediante meta de la portada)
--jsonpademás verifica que el envoltorio JSONP de REST (_jsonp/_envelope) es alcanzable
-v, --verboseimprime fragmentos de respuesta de las sondas (evidencia para informes)
--jsonresultado JSON legible por máquina (CI / automatización)
Comportamiento observadoVeredictoSalida
<b>marker</b> reflejado sin escaparRAW_HTML — vulnerable0
< area id=marker> re-analizado en un <area id="marker"> vivo (cualquier formato de comillas / forma vacía)AREA_BYPASS — vulnerable0
Nombre de usuario escapado en HTMLESCAPED — no vulnerable1
Etiquetas eliminadas, el texto permaneceSTRIPPED — no vulnerable1
El < area …> crudo pasa pero nunca se re-analizaRAW_TEXT_ONLY — texto inerte, no vulnerable1
Sin reflejo en absolutoNOT_REFLECTED — no vulnerable1
Sonda bloqueada (HTTP ≥ 400 / página de desafío) o destino inalcanzableERROR2