jueves, 17 de marzo de 2011

XSS - Cross Site Scripting

Antes de comenzar quiero realizar algunas aclaraciones. La seguridad informática consiste en estudiar los métodos que podemos aplicar en un sistema informático para conservar la Integridad, Confiabilidad y Disponibilidad de la información. Cuando hablamos de Integridad decimos que la información solo puede ser modificada por aquellos usuarios que tengan permiso para hacerlo; la Confiabilidad indica que solo pueden tener acceso los usuarios autorizados; y la Disponibilidad hace referencia a la disponibilidad de los datos cuando son requeridos. Se suele llamar Hacker a aquella persona con muchos conocimientos sobre sistemas, la mayoría son muy curiosos e inteligentes.
Para mantener esta seguridad en nuestros datos tenemos que aprender las técnicas que usan los Hackers para obtener acceso no autorizado. Esto conlleva a un debate moral que prácticamente no tiene solución por culpa de los medios de difusión que lograron asociar la palabra “Hacker” con “CiberDelincuente”; en la jerga informática suele definirse a los Hackers de acuerdo a sus intenciones en:
Hacker de Sombrero Blanco (White Hat Hacker): realizan intrusiones para determinar la seguridad de un sistema informático para luego mejorarlo y así evitar situaciones no deseadas. Son los buenos, los profesionales.
Hacker de Sombrero Negro (Black Hat Hacker): son los menos profesionales, no por sus conocimientos, sino por su moral. Realizan intrusiones a sistemas con fines maléficos, como robar datos privados, estafar, etc.
Hacker de Sombrero Gris (Gray Hat Hacker): son una combinación de los dos anteriores, terminan haciendo las cosas para el mejor postor (el mal o el bien).

Me extendí demasiado explicando sobre seguridad informática, pero me parece lo correcto para que no digan que enseño a estafar, simplemente explico las técnicas que permiten realizar actos delictivos y que pueden perjudicar a nuestros clientes si somos programadores web. El bando en el que cada uno decida estar depende de ustedes, pero recuerden que del lado del mal están solos... y pueden terminar mal.

En este artículo voy a tratar sobre una de las vulnerabilidades que se encuentra en prácticamente todas las aplicaciones web e incluso navegadores. Prácticamente ninguna página web se salva del XSS.

¿Que es XSS?
Significado de las siglas: Cross Site Scripting (Cruzar Código al Sitio). Se usa la X en lugar de la C para que no se confunda esta sigla con la de CSS (Hojas de Estilo en Cascada), que no es una falla sino mas bien una tecnología para maquetado de páginas.
A grandes rasgos, el XSS consiste en inyectar código (el mas común: Javascript) que produzca un cambio en la página y nos permita aprovechar la confianza que tienen los usuarios a dicho sitio. Por ejemplo podemos mostrar un formulario de iniciar sesión a twitter que envié los datos a un script subido previamente por un cibercriminal, que almacena esos datos para luego ser vendidos a aquellos que se dedican al spam.
El XSS nos permite defacear una página. Si la página de taringa tuviese un XSS, se podria aprovechar para mostrar un formulario donde se pida una cuenta de facebook, nosotros no sospecharíamos porque en la barra de dirección del navegador diria "http://taringa.net/". En cambio, si dice la URL que dice nuestro navegador es totalmente desconocida lo pensaría antes de ingresar mis datos de acceso.
Existen dos tipos de XSS:

-Persistente: se produce generalmente en sectores donde podemos comentar, de modo que el código que inyectemos quedará almacenado en el servidor y se ejecutará cada vez que abramos la página.
-No Persistente: también conocido como reflejado, consiste en inyectar código pasándolo mediante la URL, no se almacena en el servidor, solo es explotable el XSS mediante la URL.

Como evitar el XSS
El XSS se produce cuando no filtramos los datos pasados que luego se colocan en el documento HTML que conforma nuestra página. Generalmente con filtrar los símbolos < y > ya lo evitamos, sin embargo, todo depende del contexto. En algunas ocasiones también tenemos que filtrar la comilla doble y la simple ya que el dato ingresado se coloca como dirección para un vínculo.
El término Bypass es usado para designar un método para saltear el filtro y permitir la ejecución del código que inyectamos. Este método puede ser una secuencia de caracteres especialmente formada, el aprovechamiento de alguna falla del sistema de codificación usado por el navegador, etc.

Esta falla es a mi parecer una de las más fáciles de explotar, solo es cuestión de buscar un hueco en la página donde no se filtren los datos y luego depende de nuestra creatividad los usos que podemos llegar a darle.


Prueba de Concepto
Ahora que hemos definido la vulnerabilidad y como se produce, es conveniente practicar con una página diseñada por nosotros que nos permita ver en funcionamiento la falla. Para esto les daré un código muy simple que refleja un error que vi recientemente en un sitio para compartir libros sobre informática y distintas temáticas, les avise de la misma pero todavía sigue sin solución.
Supongo que ya tienen un servidor Apache con PHP instalado, sino pueden descargar uno de los paquetes como WAMPP o LAMPP (los que uso yo, para Windows y Linux respectivamente).
Comenzaremos con XSS no persistente ya que es el más común y la página de prueba tiene menos código, en un próximo capitulo daré un código de XSS persistente.
El código fuente:


<html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>POC de XSS no persistente</title>

</head>



<body>

<h1>POC de XSS</h1>

<h3>

<p align="center">

El archivo que usted está por descargar se encuentra comprimido en un rar.<br/>

Utilice Winrar para descomprimirlo y un lector PDF para visualizarlo. <br/>



Descargar:

<?php

/*

Aquí se escribe en el HTML lo pasado por get en la variable link.

No se filtra el dato pasado, por lo tanto se escribe tal cual en la página...

entonces XSS!!

*/

$link = "";

if(isset($_GET['link'])){

$link = $_GET['link'];

}

echo "<a href=\"". $link . "\">Descargar Libro PDF</a>";

?>

</p>

</h3>

</body>

</html>


Este código lo copian en un index.php y lo ejecutan. Si ejecutan desde la url localhost/index.php el link Descargar Libro PDF no tendrá ninguna dirección. Ahora prueben ejecutarlo como localhost/index.php?link=http://google.com y denle click al vinculo, le redirige al buscador de Google.
Bien, como vemos todo lo que pasamos por la variable link por GET se imprime en el documento en el parámetro HREF de la etiqueta A. Ahora prueben poner en link lo siguiente: “>, no copien y peguen porque por ahí el formato del texto hace que los caracteres sean distintos y no se produzca el bypass.
Lo que hicimos fue inyectar en el HTML un código Javascript que ejecuta una ventana de alerta con un mensaje, podríamos también colocar el código de un formulario que envié los datos a un script para que los guarde, y muchas cosas más, el único limitante del XSS es nuestro ingenio.
Los caracteres “> son el Bypass que nos permiten salir de la etiqueta A y que el código que esté después de la misma pueda ejecutarse.

Con este código pueden probar infinidad de cosas, recuerden siempre que es un XSS no persistente, por lo tanto el código solo se inyecta por la URL y perjudica al cliente, o sea el navegador, el XSS persistente perjudica al servidor ya que modifica un documento original produciendo una falta a la integridad de la información.

Considero a este artículo como una guía básica para introducirse al XSS, quedan muchos otros aspectos más que comentar, pero si sigo voy a terminar escribiendo un libro sobre XSS.
Como experiencia personal, yo comencé a incursionar en el mundo de la seguridad informática con esta vulnerabilidad, si bien es una falla web, me motivo para continuar investigando y aprendiendo cada vez mas

No hay comentarios: