Evasión del filtro XSS del navegador Edge

El 4 de septiembre de 2015, Gareth Heyes del blog de PortSwigger reportó a Microsoft una forma de evadir el filtro XSS de su nuevo navegador Edge. A día de hoy este bypass sigue siendo posible: 

http://challenge.hackvertor.co.uk/script.php?x=g%27,y=%27f%27,{[%27toStrin%27%2bx]:[].join,length:1,0:%27java\script:alert\x281\x29%27,[%27valueO%27%2by]:location}-%27



Veamos como llegamos a ese XSS... 


IE tenía un fallo mediante el cuál se podía utilizar el objeto location como una función y combinar toString/valueOf en un objeto literal para ejecutar código. Básicamente se utiliza el objeto literal como una matriz falsa que llama a la función join que construye una cadena desde el objeto literal y lo pasa a valueOf que a su vez se lo pasa al objeto location. Aquí está el código:

-{toString:[].join,length:1,0:'javascript:alert(123)',valueOf:location}

Esto también funciona en la versión más reciente de Edge, sin embargo ambos navegadores lo detectarán como un ataque XSS. El filtro de expresiones regulares detecta una cadena seguida de cualquier número de caracteres, seguido de un "{" o "," más toString/valueOf y el carácter ":". La "a" de valueOf y la "o" de toString se sustituyen por el carácter "#". Aquí es una versión simplificada de la expresión regular:


["'`].*?[{,].*(valueOf|toString).*?:}


En el siguiente pastebin de octubre de 2015 podéis encontrar los regexp: http://pastebin.com/LLB4tMAS

Por otro lado, Edge soporta ES6 (ECMAScript v6 o el nuevo estándar de javascript) y viene con algunas nuevas características muy útiles. Por ejemplo las propiedades calculadas en ES6 permiten pasar una expresión para calcular el nombre de la propiedad:

x='a';
o={[x]:123};
alert(o.a)


Mediante la combinación de las dos técnicas podemos evitar el filtro XSS Edge. 

Como se muestra anteriormente, las expresiones regulares buscan toString/valueOf pero ,desafortunadamente, se pueden ofuscar utilizando las propiedades calculadas:

x='g',y='f',
{['toStrin'+x]:[].join,length:1,0:'java\script:alert\x28123\x29',['valueO'+y]:location}-'';


Fuente:
- Edge XSS filter bypass

Comentarios