作者:
VIP
·
2013/07/02 12:24
0x00 簡要介紹
CSRF(Cross-site request forgery)跨站請求偽造,由於目標站無token/referer限制,導致攻擊者可以使用者的身份完成操作達到各種目的。根據HTTP請求方式,CSRF利用方式可分為兩種。
0x01 GET型別的CSRF
這種型別的CSRF一般是由於程式設計師安全意識不強造成的。GET型別的CSRF利用非常簡單,只需要一個HTTP請求,所以,一般會這樣利用:
<img src=http://wooyun.org/csrf.php?xx=11 />
如下圖,在訪問含有這個img的頁面後,成功向http://wooyun.org/csrf.php?xx=11發出了一次HTTP請求。所以,如果將該網址替換為存在GET型CSRF的地址,就能完成攻擊了。
烏雲相關案例:
http://wooyun.org/bugs/wooyun-2010-023783
http://wooyun.org/bugs/wooyun-2010-027258 (還未公開)
0x02 POST型別的CSRF
這種型別的CSRF危害沒有GET型的大,利用起來通常使用的是一個自動提交的表單,如:
<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
訪問該頁面後,表單會自動提交,相當於模擬使用者完成了一次POST操作。
烏雲相關案例:
http://wooyun.org/bugs/wooyun-2010-026622
http://wooyun.org/bugs/wooyun-2010-022895
0x03 其他猥瑣流CSRF
過基礎認證的CSRF(常用於路由器):
POC:
<img src=http://admin:[email protected] />
載入該圖片後,路由器會給使用者一個合法的SESSION,就可以進行下一步操作了。
烏雲相關案例:
WooYun: TP-LINK路由器CSRF,可幹許多事(影響使用預設密碼或簡單密碼使用者)
0x04 如何修復
針對CSRF的防範,有以下幾點要注意:
關鍵操作只接受POST請求
驗證碼
CSRF攻擊的過程,往往是在使用者不知情的情況下構造網路請求。所以如果使用驗證碼,那麼每次操作都需要使用者進行互動,從而簡單有效的防禦了CSRF攻擊。
但是如果你在一個網站作出任何舉動都要輸入驗證碼會嚴重影響使用者體驗,所以驗證碼一般只出現在特殊操作裡面,或者在註冊時候使用
檢測refer
常見的網際網路頁面與頁面之間是存在聯絡的,比如你在www.baidu.com應該是找不到通往www.google.com的連結的,再比如你在論壇留言,那麼不管你留言後重定向到哪裡去了,之前的那個網址一定會包含留言的輸入框,這個之前的網址就會保留在新頁面標頭檔案的Referer中
透過檢查Referer的值,我們就可以判斷這個請求是合法的還是非法的,但是問題出在伺服器不是任何時候都能接受到Referer的值,所以Refere Check 一般用於監控CSRF攻擊的發生,而不用來抵禦攻擊。
Token
目前主流的做法是使用Token抵禦CSRF攻擊。下面透過分析CSRF 攻擊來理解為什麼Token能夠有效
CSRF攻擊要成功的條件在於攻擊者能夠預測所有的引數從而構造出合法的請求。所以根據不可預測性原則,我們可以對引數進行加密從而防止CSRF攻擊。
另一個更通用的做法是保持原有引數不變,另外新增一個引數Token,其值是隨機的。這樣攻擊者因為不知道Token而無法構造出合法的請求進行攻擊。
Token 使用原則
Token要足夠隨機————只有這樣才算不可預測
Token是一次性的,即每次請求成功後要更新Token————這樣可以增加攻擊難度,增加預測難度
Token要注意保密性————敏感操作使用post,防止Token出現在URL中
0x05 測試CSRF中注意的問題
如果同域下存在xss的話,除了驗證碼,其他的方式都無法防禦這個問題。
有個程式後端可能是用REQUEST方式接受的,而程式預設是POST請求,其實改成GET方式請求也可以傳送過去,存在很嚴重的隱患。
當只採用refer防禦時,可以把請求中的修改成如下試試能否繞過:
原始refer:http://test.com/index.php
測試幾種方式(以下方式可以透過的話即可能存在問題):
http://test.com.attack.com/index.php
http://attack.com/test.com/index.php
[空]
refer為空構造的方法:
由於瀏覽器特性,跨協議請求時不帶refer(Geckos核心除外),比如https跳到http,如果https環境不好搭建的話,ftp其實也是可以的:)
<iframe src="data:text/html,<script src=http://www.baidu.com></script>"> //IE不支援
利用 xxx.src='javascript:"HTML程式碼的方式"'; 可以去掉refer,IE8要帶。
<iframe id="aa" src=""></iframe>
<script>
document.getElementById("aa").src='javascript:"<html><body>wooyun.org<scr'+'ipt>eval(你想使用的程式碼)</scr'+'ipt></body></html>"';
</script>
//來自於二哥gainover
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!