Safarii瀏覽器bug可引發XSS
研究人員發現一個Safari瀏覽器的bug,利用該bug可以繞過瀏覽器的過濾器,並進行XSS。之前也有研究人員發現過該漏洞,因此漏洞並不是第一次出現。
先看一個研究人員偶然發現指令碼檔案:
<script type="text/javascript"> var parseQueryString = function parse(queryString) { */ parsing /* return params; } var search = window.location.search; var query = parseQueryString(search); var redirect = query.redirect; redirect = decodeURIComponent(redirect); var parser = document.createElement('a'); parser.href = redirect; var protocol = parser.protocol.toLowerCase(); if (['javascript:', 'vbscript:', 'http:', 'https:', 'data:'].indexOf(protocol) < 0) { window.top.location = redirect; } </script>
該檔案的目的是重定向到手機APP,其中有重定向引數,檢查協議是否在黑名單中,如果不在黑名單中就重定向。為了成功利用該漏洞,需要建立一個可以以Javascript執行的連結,因為協議中沒有javascript。根據瀏覽器說明檔案,這是不可能的。但與其他軟體一樣,瀏覽器並不會完全遵循說明檔案。
研究人員首先關注的是重定向部分。因為使用了.toLowerCase(),那麼是否有可能將一些Unicode字串在進行.toLowerCase()轉化時變成其他字元呢?一個協議被分成兩行是否可以正常執行呢?
重定向
研究人員選擇分析重定向而不是過濾器。一般來說域名和URL-handling可能會存在漏洞,所以研究開始了分析之旅:
開啟console,寫一個函式來模擬繞過。
`//`在Javaccript中表示註釋,`%0a`是URL編碼的換行來繞過註釋。
幸運的是研究人員竟然發現成功了。因為黑名單中沒有指定空協議,因此可以繞過過濾器。
Final payload是:`?redirect=javascript://%0aalert(document.domain)`。
該漏洞被報告給了許多使用SaaS服務的站點,許多使用該服務的子域名都受該漏洞的影響。許多廠商都瞭解到了該漏洞並進行了補丁修復。
引發新漏洞的補丁
因為SaaS廠商迅速提供了安全補丁,也就是說所有受影響的網站現在都安全了。但研究人員發現該補丁會破壞頁面原有的功能,因此研究人員猜測這是一個臨時補丁。
幾個月後, ofollow,noindex">vpnMentor的write-up 顯示臨時補丁被另一個更新的補丁代替,但這會導致新的XSS漏洞。
正則表示式
研究人員發現原來的payload還可以正常執行。第二個漏洞的補丁會導致第三個漏洞的出現,同樣的payload還可以正常起作用。但這並不是一個純DOM XSS,因為並不會在JS上讀取URL引數,而是在服務端反射。
最新解決方案
修復第三個漏洞的解決方案就是在黑名單中新增:’‘ and ‘: ’。研究人員認為應該沒有什麼可以繞過這個黑名單的。
// App redirects only. if ([ 'javascript:', 'vbscript:', 'http:', 'https:', 'data:', 'ftp:', ':', ' ' ].indexOf(protocol) < 0) { window.top.location = validate("[injection]"); }
該函式需要支援不同的自定義APP協議,使其不可能使用白名單,而只能使用黑名單。
總結
黑名單從來都不是一個很好的解決方案。在進行漏洞修復時需要記錄漏洞出現的原因以預防漏洞再次出現。協議bug相關資訊半年前就通知了蘋果公司,但Mac電腦和手機裝置的Safari最新版本仍存在該漏洞。