Underc0de

[In]Seguridad Informática => Bugs y Exploits => Pentesting => Mensaje iniciado por: arthusu en Agosto 14, 2013, 07:25:11 PM

Título: [Tutorial] XSS a ciegas
Publicado por: arthusu en Agosto 14, 2013, 07:25:11 PM
¿Que es XSS a ciegas?

(http://www.acunetix.com/wp-content/uploads/2013/08/Diagram-Describing-Blind-XSS-Attack.gif) (http://www.acunetix.com/wp-content/uploads/2013/08/Diagram-Describing-Blind-XSS-Attack.gif)

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
<!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: $mensajePHP_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
<!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:

(http://i.imgur.com/0URQ2tA.png) (http://i.imgur.com/0URQ2tA.png)
(http://i.imgur.com/yH0E3nV.png) (http://i.imgur.com/yH0E3nV.png)





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

usuario: arthusu contraseña: 12345

(http://i.imgur.com/tZgOPf1.png) (http://i.imgur.com/tZgOPf1.png)
(http://i.imgur.com/xWieYLZ.png) (http://i.imgur.com/xWieYLZ.png)







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:

(http://i.imgur.com/nTrrI5H.png) (http://i.imgur.com/nTrrI5H.png)
Luego llega el administrador e inicia sesion en su sistema de logs donde puede ver los mensajes enviados :P

(http://i.imgur.com/9DysjBM.png) (http://i.imgur.com/9DysjBM.png)
(http://i.imgur.com/cEWLJHn.png) (http://i.imgur.com/cEWLJHn.png)

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
<!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: $mensajePHP_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:

(http://i.imgur.com/nTrrI5H.png) (http://i.imgur.com/nTrrI5H.png)
(http://i.imgur.com/IUXnNfS.png) (http://i.imgur.com/IUXnNfS.png)

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): https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet (https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet)
Burp Suite (Lanzar Payloads): http://portswigger.net/burp/ (http://portswigger.net/burp/)

Sitio de referencia: http://www.acunetix.com/blog/web-security-zone/articles/blind-xss/ (http://www.acunetix.com/blog/web-security-zone/articles/blind-xss/)

Fuente: Arthusu BLOG
Título: Re:[Tutorial] XSS a ciegas
Publicado por: Turka en Septiembre 08, 2014, 12:31:56 PM
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!.
Título: Re:[Tutorial] XSS a ciegas
Publicado por: Dedalo en Septiembre 08, 2014, 01:26:08 PM
Muy bueno arthusu... es un ataque muy ruidoso pero midiendo bien y con el script correcto puede ser muy efectivo :)


Saludos!