¿Cuáles son los ejemplos de XSS (u otros ataques) que usan "barra diagonal" solamente? [duplicar]

4

En la hoja de trucos OWASP XSS está escrito

  

Además de los 5 caracteres significativos en XML (& amp ;, & lt ;, & gt ;, ", '), la barra diagonal se incluye ya que ayuda a finalizar una entidad HTML.

Así que las escapadas recomendadas son

 & --> &
 < --> &lt;
 > --> &gt;
 " --> &quot;
 ' --> &#x27;
 / --> &#x2F;

¿Qué pasa si me salté los escapes de / ? ¿Cuáles son los ejemplos de carga útil del atacante que usan solo / que puede desencadenar XSS u otro ataque (suponiendo que se escaparon & < > " ' )?

En mi caso particular, tenemos un filtro XSS en el servlet de Java, que desinfecta la carga útil de todas las solicitudes HTTP entrantes (se puede argumentar si es una buena solución o no), y reemplaza / --> &#x2F; , que es un dolor porque / es un carácter válido en nombres de calles, etc. Una opción sería redecodificar &#x2F --> / , pero me pregunto si hay algún mérito de mantener / escapado.

Editar: por qué no quiero que / se escape:

El / se escapa antes de que los datos lleguen al código de Java , que guarda las cosas en la base de datos. Entonces, Java le pide a la base de datos que guarde los datos escapados, luego, cuando la aplicación frontend le pide a Java que nos devuelva los datos, nos devuelve un JSON como

{something: "a &#x2F b"}

en lugar de

{something: "a / b"}

(para solucionarlo, podríamos tener iterado el código Java sobre la estructura que devuelve y desbloquearlo, pero tal vez no tenga sentido escapar de él en primer lugar)

Tenga en cuenta que el mismo backend es consumido por muchos frontends, algunos de ellos no HTML. No tiene ningún sentido servir los datos HTML escapados como JSON, especialmente para los consumidores que no utilizan HTML (corríjame si me equivoco).

Además, en la aplicación HTML, usamos código Angular como este

<p>Hello {{name}}!</p>

que, cuando se le da a &#x2F b , imprimirá esa cadena literalmente al usuario (es decir, angular realiza otra ronda de escape reemplazando & a &amp; , etc.).

Para que se interpreten las entidades HTML, tendría que usar ng-bind-html (consulte este plunk )

<p>Hello <span ng-bind-html="name"></span>!</p>

pero espero que mi contenido JSON sea texto regular, por lo que no quiero usar ng-bind-html , ya que reduce la seguridad.

    
pregunta jakub.g 29.11.2016 - 18:18
fuente

1 respuesta

1

Inyectar una barra inclinada no es un vector de ataque común para XSS.

El escape requerido depende del contexto en el que está imprimiendo la salida. Se usa una barra diagonal para cerrar una etiqueta y no hay otro contexto HTML donde sea intrínsecamente peligroso. (En Javascript, por supuesto, esta sería una historia muy diferente. Además, las barras diagonales son relevantes en otros ataques, como directorios transversales .)

  

¿Cuáles son los ejemplos de carga útil del atacante que usan solo / que pueden activar XSS?

Tales escenarios son bastante artificiales. Por ejemplo, entre una etiqueta <title> todas las demás etiquetas son ineficaces hasta que cierre la etiqueta nuevamente. Esto no activará:

<title><img src=foo.jpg onerror=alert('no bounty for you')></title>

Entonces, si te encuentras con un escenario como ...

<title>[userinput]</title>

... necesitarías una barra para poder cerrar la etiqueta del título por ti mismo para lograr XSS.

La razón por la cual la hoja de trucos de OWASP recomienda algunas medidas más es para cubrir múltiples contextos de salida a la vez. Ya que XSS para escapar solo debe emplearse en la salida final, no hace daño escapar de algunos caracteres más. (Según su descripción, parece que está procesando los datos después de XSS escapando, lo cual no es la idea).

Ejemplo 1:

Welcome <span>[username]</span>!

Aquí, técnicamente sería suficiente simplemente escapar de < en el nombre de usuario ya que un atacante no puede inyectar nuevas etiquetas.

Ejemplo 2:

Your new name: <input type="text" value="[username]">

Aquí, sería suficiente escapar de " para evitar XSS porque un atacante nunca puede ir más allá del valor del atributo .

Ejemplo 3:

Your website: <a href="[yourlink]">Click me</a>

Aquí, escapar " en yourlink evitaría romper el atributo, pero debe tomar medidas adicionales para no permitir XSS a través de pseudo enlaces como javascript:foo() . Así que el escape estándar sería insuficiente aquí.

    
respondido por el Arminius 29.11.2016 - 18:29
fuente

Lea otras preguntas en las etiquetas