Si un sitio web filtra los términos relacionados con XSS, ¿sigue siendo potencialmente vulnerable?

1

Por ejemplo, supongamos que hay un sitio web donde la entrada del usuario no está correctamente desinfectada, pero estos filtros aún están activos. Cualquier cosa escrita se inserta entre dos etiquetas div.

Si la entrada es " hello ", se muestra en la fuente como " <div>hello</div> "

Las etiquetas también funcionan. Si la entrada es " <!-- ", entonces se convertiría en " <div><!--</div> ", convirtiendo gran parte del HTML de la página en un comentario, rompiendo parte de él.

Sin embargo, las etiquetas de script se filtran. Ingresando " <script>alert('xss')</script> " devolverá " <div>alert('xss')</div> ", obviamente no ejecutando ningún javascript.

"javascript:" se filtra y se convierte en "nojavascript" si se usa como fuente.

entrada:

<img src=javascript:alert('hi'); />

salida:

<img src=nojavascript...alert('hi'); />

Otra parte del filtro lo protege de " onload= " y otros ataques XSS basados en eventos HTML. Si " onload=alert('xss') " es la entrada, no se mostrará en absoluto en la fuente.

Entonces, mi pregunta es, ¿este sitio web aún sería vulnerable a los scripts entre sitios o es seguro debido al filtro que utiliza?

    
pregunta Zachary Swanson 16.05.2017 - 00:28
fuente

1 respuesta

9
  

Entonces, mi pregunta es, ¿este sitio web aún sería vulnerable a los scripts entre sitios o es seguro debido al filtro que utiliza?

No es seguro. No describiste completamente tu mecanismo de filtrado, pero se garantiza que un filtro XSS basado en una lista negra dejará algunas lagunas.

Ejemplos

¿Considera el atributo href de las etiquetas de enlace? Un clic en este enlace activaría:

<a href="javascript:alert(1)">Click me<a>

Si filtra javascript: , ¿sus cheques no distinguen entre mayúsculas y minúsculas?

<a href="JaVaScRiPt:alert(1)">Click me<a>

¿Y consideras diferentes formas de codificación? Por ejemplo:

<a href="javascript&#x3a;alert(1)">Click me</a>

¿Consideras marcos? Ciertamente no es suficiente filtrar javascript: ya que un atacante también podría usar otros esquemas, por ejemplo:

<iframe src="data:text/html,<script>alert(1)</script>">

Si está pensando que su filtro detectará la etiqueta <script> dentro del marco src , por supuesto, puede codificarse, por ejemplo:

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">

Además, ¿considera que <iframe> tiene un atributo srcdoc ?

<iframe srcdoc="<script>alert(1)</script>">

Una vez más, hay muchas formas de codificar esto, por ejemplo:

<iframe srcdoc="&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;">

La lista continúa. (¿Qué pasa con los SVG, formularios, metaetiquetas, oscuros protocolos específicos del proveedor, applets flash incrustados, CSS, ...?)

El enfoque correcto es utilizar una lista blanca de etiquetas y atributos permitidos, y analizar el árbol DOM resultante en lugar de los reemplazos de cadenas basados en expresiones regulares.

    
respondido por el Arminius 16.05.2017 - 02:27
fuente

Lea otras preguntas en las etiquetas