tutorial site reflected prevent injection example cross attack javascript html http security xss

javascript - site - ¿Se puede usar un fragmento<script> HTML en la URL para XSS en una aplicación del lado del cliente?



xss manual (2)

Según RFC 3986, la sección 2.4 codificación de caracteres no seguros está estandarizada. Aunque recomiendo no confiar en eso por dos razones:

  • No todos los navegadores lo implementan.
  • Hay tantos navegadores en la naturaleza que pueden hacerlo de otra manera accidental o por intención.

Fondo

Digamos que tengo la siguiente página web:

<html> <script> document.write(''querystring='' + location.search.substr(1)); </script> <html>

Lo abro en una URL como esta:

http://completely-secure-site/?<script>alert(''fsecurity'')</script>

En todos los navegadores probados (Chrome 57, Firefox 52 y Safari 10) el resultado es:

cadena de consulta =% 3Cscript% 3Ealert (% 27fsecurity% 27)% 3C / script% 3E

Debido a que los paréntesis angulares <> no son caracteres URL válidos , parece que el navegador los codifica automáticamente en el camino, antes de que puedan acercarse al tiempo de ejecución de JS.

Mi suposición

Esto me lleva a creer que simplemente representar la cadena de consulta directamente en el cliente utilizando document.write siempre es seguro , y no es un posible vector XSS. (Me doy cuenta de que hay muchas otras formas en que una aplicación puede ser vulnerable, por supuesto, pero sigamos con el caso preciso que se describe aquí).

Mi pregunta

¿Estoy en lo cierto en este supuesto?

  • ¿Está la codificación entrante de caracteres no seguros en la URL estandarizada / obligatoria en todos los navegadores razonables? (No es posible XSS)
  • O, ¿esto es solo un detalle de implementación / de la aplicación de ciertos clientes (modernos) en los que no debería confiar globalmente? (XSS descrito anteriormente es teóricamente posible)

No relevante para la pregunta, pero aparte de un interesante. Si primero decodifico el URI, el comportamiento del navegador es diferente: document.write(decodeURI(location.search.substr(1))); . El auditor de XSS en Chrome y Safari bloquea la página, mientras que Firefox muestra la alerta.


Si utilizo Query String ?<script>alert("d")</script> en IE6 en Windows XP, recibo el código inyectado, muestra la alerta, esto también ocurre con decodeURI o decodeURIComponent en la página, así que diría que es el segundo. La suposición es correcta si IE6 sigue siendo un navegador razonable: es una característica de los navegadores modernos.

También veo Firefox 53 que muestra una alerta XSS inyectada cuando se usan los métodos de decodificación, Opera 44 y Chrome 57 (todos en Windows) bloquean el código.