原文地址:Advanced web security topics
前言
(最後更新時間:2018年2月28日)這篇文章討論了我到目前為止遇到的網路安全問題 。這是一項正在進行的工作,我將不斷更新。 帖子標題包括“高階”,因為這裡討論的主題涉及聰明的,不平凡的黑客。下面我們直接進入正題。
在影像中使用錯誤的MIME型別來提供HTML
摘要:攻擊者將影像上傳到包含HTML和Javascript的受信任網站,但欺騙網站將影像作為HTML文件提供。
攻擊步驟(參考下圖):
- 攻擊者使用嵌入式html 建立影像
- 攻擊者上傳影像到網站,影像會被接受。因為語法是有效的。
- 攻擊者欺騙網站使用者去訪問影像,並且欺騙網站以html的形式提供影像。
第一個是來自An XSS on Facebook via PNGs & Wonky Content Types[1],它使瀏覽器執行嵌入影像的HTML程式碼。此攻擊會將包含HTML字串的影像上載為使用者提供的內容,並使用與受感染網站位於同一域中的HTML MIME型別進行投放。此漏洞繞過了許多伺服器端程式碼注入檢查,因為沒有人檢查影像中的程式碼。這裡被利用的弱點是,通過將正確的字尾附加到URL檔名,可以欺騙網站以HTML MIME型別提供使用者提供的影像。
真正精彩的部分是construction of a valid PNG image[2]。瀏覽器在解析HTML時非常寬鬆 - 它們只會顯示他們不理解為文字的所有內容並解釋其餘內容,因此帶有嵌入式HTML的(除此以外)二進位制PNG將在HTML旁邊呈現大量垃圾。該HTML可以包含有效的Javascript,瀏覽器將使用當前登入使用者的域cookie和憑據執行該Javascript。
使用使用者提供的CSS竊取機密
摘要:使用CSS3功能的組合將資訊洩漏到第三方伺服器。 需要使用者提供的CSS樣式但不需要Javascript。
攻擊步驟(參考下圖):
- 在當前網頁上查詢敏感內容,如:
- 將唯一字型應用於不同的字元
- 調整父容器的大小,直到出現滾動條
- 為每個尺寸使用從攻擊者伺服器上的不同的字型
來自 Scriptless attacks[3]的這種攻擊非常值得注意,因為它可以從DOM中竊取隱藏資訊,例如來自href連結或隱藏輸入欄位的標記,而無需任何Javascript。它要求使用者可以將CSS注入網站 - 這是部落格軟體的一個共同特徵。**簡而言之:它使隱藏資訊在螢幕上可見,然後將各種字型應用於該資訊。**使用CSS動畫探測新渲染的元素的尺寸,該動畫通過包含文字尺寸作為URL引數的HTTP請求(例如,字型或影像)將尺寸洩漏到伺服器。伺服器可以讀取該引數並從數值推斷原始文字。細節:
0)攻擊者必須能夠以某種方式將CSS注入受感染的網站(例如使用者風格的部落格或論壇)。
1)使用高階CSS3選擇器和
:: before
或:: after
偽元素在DOM中建立隱藏資訊(例如連結引數,隱藏輸入欄位)。這將呈現通常不可見的字串。有關詳細資訊,我建議閱讀參考文獻[4],[5]。此步驟可能會多次複製要洩漏的文字,因為它需要使用不同的字型進行渲染(請參閱步驟2瞭解原因)。2)從您控制的伺服器引用外部CSS字型檔案。作者稱之為“字典攻擊”。字元的寬度在這裡起著重要作用,因為步驟(1)中的字元組合將導致所呈現內容的唯一大小。免責宣告:我不相信這一步會產生一個唯一的數字(例如,它如何將AB與BA區分開來?),但我可以想象步驟(1)的多次迭代以及每一步的不同字型可能會大大減少搜尋空間。我還懷疑步驟(1)在具有不同字型的相同文字上執行多次。
3)使用DOM元素包圍敏感資訊,觸發滾動條並使用CSS“smart scroll bars”[13]功能:在滾動條出現時應用一些CSS。這可能是渲染影像內容或另一個觸發對伺服器的請求的字型檔案。請注意,對於每個尺寸,可以請求不同的URL。
4)應用CSS動畫,從(3)中調整容器元素的大小。當容器上出現滾動條時,會應用新的CSS規則,從我們控制的伺服器載入(不存在的)字型檔案。每個容器大小有一個這樣的規則,每個容器大小有一個唯一的URL,因此大小有效地洩露給我們的伺服器。從洩漏的大小我們可以推斷出容器的內容。
通過欺騙瀏覽器將私有頁面載入為CSS來竊取網頁內容
摘要:一個邪惡的網站通過欺騙瀏覽器將可信網頁載入為CSS來竊取使用者登入的可信網頁中的內容。要求攻擊者可以向受信任的網站注入一些文字。
這個有點舊,因為寬鬆的CSS 解析 [6]以及允許Javascript檢視CSS宣告這一事實。我不確定這是什麼程度的反擊瀏覽器,我在網際網路上閱讀有關這方面的相互矛盾的陳述。該漏洞需要:
1)受害者Victor
2)Victor登入的網站Webmail,其中包含一些私人內容。只要使用者通過會話cookie進行身份驗證並登入到Webmail,就不必在選項卡或視窗中開啟Webmail。
3)攻擊者控制的網站example.com
4)Victor訪問example.com
5)攻擊者必須能夠將一些文字注入Webmail(例如,通過向Victor傳送一些他可以在他的Webmail中閱讀的電子郵件)
該漏洞利用如下:
1)Victor訪問我們的惡意網站example.com
2)example.com包含一個連結HTML元素,它試圖載入外部CSS樣式表。只是,它不是引用有效的樣式表,而是在Webmail上引用Victor的收件箱頁面。這將導致瀏覽器將論壇HTML載入為CSS並解析它。到目前為止傷害不大。
3)攻擊者能夠在Webmail中注入一些文字,在一些敏感文字之前啟動CSS宣告,並在敏感文字之後結束CSS宣告。一個例子是,如果我們早日向Victor傳送一條訊息,主題為:};。emailList {以及稍後與主題的訊息};。現在,我們傳送的第一封和第二封電子郵件之間的收件箱概述中的所有內容都可以解釋為CSS宣告。
4)當步驟(2)載入CSS時,由於CSS解析器的寬大,瀏覽器仍然能夠將整個收件箱解釋為CSS,這將導致(至少)宣告.emailList類。
5)由於攻擊者控制example.com,他可以在那裡放置Javascript,讀取.emailList類的cssText [8]屬性並將其傳送到他的伺服器。
我記得讀過這個多年來不斷湧現的漏洞,但我找不到任何說明性的參考資料了。 這些文章顯示了攻擊者如何能夠通過向他傳送兩封包含其主題中的CSS宣告的電子郵件來閱讀受害者的網路郵件收件箱。 一旦攻擊者將其受害者引誘到他們的惡意網站,攻擊者就能夠將受害者的收件箱讀作CSS宣告。
Angular 注入
摘要:在伺服器上呈現不好的使用者輸入的不良內容導致在瀏覽器中的Angular應用程式中執行程式碼
注入攻擊涉及惡意使用者提交未正確清理的資料,然後由系統的不同部分解釋。有HTML注入攻擊,SQL隱碼攻擊和Javascript注入攻擊。一個相當新的風格針對瀏覽器模板框架,如AngularJS [9]。
步驟:
1)惡意使用者提交Angular將解釋的一些文字T,例如{{警報(“你好”)}}
2)伺服器在包含Angular程式碼的頁面上將T呈現為HTML。由於沒有像T中那樣的HTML / Javascript標籤,因此大多數伺服器端都不會清理物件T.
3)瀏覽器呈現包含T的新HTML頁面。如果頁面執行Angular,則它將獲取T並將其解釋為Javascript。
Gareth Heyes詳細討論了 Angular 注入 [7]。
如果您想知道為什麼任何理智的Web應用程式將執行使用者提交的內容的伺服器端呈現(步驟2):針對功能減少的客戶端的SEO或回退策略是常見的用例。
HTTP 注入
這種型別的攻擊也稱為HTTP協議巢狀或 HTTP request smuggling [10]利用了參與裝置的HTTP協議實現中的弱點。
該論文的作者討論了針對同名伺服器軟體的幾個真實示例,這些示例導致了諸如cache poisoning[11]或憑證劫持等漏洞。這些漏洞主要涉及一系列伺服器軟體,如反向HTTP代理和Web伺服器。一個例子:
快取中毒:惡意客戶端將巢狀請求傳送到反向Web代理,後面有Web伺服器。代理以其認為請求URL U1的方式解析錯誤請求,而Web伺服器以不同的方式解析請求以及請求URL U2的內容。然後,Web伺服器返回U2的內容,但代理將該內容儲存在URL U1下。因此,對U1的任何進一步合法請求將服務於U2的內容。該漏洞利用工作過於簡單,如下所示:
POST U1
Content-Length: 0
Content-Length: 123
GET U2
….
由於Content-Length語句存在衝突,Web代理可能會認為POST內容與其後面的Web伺服器不同,因此Web伺服器可能會為U2服務,但代理可能會將U2的內容儲存在U1下。
作者討論了更多的漏洞;無論如何都值得一讀!
找出使用者訪問過的網站
惡意網頁可以在舊版本的流行瀏覽器中找到使用者訪問過的網站,幸運的是,這似乎 不在可能[12]。 “漏洞利用”簡單而有效:惡意網頁生成一個感興趣的連結列表。如果使用者訪問過去的任何一個,瀏覽器將以不同的方式呈現它們。 網頁可以通過指令碼查詢該樣式並將結果傳送出去。 瀏覽器填充了這個漏洞,其中包含向指令碼報告偽值和限制樣式量的組合(例如,您無法更改訪問連結的任何維度,因此查詢容器大小將不起作用)。
[2016年4月16日]
濫用URL索引來掃描私有資料
從這裡[13]:假設一個網站在一個不可思議的網址下公開了一些內容,例如: 通過包含像Google+這樣的UUID,可以通過私人連結分享私人內容,例如example.com/sdflo234ngnofgo23onigu。 只有知道該URL的人才能訪問該頁面,該訪問應該是安全的,因為“sdflo234ngnofgo23onigu”非常難以猜測。 攻擊者無法檢查導致example.com的URL的所有可能的字元組合,並且有一種理解和暗示沒有人會在網路上釋出該URL,否則它將被搜尋引擎索引並且可能是 發現那裡。
但是,如果您通過URL縮短器傳遞URL,搜尋空間將大大減少:example.com/sdflo234ngnofgo23onigu將成為ex.co/BlD33_。 攻擊者可以輕鬆掃描縮短服務上的少得多的URL,並發現提交給該縮短器的(私有)URL。
允許客戶端選擇協議
我無法想出一個更簡潔地描述問題的更好的標題:伺服器以保證其神聖性的方式傳送編碼/保護/簽名的資料,但允許客戶端將所述資料傳送回伺服器或其他伺服器具有不同的,不太安全的協議。
這個想法來自最近在多個JSON Web令牌實現中發現的 安全漏洞 [14]。 JSON Web令牌實現了驗證資料真實性和完整性的數字簽名,因此當客戶端從服務A獲取資料並將其傳遞給服務B時,該服務B可以基於JSON Web令牌驗證資料的完整性,而無需直接通訊服務A.在此漏洞中,客戶端可以請求協議實現,繞過每個設計的驗證。這裡學到的經驗是:參與通訊的各方將安全方面委派給底層實現應該驗證實現是否有效。
不經驗證安全假設的問題經常出現,例如:在2014年,CERT發現有幾個Android應用程式沒有驗證伺服器證照[15]。
[2016年8月31日]
具有target = _blank連結的網路釣魚
您知道帶有target =“_ blank”的HTML錨連結會在新選項卡或視窗中開啟連結頁面。 但你知道window.opener [17] Javascript屬性嗎? 新視窗可以通過該屬性訪問舊視窗; 值得慶幸的是,window.opener的大多數(子)屬性都不能被新視窗讀取,但可以更改window.opener.location屬性,這使得它可以用於網路釣魚攻擊:您點選了網路郵件程式中的連結,它會開啟 一個新頁面,在後臺只是重定向了一個視窗,該視窗將webmailer開啟到類似域上相同的登入頁面,告訴您會話已過期並要求您再次登入。 討論了創始人部落格[16]。 在支援的情況下,解決方案是新增rel =“noopener”標記或根本不使用目標。
[2016年10月24日]
用Rowhammer.js打破沙箱
Rowhammer [18]攻擊在硬體級別利用當前DRAM實現中的弱點,其中特殊構造的寫入模式可能干擾不相關的儲存器位置的內容。 Rowhammer.js [19],一個Javascript實現,最近浮出水面(不是這樣),它將Rowhammer移植到瀏覽器中。 雖然我認為Rowhammer是硬體漏洞,但我仍然提到它的新方法。
[2017年9月1日]
網路釣魚自動填充欄位
那個真的讓我完全禁用了自動填充功能。 攻擊基於瀏覽器在識別名稱/值組合時主動填寫表單欄位。 演示真的說明了一切。 該漏洞利用如下:
提供了一個HTML表單,要求提供一些基本的詳細資訊,如姓名和電子郵件地址。 該表格還包含幾個隱藏的欄位,我將在稍後討論。 許多網站要求提供此基本資訊,並使用名為“name”和“email”或類似名稱的表單欄位。 當你開始填寫這些時,瀏覽器會建議一個自動完成,當然,你會採取。 但是有一個問題:通過接受建議值,瀏覽器將填寫任何其他隱藏的欄位,它可以通過名稱記住...並且有很多:“creditcardnumber”,“address”,“phone”等。通過提交表單,你 不僅要提交您輸入的姓名和電子郵件,還要提供其可以匹配的所有其他欄位。
[2018年2月28日]
使用XML註釋偷偷過去驗證
一個相當具體的SAML漏洞利用[21]可以推廣到XML解析。 基本思想是XML被用作資料容器格式,但解析XML並處理資料的程式通常不瞭解XML格式的細微之處,這可能導致模糊。 焦點攻擊會影響XML註釋的模糊性:
<name>John<!--comment-->Doe</name>
複製程式碼
從概念上講,“name”元素的文字值是什麼? 從w3c的角度來看,“name”元素有三個子元素:一個值為“John”的文字節點,一個值為“comment”的註釋節點和另一個值為“Doe”的文字節點。
許多程式語言的SDK和框架為獲取XML節點文字值提供了便利功能。 根據其實現,可能返回值“John Doe”,“John Doe”,“John”或“Doe”。 大多數程式可能會使用這樣的便利功能,但是現代系統由幾個資料處理層(HTTP,WAF,驗證框架,Web應用程式框架)組成,每個這樣的層可能使用不同的“便利”實現。 這次攻擊讓我想起了我們之前看到的一些“HTTP注入”。
點選劫持社交媒體登入小部件
[更新2018.05.10] Google YOLO 漏洞利用[22]屬於對使用者社交網路帳戶的廣泛型別的點選劫持攻擊。 您可能知道“使用Facebook登入”功能,該功能允許網站通過其社交網路帳戶識別使用者。 前提是使用者驗證瀏覽器位址列中顯示的URL,檢查網站請求的訪問型別,並可以授予(或不授予)該訪問許可權。 | |
---|---|
這個漏洞:
- 由惡意網頁組成
- 將社交網路登入頁面嵌入iframe中
- 在iframe上放置另一個HTML元素,將其隱藏起來OR
- 將登入iframe放在網頁上但使其不可見
- 使用CSS指標事件和不透明度屬性將用於網站的點選指向社交登入按鈕
參考文獻
[1] An XSS on Facebook via PNGs & Wonky Content Types
fin1te.net/articles/xs…
[2] Encoding web shells in PNG IDAT chunks
www.idontplaydarts.com/2012/06/enc…
[3] Scriptless attacks
www.nds.rub.de/media/emma/…
[4] CSS attribute value selector
www.w3schools.com/cssref/sel_…
[5] CSS content attribute
www.w3schools.com/cssref/pr_g…
[6] CSS data theft
www.owlfolio.org/htmletc/css…
[7] XSS without HTML: Client-Side Template Injection with AngularJS
blog.portswigger.net/2016/01/xss…
[8] cssText Web API MDN
developer.mozilla.org/en-US/docs/…
[9] AngularJS
angularjs.org/
[10] HTTP Request Smuggling
www.cgisecurity.com/lib/HTTP-Re…
[11] Cache poisoning
www.owasp.org/index.php/C…
[12] Privacy and the :visited selector
developer.mozilla.org/en-US/docs/…
[13] Gone In Six Characters: Short URLs Considered Harmful for Cloud Services
freedom-to-tinker.com/blog/vitaly…
[14] Critical vulnerabilities in JSON Web Token libraries
auth0.com/blog/critic…
[15] Cert tests Android apps
securityaffairs.co/wordpress/2…
[16] The target=_blank attack
medium.com/@jitbit/tar…
[17] window.opener
developer.mozilla.org/en/docs/Web…
[18] Rowhammer
googleprojectzero.blogspot.de/2015/03/exp…
[19] Rowhammer.js
arxiv.org/abs/1507.06…
[20] Browser autofill phishing
github.com/anttiviljam…
[21] A breakdown of the new SAML authentication bypass vulnerability
developer.okta.com/blog/2018/0…
[22] Google YOLO
blog.innerht.ml/google-yolo…