CSRF(Cross-site request forgery)跨站請求僞造,因爲目標站無token/referer限制,致使攻擊者能夠用戶的身份完成操做達到各類目的。根據HTTP請求方式,CSRF利用方式可分爲兩種。javascript
這種類型的CSRF通常是因爲程序員安全意識不強形成的。GET類型的CSRF利用很是簡單,只須要一個HTTP請求,因此,通常會這樣利用:php
<img src=http://wooyun.org/csrf.php?xx=11 />
以下圖,在訪問含有這個img的頁面後,成功向http://wooyun.org/csrf.php?xx=11發出了一次HTTP請求。因此,若是將該網址替換爲存在GET型CSRF的地址,就能完成攻擊了。html
烏雲相關案例:java
http://wooyun.org/bugs/wooyun-2010-023783程序員
http://wooyun.org/bugs/wooyun-2010-027258 (還未公開)web
這種類型的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
過基礎認證的CSRF(經常使用於路由器):
POC:
<img src=http://admin:admin@192.168.1.1 />
加載該圖片後,路由器會給用戶一個合法的SESSION,就能夠進行下一步操做了。
烏雲相關案例:
WooYun: TP-LINK路由器CSRF,可幹許多事(影響使用默認密碼或簡單密碼用戶)
針對CSRF的防範,有如下幾點要注意:
CSRF攻擊的過程,每每是在用戶不知情的狀況下構造網絡請求。因此若是使用驗證碼,那麼每次操做都須要用戶進行互動,從而簡單有效的防護了CSRF攻擊。
可是若是你在一個網站做出任何舉動都要輸入驗證碼會嚴重影響用戶體驗,因此驗證碼通常只出如今特殊操做裏面,或者在註冊時候使用
常見的互聯網頁面與頁面之間是存在聯繫的,好比你在www.baidu.com應該是找不到通往www.google.com的連接的,再好比你在論壇留言,那麼無論你留言後重定向到哪裏去了,以前的那個網址必定會包含留言的輸入框,這個以前的網址就會保留在新頁面頭文件的Referer中
經過檢查Referer的值,咱們就能夠判斷這個請求是合法的仍是非法的,可是問題出在服務器不是任什麼時候候都能接受到Referer的值,因此Refere Check 通常用於監控CSRF攻擊的發生,而不用來抵禦攻擊。
目前主流的作法是使用Token抵禦CSRF攻擊。下面經過分析CSRF 攻擊來理解爲何Token可以有效
CSRF攻擊要成功的條件在於攻擊者可以預測全部的參數從而構造出合法的請求。因此根據不可預測性原則,咱們能夠對參數進行加密從而防止CSRF攻擊。
另外一個更通用的作法是保持原有參數不變,另外添加一個參數Token,其值是隨機的。這樣攻擊者由於不知道Token而沒法構造出合法的請求進行攻擊。
Token 使用原則
Token要足夠隨機————只有這樣纔算不可預測 Token是一次性的,即每次請求成功後要更新Token————這樣能夠增長攻擊難度,增長預測難度 Token要注意保密性————敏感操做使用post,防止Token出如今URL中
若是同域下存在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