UTF-8 + IE = XSS

Dios! Tenia que ser no..? IE! Como siempre, en el primer lugar de browsers vulnerables a numerosos tipos de XSSes inválidos. Pero bueno, no entro en ese tema , porque voy a hablar de algo mucho mas interesante: utilizar caracteres inválidos para UTF-8 y Internet Explorer (en mi caso 6.0 SP2) con el fin de generar vectores XSS.
Como ya hable de UTF-8 y UTF-7 no voy a entrar tanto en el tema, sino que voy a presentar algunos caracteres inválidos que probé hasta ahora, que no son muchos:
- 0xEE
- 0xDE
- 0xC0
- 0xDF
No los voy a poner en este post, porque algunos de ellos son borrados o no respondería el server, todo esto por razones de seguridad, pero ustedes pueden probarlos. Bueno, un XSS se puede aplicar de esta manera con la técnica que presento:
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
</head>
<body>
<?
echo “<font face=\”xss”.chr(238).”\”>si funciona esto no sale</font><font face=\” onmouseover=alert(String.fromCharCode(88,83,83)) “.chr(238).”\” >pero esto si!</font>”;
?>
</body>
</html>
En el código utilizo el carácter hexadecimal 0xEE que es una “i” con un semi-triangulo en la punta, el nombre no lo conozco. Su numero ASCII es 238, y lo utilizo para transformarlo con chr() para que PHP devuelva el carácter invalido.
Principalmente los caracteres UTF-8 inválidos producen algo, para mi, raro ya que se “come” el carácter que se encuentra siguiente a su posición, o sea que se comería a las comillas siguientes a la aparición del carácter, dejando todo lo siguiente hasta la otra comilla siendo parte del valor face= lo que nos dejaría el valor onmousemove= , que es un evento DOM, que al pasar el cursor por sobre el texto nos lanzaría el proximo alert()!!
Esto se puede notar ya que el string que esta entre medio de los tags <font> que dice: “si funciona esto no sale”. No saldría porque quedaría como el valor de face= . Como sigue después del alert()? Entonces dejo un pequeño espacio luego del alert(), cierro el evento y agrego otro carácter invalido para borrar la siguiente comilla y dejo un espacio para que quede el ultimo evento que mencione valido. Como quedaría seria de la siguiente manera (html/valor):
<font face=“xss[0xEE]>si funciona esto no sale</font><font face=” onmouseover=alert(String.fromCharCode(88,83,83)) [0xEE] >pero esto si!</font>
Entonces, si funcionara nos daría como texto: “pero esto si!”. Y como imagen algo así, en IE6 y sistema Window$ XP “TabletPC Edition”:

Si alguien tiene un ápice de esperanza con IE y me ayuda a checkear si esta arreglado esto en IE<6 me haría un inmenso favor. Finalmente les digo: utilicen Opera! o Firefox! Esto también se podría aplicar en foros o boards/comentarios, usando el BBCode font. De esta manera:
[font=xyz[0xEE]]este es[/font][font= onmouseover=alert(String.fromCharCode(88,83,83)) [0xEE]]el exploit[/font]
Aun que ahora estoy usando el tag <font> , porque no importa el tag que encapsule el exploit, sino que se borre las comillas mediante los caracteres inválidos.
Saludos!
Links útiles (necesarios):
- UTF-8 (Transmisión) - http://www.quadibloc.com/crypto/mi6132.htm
- RFC 3629 (UTF-8[sección 10 = seguridad]) - http://tools.ietf.org/html/rfc3629
