Upload
raul-robles
View
3.523
Download
3
Embed Size (px)
Citation preview
By Annika Pringles
XSS en Aplicaciones Web con Ajax
JSON: Un formato ligero de intercambio de datos basado en nombre/valor:
{"parameter":"value","next_parameter":"next_value"}
Usando Ajax, podemos transmitir datos JSON mientras la página Web se esté cargando.
JSON (JavaScript Object Notation)
Ajax
Y como Ajax utiliza HTTP podemos accesar a los datos JSON directamente en el explorador modificando la URL
En la API de Twitter podemos armar una URL que regresa en formato JSON los datos de mi Twitter:
Y cómo sirven?
https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=annikapringles&count=1&callback=callback
callback([{"created_at":"Sat Apr 21 15:15:51 +0000 2012","id":193719704974659584,"id_str":"193719704974659584","text":"\"vestida\", para matar","source":"\u003ca href=\"http:\/\/twitter.com\/#!\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":52305348,"id_str":"52305348","name":"Annika Pringles","screen_name":"annikapringles","location":"Mexico City","description":"I'm an operation that is executed in every 3d software, when a 4 sided vertical node dynamic is cross interpolated with a particle dampening...
JSON está chido, pero cuando necesitamos que regrese valores que contengan HTML, ahí hay problema!
Podemos intentar inyectando un <s> en alguno de los datos del request, y si vemos que el explorador responde con texto y una línea quiere decir que la página es vulnerable al XSS
Cómo puedo probar si mi
página es vulnerable a
XSS??
Como a los exploradores les encanta renderear código a pesar de que le indiques que el Content-Type sea application/json o application/x-javascript, puedes ser objetivo de que alguien pueda ‘esnifear’ tu contenido y así puedan ejecutar Javascripts chuecos
Internet Explorer confía ciegamente en la extensión cuando se está ‘esnifeando’ contenido y las extensiones de los archivos pueden ser cambiadas en cualquier momento, esto es, si tenemos usuario/json nos regresa texto plano, pero si le cambiamos a usuario/json.html lo puede interpretar como HTML!
Dependiendo el servidor web hay varias formas de hacer este cambio de extensiones:
/json.htm /json.html /json/.html (PHP and Asp.NET) /json;.html (JSP) /json.cgi?a.html
Y para acabarla de chin…
Verificando que se puedan agregar extensiones arbitrarias en la URL
El sitio esté usando HTTPS
La página tenga ‘headers’ para cache-control: no cache o pragma: no-cache
El sitio tenga el ‘header’ content-disposition: attachment
Que el Content-Type del sitio esté puesto para image/[anything]
Cómo puedo probar si mi
página es vulnerable a que
la ‘esnifeen’?
Como siempre, hay que validar todos los input que haga el usuario
Cuando el input del usuario se tenga que regresar al explorador, siempre codificar ese texto propiamente, p.ej.: reemplazar < con Unicode como \u003C
Y finalmente, como un extra, incluir en el servidor web el header X-Content-Type-Options: nosniff, esto para evitar que ‘esnifeen’ contenido en Internet Explorer 8+ y otros exploradores
Recomendaciones