sábado, 5 de enero de 2013

Cookies Persistentes

Todo programador web sabe que es una cookie y para que sirve, son simples y pequeños archivos que contienen información asociada a un sitio web y que esta puede ser de hasta 4Kb.

A veces se nos a presentado el problema de hacer persistir ciertos datos de lado cliente de forma mas permanente, por ejemplo hacer que el navegador recuerde la sesión de un usuario o mejor aun hacer que esta sesión sea cross browser, eso quiere decir que podría recuperar una sesión desde otro navegador, la solución es una cookie persistente, también conocida como cookie zombie.

La forma de lograrlo es crear un sistema capaz de crear la cookie en varias vías y luego recuperar la información requerida, pero también debe verificar si en alguna de las vías la cookie ya no existe, entonces crearla de nuevo usando el valor en una de las otras cookies y para ello se utilizan métodos variados como pueden ser:

El método convencional con un Script de lado servidor que crea la cookie.

LSO que son cookies Flash.

Cookies almacenadas en imágenes.

El sistema HTML5 de almacenamiento.

Entre otros mas. Bien esto es mas complicado de lo que parece, pero si no quieres complicarte mucho o aprender a hacerlo que mejor que aprender de otros, puedes usar o echarle un vistazo a un proyecto llamado evercookie de Samy Kamkar. Este sistema crea la cookie en las siguientes vías:


 - Estándar HTTP Cookies (PHP)
 - LSO (Flash Cookies)
 - Almacenamiento Silverlight
 - En valores RGB (PNG)
 - En el Historial Web
 - HTTP ETags
 - Cache web
 - Cacheo en window.name
 - Almacenamiento userData de Internet Explorer
 - HTML5 Session Storage
 - HTML5 Local Storage
 - HTML5 Global Storage
 - HTML5 Database SQLite


Por cierto que este es cross browser y puedes descargar el código fuente que viene incluso con un ejemplo de uso. La pagina del proyecto es:

http://samy.pl/evercookie/

Por cierto si piensan hacer uso de el recuerden la ética y no le den mal uso "un gran poder conlleva una gran responsabilidad" XD

Saludos espero les sea de utilidad.


jueves, 3 de enero de 2013

El peligroso XSS

El XSS (Cross Site Scripting) o secuencia de comandos en sitios cruzados, es una técnica de hacking que vulnera la forma en que esta programado un sitio web, básicamente se basa en el descuido del programador que al hacer un sitio piensa que solo se le dará la utilidad para la cual lo creo y dado que las computadoras obedecen ciegamente es posible ejecutar código malicioso si el programador no tiene cuidado en la confianza que le da a los datos de entrada y salida. El XSS se vale de tecnologías de lado cliente como javascript, vbscript y html.

Si bien es un ataque que se da de lado cliente(navegador) no significa que estamos exentos de responsabilidad como programadores de un sitio, ya que este ataque se lleva a cabo a través de nuestros sitios, por lo que podría quedar en algunos casos, comprometida la seguridad de nuestro propio sitio.

Es usado principalmente para robar información delicada, phishing, secuestrar sesiones y lograr entrar en un sitio restringido. Existen dos tipos de XSS, el indirecto y el directo:

El indirecto o reflejado. Consiste en modificar las variables que una aplicación web usa para funcionar, ejemplo los valores que se pasa google en la URL a la hora de hacer las búsquedas, y puede valerse de GET,  cabeceras HTTP (POST) y Cookies

El directo o persistente. Este se basa en embeber código html y javascript en aplicaciones que presentaran dicho código, ejemplo un sitio de foros, donde los usuarios publican temas y respuestas que serán almacenados en una base de datos y posteriormente para su visualización serán leídos.

Para darse una idea, nada como unos ejemplos muy simples. Tenemos el siguiente sitio que usa a otra pagina, pero lo hace por medio de una variable pasada por URL.

www.miweb.com/paginax.php?pagina=paginados.php

Luego podemos ejecutar código arbitrario.

www.miweb.com/paginax.php?pagina=<script>alert(document.cookie);</script>

o ejecutar código usando caracteres en Hexadecimal


www.miweb.com/paginax.php?pagina=%3Cscript%3alert(document.cookie);%3C%2Fscript%3

Lo anterior es un ataque de tipo reflejado.

El directo se basa en el echo de que un sitio web es capas de guardar el código inyectado y posteriormente interpretado en el navegador de la victima. Por ejemplo, el siguiente código inyectado desde un <input>

<script>for (;;) alert("bucle"); </script>

Podría provocar una especie de denegación de servicio en el navegador de la victima.

Desde luego estos ejemplos son muy ingenuos y no son útiles para nada, pero solo sirven para dar una idea. La forma de mitigar este problema, es simplemente validando todos los datos que vendrán del lado cliente.

Usar validaciones tanto de lado cliente como de lado servidor es lo recomendable, la expresiones regulares ayudan mucho, por regla general nunca confíes en el dato que vendrá de lado cliente, por lo tanto valida siempre según el dato que esperas, por ejemplo, en un formulario que pide datos como correo o numero de teléfono  se debe validar que dichos campos tengan solamente caracteres de ese tipo.


Aquí hay un PDF que me sirvió para darme una introducción al tema http://xsser.sourceforge.net/xsser/XSS_for_fun_and_profit_SCG09_(spanish).pdf

Y que mejor que la guía OWASP sobre el tema, los PDF están en esta pagina.

https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

Saludos.