SlideShare una empresa de Scribd logo
1 de 7
By Annika Pringles
 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.
 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:
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
iPhoneu003c/au003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":nul
l,"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
 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
 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]
 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

Más contenido relacionado

Similar a HackingMexico Xss en aplicaciones web con ajax

Similar a HackingMexico Xss en aplicaciones web con ajax (20)

Taller de introducción a Google App Engine
Taller de introducción a Google App EngineTaller de introducción a Google App Engine
Taller de introducción a Google App Engine
 
Ajax ya temas 4-6 Equipo 2
Ajax ya temas 4-6 Equipo 2Ajax ya temas 4-6 Equipo 2
Ajax ya temas 4-6 Equipo 2
 
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
 
Presentacion ajax
Presentacion   ajaxPresentacion   ajax
Presentacion ajax
 
Http al descubierto
Http al descubiertoHttp al descubierto
Http al descubierto
 
Http al descubierto
Http al descubiertoHttp al descubierto
Http al descubierto
 
Que es AJAX
Que es AJAXQue es AJAX
Que es AJAX
 
Consumiendo servicios Restful en Xamarin.Forms
Consumiendo servicios Restful en Xamarin.FormsConsumiendo servicios Restful en Xamarin.Forms
Consumiendo servicios Restful en Xamarin.Forms
 
Taller Android Party: Automatic API REST + Notificaciones PUSH
Taller Android Party: Automatic API REST + Notificaciones PUSHTaller Android Party: Automatic API REST + Notificaciones PUSH
Taller Android Party: Automatic API REST + Notificaciones PUSH
 
Ajax
AjaxAjax
Ajax
 
Servicios web con Python
Servicios web con PythonServicios web con Python
Servicios web con Python
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Rest
RestRest
Rest
 
Servicios web
Servicios webServicios web
Servicios web
 
Expo
ExpoExpo
Expo
 
Presentación1
Presentación1Presentación1
Presentación1
 
Ajax
AjaxAjax
Ajax
 
Inicios Ajax
Inicios AjaxInicios Ajax
Inicios Ajax
 
Ajax
AjaxAjax
Ajax
 
Servicios WWW y HTTP
Servicios WWW y HTTPServicios WWW y HTTP
Servicios WWW y HTTP
 

HackingMexico Xss en aplicaciones web con ajax

  • 2.  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.
  • 3.  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: 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 iPhoneu003c/au003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":nul l,"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...
  • 4.  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
  • 5.  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
  • 6.  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]
  • 7.  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