Si solo filtra por etiquetas de script, sí.
Por ejemplo:
<img src="x" onerror="alert(1)" />
O
<div style="position: absolute; top: 0; left: 0; width: 9999px; height: 9999px; z-index: 9999" onmouseenter="alert(1)"></div>
O un número infinito de otros vectores.
Debe filtrar correctamente todo el contenido cuando los escribe en la página, usando la función de codificación que sea apropiada para la codificación de salida (por ejemplo, HTML, XML, JSON, etc.) y disponible en el idioma que esté usando .
Ejemplos para varios idiomas:
También recomiendo leer la XSS Prevention Cheat Sheet .
EDITAR: Después de tu actualización, sí, esto todavía es posible.
Imagina que filtra <
y >
, pero luego coloca el contenido en un atributo:
<span class="$class">
Entonces puedo usar esta carga útil:
" style="display: block; position: absolute; top: 0; left: 0; width: 9999px; height: 9999px; z-index: 9999" onmouseenter="alert(1)" foo="
Esto convierte su tramo en un elemento de bloque que llena toda la página, ejecutando el evento onmouseenter
tan pronto como el mouse del usuario ingresa a la página.
Ok, así que todavía no estás convencido.
La gente ha pasado MUCHO tiempo haciendo que XSS funcione en todo tipo de entornos simples basados en filtros. El número de trucos es asombroso, ya que se meten en todo tipo de locuras, como engañar al navegador para que malinterprete la página con una codificación de caracteres diferente, de modo que UTF-8 u otros puntos de código Unicode enviados como entrada luego se traten como puntos de código ASCII distintos que contienen HTML caracteres como >
o "
.
Como ejemplo, supongamos que está utilizando UTF-8 como su conjunto de caracteres en su servidor. Pongo el carácter 㱁 en tu página, pero luego a través de varios trucos (esto depende del navegador y es complicado, pero se puede lograr de manera trivial si tienes un error de división de encabezado en tu servidor) para que el navegador asuma que la codificación es simple ASCII. El punto de código UTF-8 para 㱁 es U + 3C41, que cuando se interpreta como ASCII es simplemente <A
. Su navegador ve esto como la apertura de una etiqueta.
Carga útil de ejemplo:
㱁 href="x" style="display: block; ..." onmouseenter="alert(1)"㸠foo
La gran cantidad de trampas hace que sea imposible manejarse. necesita una biblioteca de filtrado XSS adecuada que tenga en cuenta la codificación para tener en cuenta estos problemas.