sábado, 7 de noviembre de 2015

Bypassing XSS Filters - Caso Ebay

Empecé a escribir esta entrada en marzo de este año (2015), luego de reportar el fallo por el programa BugBounty de Ebay. Ha pasado algo más de 8 meses y la razón por la que no lo publiqué antes, aunque el XSS que reporté originalmente ya no funciona más, es porque el dominio sigue plagado de fallos similares. He decido finalmente publicar esta entrada porque considero que ha pasado un tiempo prudente y además es un caso didáctico para aprender un truco que me permitió burlar el filtro anti XSS que tenía la web de Ebay.

Sin más, vamos a la acción.

La URL vulnerable es esta:

http://rover.ebay.com/ar/1/711-53200-19255-1/1?campid=5336385825&toolid=71153200192551&customid=tnpawnman&mpt=499999999999&adtype=2&size=88x31&mpvc=XSS

Fig. 1 - URL Vulnerable

La variable afectada es "mpvc". El XSS está en el contexto del atributo "href" del tag "a".

Fig. 2 - Test XSS.

Observamos que podemos usar las comillas dobles para cerrar el atributo "href" pero los caracteres "<" y ">" son reemplazados por espacios en blanco con lo cual nos va a ser imposible inyectar nuevos tags HTML. Sin embargo aún podemos jugar con los eventos del tag "a" e inyectar código javascript en alguno de estos. Algo así:

<a target="_blank" href="foo" onclick="alert(1)" x="http://...

Veamos:

Fig. 3 - Test XSS "onclick".

Ahora vemos que los paréntesis "(" y ")" también son reemplazados por espacios en blanco. Con este último filtro pareciera que nos va a ser imposible ejecutar cualquier función y que hoy no veremos el ansiado alert brotar en nuestra pantalla :(

Sin embargo, luego de haber participado en varios CTF y de rompernos la cabeza con tantos y tantos filtros diferentes, nos acordamos de un XSS ninjutsu que nos hará salir victoriosos...


Como el XSS está en el contexto del atributo de una etiqueta, podemos usar HTML Entities para codificar los caracteres filtrados. En nuestro caso los paréntesis de apertura y cierre se representan como "&#40;" y "&#41;" respectivamente.

Round 2. Fight:

Fig. 4 - XSS Test con "HTML Entities".

Nota: Para enviar los caracteres "&" y "#" en la URL es necesario codificarlos en hexadecimal como "%26" y "%23" respectivamente.

Esta vez no nos ha filtrado nada y eso quiere decir que...

Fig. 5 - XSSlity a rover.ebay.com.

PoC URL:

http://rover.ebay.com/ar/1/711-53200-19255-1/1?campid=5336385825&toolid=71153200192551&customid=tnpawnman&mpt=499999999999&adtype=2&size=88x31&mpvc=foo" onmouseover="alert%26%2340;/XSSlity/.source%26%2341;" x="

Luego de reportar la vulnerabilidad y como soy algo impaciente me puse a buscar en Internet si esta misma vuln ya había sido reportada y encontré esto:

http://xss.cx/2011/09/16/ghdb/dork-xss-reflected-cross-site-scripting-cwe79-capec86-javascript-injection-insecure-configuration-weak-programming-http-cookie-without-secure-flag-set-injection-example-poc-report-01.html#2.15

Al parecer es el reporte de un análisis automatizado. Como se puede ver en los detalles, cuando se hizo el reporte los paréntesis aún no eran filtrados. Por lo que deduzco que Ebay parchó el XSS filtrando los paréntesis pero por lo visto no fue suficiente :P

Un saludo.

2 comentarios:

  1. Es un excelente articulo , que demuestra que XSS puede estar en cualquier lado

    ResponderEliminar