[Tutorial] XSS a ciegas

Iniciado por arthusu, Agosto 14, 2013, 07:25:11 PM

Tema anterior - Siguiente tema

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

¿Que es XSS a ciegas?

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

XSS a ciegas en realidad es un XSS persistente que se ejecuta en otra parte del sitio web que no se muestra directamente al usuario, sino se ejecuta en otra parte de la misma aplicacion web.

A un ataque XSS persistente me refiero a uno que queda almacenado en una base de datos o un archivo de registro.

¿Como atacar?

En realidad esto es lo mas bonito, como no sabemos que vector inyectar, inyectamos a lo tonto o se podria decir que inyectamos por fuerza bruta :D
Me refiero a que tenemos una lista de Payloads la cual lanzamos en variables que pudiesen ser vulnerables a este tipo de ataques, este tipo de ataques mas comunmente suceden en aplicacion de inicio de sesion, foros, etc...

Vamos a hacer una practica :)

La siguiente practica sera algo mas irreal pero es para que se entienda el concepto de XSS a ciegas :D
Tenemos dos archivos en la practica sin filtrar nada de nada :P
Aqui se los dejo:

contact.php
Código: php
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Contacto</title>
<style>
.error{
color:red;
font-weight: bold;
}
.ok{
color:green;
font-weight: bold;
}
</style>
</head>
<?php
if(isset($_POST['submit'])){
if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message'])){
$nombre=$_POST['name'];
$correo=$_POST['email'];
$mensaje=$_POST['message'];
$fp = fopen("logs.txt","a");
fwrite($fp, "Nombre: $nombre \t Correo: $correo \t Mensaje: $mensaje" . PHP_EOL);
fclose($fp);
echo '<p class="ok">Su mensaje ha sido enviado correctamente.</p>';
}else{
echo '<p class="error">No ha llenado los campos correctamente.</p>';
}
}else{
?>
<body>
<center>
<h1>Formulario de contacto</h1>
<form action="contact.php" method="post">
<p>nombre: <input type="text" name="name" size="15" maxlength="40"></p>
<p>correo: <input type="text" name="email" size="15" maxlength="80"></p>
<p>mensaje: <textarea name="message"></textarea></p>
<p><input type="submit" value="Enviar" name="submit"></p>
</form>
</center>
</body>
</html>
<?php
}
?>

login.php
Código: php
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Contacto</title>
<style>
.error{
color:red;
font-weight: bold;
}
.ok{
color:green;
font-weight: bold;
}
</style>
</head>
<?php
if(isset($_POST['submit'])){
if(!empty($_POST['name']) && !empty($_POST['pass'])){
$nombre=$_POST['name'];
$password=$_POST['pass'];
if($nombre=="arthusu" && $password=="12345"){
echo '<h1>Bienvenido al sistema de logs</h1>';
$file = fopen("logs.txt", "r") or exit("no se pudo abrir el archivo!");
while(!feof($file))
{
echo fgets($file). "<br />";
}
fclose($file);
}else{
echo '<p class="error">El usuario o contraseña no son correctos.</p>';
}
}else{
echo '<p class="error">No ha llenado los campos correctamente.</p>';
}
}else{
?>
<body>
<center>
<h1>Sistema de registros - Iniciar sesion</h1>
<form action="login.php" method="post">
<p>nombre: <input type="text" name="name" size="15" maxlength="40"></p>
<p>contraseña: <input type="password" name="pass" size="15" maxlength="80"></p>
<p><input type="submit" value="Enviar" name="submit"></p>
</form>
</center>
</body>
</html>
<?php
}
?>


Ahora digamos que el usuario entra a nuestra pagina de contacto y deja su mensaje:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta





Luego llega el administrador y va y checa el mensaje en su sistema de logs :D

usuario: arthusu contraseña: 12345

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta







Ahora digamos que el usuario empieza a atacar con su lista de payloads, en este caso no usaremos una lista de payloads solo usaremos un vector, por que nosotros ya sabemos como inyectar, pero en realidad no se sabe cual vector va llegar a funcionar es por eso que se inyectan una lista de payloads al sitio....

Entonces enviamos nuestro mensaje de nuevo que seria nuestro vector a inyectar:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Luego llega el administrador e inicia sesion en su sistema de logs donde puede ver los mensajes enviados :P

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En este caso se puede ver muy claramente el concepto de XSS a ciegas por que nosotros en realidad no sabemos si se inyecto por que no la vemos... pero el administrador si la mirara y se le inyectara ese codigo cuando lo mire en sus logs, entonces como se puede insertar en este caso cualquier xss no solamente podemos hacer un alert, sino una redireccion a un deface, un robo de cookies (claro esta app no tiene cookies por que es un ejemplo solamente),etc....


Prevencion

La unica prevencion es no confiar en nada de lo que el usuario ingrese y filtrar todo lo que inserte... Veamos por ejemplo como solucionariamos este problema de que nos inyecten este XSS:

contact.php FIX
Código: php
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Contacto</title>
<style>
.error{
color:red;
font-weight: bold;
}
.ok{
color:green;
font-weight: bold;
}
</style>
</head>
<?php
if(isset($_POST['submit'])){
if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message'])){
$nombre=htmlentities($_POST['name']);
$correo=htmlentities($_POST['email']);
$mensaje=htmlentities($_POST['message']);
$fp = fopen("logs.txt","a");
fwrite($fp, "Nombre: $nombre \t Correo: $correo \t Mensaje: $mensaje" . PHP_EOL);
fclose($fp);
echo '<p class="ok">Su mensaje ha sido enviado correctamente.</p>';
}else{
echo '<p class="error">No ha llenado los campos correctamente.</p>';
}
}else{
?>
<body>
<center>
<h1>Formulario de contacto</h1>
<form action="contact.php" method="post">
<p>nombre: <input type="text" name="name" size="15" maxlength="40"></p>
<p>correo: <input type="text" name="email" size="15" maxlength="80"></p>
<p>mensaje: <textarea name="message"></textarea></p>
<p><input type="submit" value="Enviar" name="submit"></p>
</form>
</center>
</body>
</html>
<?php
}
?>


En este caso solo filtramos contra este ataque xss pero tambien podriamos hacer mas como filtrar si el campo inyectado es solo string de la a ala z para el nombre, el email este escrito correctamente, etc....

Veamos el ejemplo cuando lo ejecutamos de nuevo con el mismo vector anterior cuando inyectamos:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Aqui termina el tutorial espero que les haya sido de ayuda, no sin antes de darles un poco de ayuda para este tipo de ataques:

Cheat sheet XSS (Payloads): No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Burp Suite (Lanzar Payloads): No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Sitio de referencia: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Fuente: Arthusu BLOG
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buen tuto friend

Es un ataque que se puede llegar a dar, pero es muy ruidoso, no pasa desapercibido para nada.

Es decir, en un XSS normal podemos insertar un iframe o hacer una petición desde un tag de imagen, que haga pasar desapercibido el ataque. En este caso se hace un ruido extremo al envíar todas las inyecciones, por lo que el adminitrador será conciente que sufrió un ataque y tomará los recaudos, es la única contra que tiene.

Saludos!.

Muy bueno arthusu... es un ataque muy ruidoso pero midiendo bien y con el script correcto puede ser muy efectivo :)


Saludos!
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta