「譯」Web 安全高級主題

原文地址:Advanced web security topics php

前言

(最後更新時間:2018年2月28日)這篇文章討論了我到目前爲止遇到的網絡安全問題 。這是一項正在進行的工做,我將不斷更新。 帖子標題包括「高級」,由於這裏討論的主題涉及聰明的,不平凡的黑客。下面咱們直接進入正題。css

在圖像中使用錯誤的MIME類型來提供HTML

摘要:攻擊者將圖像上傳到包含HTML和Javascript的受信任網站,但欺騙網站將圖像做爲HTML文檔提供。
攻擊步驟(參考下圖):html

  1. 攻擊者使用嵌入式html 建立圖像
  2. 攻擊者上傳圖像到網站,圖像會被接受。由於語法是有效的。
  3. 攻擊者欺騙網站用戶去訪問圖像,而且欺騙網站以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。
攻擊步驟(參考下圖):android

  1. 在當前網頁上查找敏感內容,如:
  2. 將惟一字體應用於不一樣的字符
  3. 調整父容器的大小,直到出現滾動條
  4. 爲每一個尺寸使用從攻擊者服務器上的不一樣的字體


來自  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聲明。
git


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或回退策略是常見的用例。angularjs

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的內容。該漏洞利用工做過於簡單,以下所示:github

POST U1
Content-Length: 0
Content-Length: 123
GET U2
….web

因爲Content-Length語句存在衝突,Web代理可能會認爲POST內容與其後面的Web服務器不一樣,所以Web服務器可能會爲U2服務,但代理可能會將U2的內容存儲在U1下。
做者討論了更多的漏洞;不管如何都值得一讀!shell

找出用戶訪問過的網站

惡意網頁能夠在舊版本的流行瀏覽器中找到用戶訪問過的網站,幸運的是,這彷佛 不在可能[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,檢查網站請求的訪問類型,並能夠授予(或不授予)該訪問權限。

這個漏洞:

  1. 由惡意網頁組成
  2. 將社交網絡登陸頁面嵌入iframe中
  3. 在iframe上放置另外一個HTML元素,將其隱藏起來OR
  4. 將登陸iframe放在網頁上但使其不可見
  5. 使用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…

相關文章
相關標籤/搜索