Monday, April 14th, 2008
Google XSS
Now, normally when I find an XSS vulnerability on a popular domain I just report it to the appropriate security team and move on, but this one is interesting…
By taking advantage of the content-type returned by spreadsheets.google.com (and a caching flaw on the part of Google), I was able to pull off a full blown XSS against the google.com domain. For those of you who don’t understand what this means, allow me to elaborate. When Google sets their cookie, it is valid for all of their sub domains. So, when you log into gmail (mail.google.com), your gmail cookie is actually valid for code.google.com, docs.google.com, spreadsheets.google.com…and so on. If someone (like me) finds an XSS vulnerability in any one of these sub domains, I’ll be able to hijack your session and access any google service as if I were you.
So, in this instance, I have an XSS on spreadsheets.google.com. With this single XSS, I can read your Gmail, backdoor your source code (code.google.com), steal all your Google Docs, and basically do whatever I want on Google as if I were you! Google’s use of “document.domain=” also make things a little easier to jump from one domain to the next, but that’s another story…
This particular XSS takes advantage of how Internet Explorer determines the content type of the HTTP response being returned by the server. Most would think that explicitly setting the content-type to something that isn’t supposed to be rendered by the browser would easily solve this issue, but it does not. IE isn’t the only browser that will ignore the content-type header in certain circumstances, Firefox, Opera, and Safari will ignore the content-type header as well (in certain circumstances). Security professionals and more importantly developers need to understand the nuances of how the popular web browsers handle various content-type headers, otherwise they may put their web application at risk of XSS. The most comprehensive paper I’ve seen on the subject was written by Blake Frantz of Leviathan. The paper can be found here. It’s a “MUST HAVE” reference for web app security pros. Read it, understand it, protect yourself appropriately or expect others to exploit appropriately…
In this issue, Google set the content-type header for a response which I controlled the content to text/plain. If I can inject what looks like HTML into the first few bytes of the response, I’ll be able to “trick” Internet Explorer into rendering the content as HTML. Luckily for me, I was able to do just that.
I created a spreadsheet on spreadsheets.google.com and for the first cell (A1) I put the following content: “<HTML><body><script>alert(document.cookie)</script></body></HTML>”
I then saved the spreadsheet and generated a link for the spreadsheet to be served as a CSV.
When this option is selected, the contents of the spreadsheet are displayed inline (the content-disposition header was not explicitly set to “attachment”), IE ignores the content-type header, sniffs the content-type from the response, then proceeds to render the response as if it were HTML. At this point, I control the entire HTML being rendered under an xxx.google.com domain.
To be fair, Google included a subtle defense to protect against content-type sniffing (padding the response), but those protection measures failed (with a little prodding by me). The issue is fixed, but if you try to reproduce this issue, you’ll see their defense in play. It a solid defense which shows they understand the nuances of content-type sniffing.
I’ll provide some tips on taking ownership of untrusted content and serving it from your server in a later post, but for now take a look at the paper written by Blake Frantz. I’m sure it will open some eyes…
Pingback: .:Computer Defense:. » Interesting Links
Pingback: Gmail cookie stolen via Google Spreadsheets « IT Spot
Pingback: إمكانية سرقة الكوكيز لبريد قوقل عبر مستندات قوقل « KLadofoRA
Pingback: إغلاق ثغرة خطيرة في غوغل أوفيس
Pingback: WhatsMyProblem? - Allround themenblog
Pingback: Coqp.com Blog Web Technology news » Blog Archive » Gmail cookie stolen via Google Spreadsheets
Pingback: » News, Trauer, Nüsse & Bier | seoFM - der erste deutsche PodCast für SEOs und Online-Marketer
Pingback: Zero Day mobile edition
Pingback: Another Reason To Ditch IE. As If We Didn’t Have Enough Already. « Media Junkie
Pingback: Falha já corrigida no Google Apps permitia acesso a serviços do Google | Manoel Franklin
Pingback: Union Softwares - Blog » Falha já corrigida no Google Apps permitia acesso a serviços do Google
Pingback: Shadow Security Blog » Detectan agujero de seguridad en Google Apps
Pingback: Revue de presse
Pingback: Web 2.0 Ideenklau! Oder bin nur ich paranoid? | Blogmillionär
Pingback: Google Health « NonaTheNinja
Pingback: GoogleBig » Blog Archive » XSS vulnerability found by Billy (BK) Rios in Google Spreadsheets
Pingback: Sicherheitslücke in Spreadsheets « GoogleWatchBlog WP Test