Explicación de la codificación de múltiples bytes ilegal que conduce a XSS

0

Estoy leyendo este informe sobre seguridad de Unicode y encontré los siguientes párrafos confusos:

  

Al convertir desde una codificación de múltiples bytes, un valor de byte puede no ser un   byte final válido, en un contexto en el que sigue a un determinado   byte principal Por ejemplo, al convertir la entrada UTF-8, el byte   la secuencia E3 80 22 tiene un formato incorrecto porque 0x22 no es un segundo válido   byte final siguiendo el byte inicial 0xE3. Algún código de conversión   puede informar la secuencia de tres bytes E3 80 22 como una secuencia ilegal   y continúe convirtiendo el resto, mientras que otros códigos de conversión pueden   informe solo la secuencia de dos bytes E3 80 como una secuencia ilegal y   continuar la conversión con el byte 0x22 que es un carácter de sintaxis en   HTML y XML (U + 0022 comillas dobles). Implementaciones que reportan la   0x22 bytes como parte de la secuencia ilegal pueden ser explotados para   ataques de scripts entre sitios (XSS).

     

Por lo tanto, una secuencia de bytes no válida no debe incluir los bytes que codifican   Los caracteres válidos o son bytes iniciales para los caracteres válidos.

Según el ejemplo descrito (E3 80 22) como una secuencia de bytes, está claro que no es válido:

>>> b'\xe3\x80\x22'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte

y la pregunta es cómo se supone que un buen analizador / convertidor administre este tipo de error.

Probablemente estoy entendiendo mal algo, pero dice que algunos pueden reportar un error con toda la secuencia ( E3 80 22 ), pero otros pueden reportar un error con E3 80 y continúan convirtiendo el 22 byte como un doble citar. Sin embargo, dice que cuando el informe incluye el byte 22 , entonces esto puede ser explotado en un ataque XSS. Esa es la parte que es confusa; Pensé que era la segunda instancia la que conducía a las vulnerabilidades de XSS. ¿Cuál es la razón para pensar que debería ser la primera instancia vulnerable a XSS?

Una pregunta adicional: ¿Cómo se puede explotar este tipo de problema en la práctica (suponiendo que nos interesen las aplicaciones web)? ¿Se supone que debo simplemente utilizar la codificación de URL o la codificación HTML ( %E3%80%22 y &#xE3&#x80&#x22 , respectivamente) y esperar lo mejor?

    
pregunta Robert Smith 10.11.2017 - 07:17
fuente

1 respuesta

1

Si su página web considera 'E3 80 22' como una secuencia, entonces '22' no se escapará ... si entrega esta página a un navegador que considere 'E3 80 22' como 'E3 80' + ' 22 ', eliminando los resultados de la secuencia ilegal en' 22 ', tienes un' 22 'que no quieres y esto permite los ataques XSS.

    
respondido por el mroman 10.11.2017 - 18:49
fuente

Lea otras preguntas en las etiquetas