Hi 朋友們!
大家都知道CSRF攻擊,如果不知道可看下OWASP的介紹,使用burp suite裡自帶的增強工具(engagement tools)可以很容易地構造各種基本的CSRF攻擊POC,包括通過XHR請求進行的CSRF攻擊。
在這篇文章裡,我將要討論下我經常碰到的一些CSRF攻擊場景,看到社群裡很多研究者對這個攻擊場景都很好奇,我將盡可能的把它說清楚。
這個技巧可用在使用JSON格式資料進行post請求的情況下。比如{“name”:”test”, “email”:”victim.com”},有兩種攻擊場景:
場景1:
伺服器接收JSON格式的資料但是不驗證Content-type。
場景2:
伺服器接收JSON格式的資料,也驗證Content-type,比如:Content-type得是 application/json。
說明:這種CSRF攻擊只能用在網站應用只使用json格式的資料或者Content-type 為application/json,以及檢查資料格式的情況下,如果有任何其它的csrf token或者referer檢查,那麼這種攻擊將不會奏效。
攻擊場景1:
使用Fetch請求就可以完成攻擊。就像我們上面說的一樣,這種場景下伺服器只檢查post的資料的格式是否正確,只要資料格式正確應用就會接受請求,即使Content-type被設定為text/plain也無妨。
現在假設我們需要把下面的資料傳送給應用:{“name”:”attacker”,”email”:”attacker@gmail.com”}
新方法---使用Fetch:
JSON CSRF POC
fetch('http://vul-app.com';,
{method: 'POST', credentials: 'include', headers: {'Content-Type':
'text/plain'}, body: '{"name":"attacker","email":"attacker.com"}'});
來源:http://research.rootme.in/forging-content-type-header-with-flash
以前的方法----使用form:
使用form構造JSON資料等然後發起post請求:
JSON CSRF POC
這個html檔案將發起post請求,使用了JSON格式的資料和一些額外填充的資料。如果應用不會被額外的填充資料影響(我所見的大多數都不會)。如果會被影響,那麼還有第二種選擇(使用上面的Fetch方法)。
來源:http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html
攻擊場景2:
如果應用檢查Content-type和資料格式,那麼可以藉助flash和307重定向來實現攻擊。
需求:
精心構造的Flash檔案。
crossdomain XML檔案。
含有307狀態的PHP檔案。
精心構造的Flash檔案:
flash檔案(.swf)包含著json格式的資料(攻擊者想要傳送給目標的資料),並連結到某個放在伺服器上的php檔案。
這裡可以下載SWF檔案,你可以下載並根據你的意願編輯內容,我使用了FFDec來在Windows上編輯編譯flash檔案,你可以根據你的系統環境選擇其它的工具。
crossdomain XML檔案:
這個檔案應該放在攻擊者自己網站的主目錄下,所以flash檔案可以向攻擊者的主機發起請求。
說明:如果flash檔案和php跳轉頁在同一個域名下,那麼你就不需要crossdomain檔案了。
重定向的PHP檔案:
// redirect automatically
header("Location: https://victim.com/user/endpoint/";, true, 307);
?>
Flash檔案將會請求該PHP檔案,這將會進行307重定向,定向到上面提到的應用目標端點(endpoint)。因為307是特殊跳轉,它將會在跳轉的同時,把從flash檔案中得到的JSON資料post給目標,這樣CSRF攻擊就會成功執行。
這裡是hackone上利用該方法的一個漏洞報告#44146,漏洞作者是@avlidienbrunn。說明:因為是基於flash,所以瀏覽器需要安裝有flash,現在的瀏覽器一般都裝有flash,但未來可能就不會這樣了。
更新說明1:
Evgeniy編輯並編譯了Flash檔案,這樣可以通過URL引數來傳輸所有的資訊包括JSON資料,php檔案&目標端點(endpoint)。這樣不僅將複雜的攻擊步驟變簡單了,而且省去了了場景2中每次都得重新編譯flash檔案的複雜工作。
這裡是更新後的flash以及其它檔案,作者是Evgeniy。
更新說明2:
對於場景1,在某些情況下伺服器可能會因為額外的填充資料而拒絕請求,但是還有其它更好的方法,使用ftech或者XHR請求,我們可以無限制的提交JSON格式的資料以及新增POC程式碼。
感謝Prakash讓我知道了這點。
本文由看雪翻譯小組 Limp 編譯,來源Geekboy's blog 轉載請註明來自看雪社群