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 ã€"
, respectivamente) y esperar lo mejor?