很多時候我們會因為一個活動或者一些其它的原因建立一些臨時的站點。但是糟糕的是一旦這一切過去后我們會忘了關閉它。就像我在http://hk.promotions.yahoo.com上發現的這個漏洞一樣,那些臨時站點往往成為我們強大安全體系中的軟肋。
讓我們看看我在雅虎香港的這個子站上發現的一些有趣的東西:
就如同你從請求日志中當中所看到的, 有些東西正在嘗試跨域請求其它域名下的數據。
http://hk.promotions.yahoo.com/petshow2011/php/getImages.php?file=<url>
跨域代理對于挖洞的人來說,就像是金礦般的存在。我們總能從它身上找到一些漏洞,這一個也不例外。不得不說,我們很幸運。因為這里并沒有用白名單來限制URL所指向的域名。而且這個代理居然沒有在Response上設置content-type。這意味著?嗯,我們找到了一個XSS。
但這個XSS并不能讓我興奮起來。因為它只不過是一個在幾乎可以看作是靜態網站上的XSS。換句話來說,它根本就沒有任何價值。
那我們如何才能讓它變得有用呢?還記得content-type的事情吧?嗯,一個沒有設置content-type的response意味著我們可以控制整個response的內容。那我們為什么不試著搞一個swf呢?這樣就意味著我們在hk.promotions.yahoo.com域下擁有一個完全可控的swf文件。也許有人會問為什么swf會比HTML更有用呢?其實我很想說是因為“愛情”,但實際上是因為crossdomain.xml。因為flash可以在crossdomain.xml允許的前提下進行一些跨域的通訊,那么接下來我們只要在找到一些設置上不太安全的crossdomain.xml就可以搞一些有趣的事情了。在經過一些列的檢測后我把目標鎖定在了下面的三個域名里。
finance.yahoo.com:
#!html
<cross-domain-policy>
??? <allow-access-from domain="*.yahoo.com"/>
??? <allow-access-from domain="us.js2.yimg.com"/>
??? <allow-access-from domain="*.yimg.com"/>
</cross-domain-policy>
www.flickr.com:
#!html
<cross-domain-policy>
??? <allow-access-from domain="*.yahoo.com"/>
??? <allow-access-from domain="l.yimg.com"/>
??? <allow-access-from domain="d.yimg.com"/>
??? <allow-access-from domain="s.yimg.com"/>
??? <site-control permitted-cross-domain-policies="master-only"/>
</cross-domain-policy>
ca-mg5.mail.yahoo.com 不過似乎這個比前兩個更加有趣一些
#!html
<cross-domain-policy>
??? <allow-access-from domain="*.yahoo.com" secure="false"/>
??? <allow-access-from domain="l.yimg.com" secure="false"/>
??? <allow-access-from domain="s.yimg.com" secure="false"/>
</cross-domain-policy>
如果你把注意力放在這個secure=flase上面,我想你應該沒白這個設置會允許我們通過HTTP的方式來訪問一些只允許通過HTTPS來訪問的資源。詳情可以參見:“Using false in an HTTPS policy file is not recommended because this compromises the security offered by HTTPS.”
現在一切都已經很明了了。我們可以借助我們構造的swf文件來和ca-mg5.mail.yahoo.com 進行通訊。使用工具SWF<->JS XHR proxy,讓我們嘗試著來搞點郵件吧!我們先嘗試通過這個swf里的JavaScript來發送一些跨域的請求:
看上去一些都很順利。我們可以從response中看到收獲的auth tokens和一些個人信息。然而借助其中的一個token我們可以列出郵件的列表
進一步我們可以通過使用這些message id來閱讀郵件的內容
當然,因為我們可以讀取那些具有CSRF tokens的頁面,所以我們也可以試著刪除一些郵件或者以當前用戶的身份來發送郵件。當然可能更加有趣的是我們可以控制所有綁定了這個郵箱的帳號,重置那些帳號的密碼并偷偷的刪除那些重置郵件。
作為修復方案,雅虎安全團隊選擇刪除了這個站點。不得不說這也是個不錯選擇。但是關于crossdomain.xml,他們表示并不會對齊進行任何的修改。也許業務的緊密度和業務線的長度在某些時候并不能讓我們做一些變動。但這仍然是個需要被解決的問題。
PS:yahoo為此漏洞支付了作者3000刀!~