CSRF(Cross-Site Request Forgery)是指跨站請求偽造,也常常被稱為“One Click Attack”或者“Session Riding”,通常縮寫為CSRF或是XSRF。
與XSS跨站腳本攻擊相比,兩者攻擊方式完全不同,雖然CSRF攻擊不太流行,但卻更加難以防范,所以被認為CSRF比XSS更具危險性,CSRF在業內具有“蘇醒的巨人”的稱號。
可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義進行某些非法操作。CSRF能夠使用你的賬戶發送郵件,獲取你的敏感信息,甚至盜走你的財產。
一、CSRF攻擊原理
比如:
(1)你正在訪問一個銀行的網站,且已經登錄,相當于,你已經和這個網站建立了會話;
(2)這時,你的朋友,或者網友(hacker),發來了一條鏈接(是這個網站轉帳時請求的鏈接),而且與你所登錄的是同一家網絡銀行,你可能認為這個網站是安全的,然而當你打開這個url后,你賬戶中的余額可能會全部丟失。
(3)因為你的瀏覽器正處于與此網站的會話之中,那么任何操作都是合法的,因此,就可以成功轉賬。
正常的轉賬,會發送如下請求:http://www.secbug.org/pay.jsp?user=xxser&money=1000
.
攻擊者操作,則會將此url改為:http://www.secbug.org/pay.jsp?user=hack&money=10000
.
(4)然后發給你,點擊后,其實是你自己親手造成的,并不是有人破解了你的賬戶密碼或者是銀行Web服務器被入侵導致的。
以上表明兩個重點:
(1)CSRF的攻擊建立在瀏覽器與Web服務器的會話中;
(2)欺騙用戶訪問URL。
二、CSRF攻擊場景
1. GET:
蠕蟲攻擊,以金字塔的形式傳播,速度非常快(實際中,XSS與CSRF通常是一起出現的)。
2. POST
也會發生攻擊,只不過比get方式多了點代碼。
3. 瀏覽器Cookie機制
訪問同域下的頁面時,無論時Session Cookie還是本地Cookie,Cookie都將被一起發送。
訪問不同域名下的頁面時,各個瀏覽器的Cookie機制不同,有的則不會發送Cookie,就不會造成CSRF攻擊;有的則會發送,則攻擊就會成功。
三、預防跨站請求偽造
在預防CSRF攻擊時,不像其他漏洞那樣復雜,你只需要在關鍵部分增加一些小操作就可以防御CSRF攻擊。
1. 二次確認
在調用某些功能時進行二次驗證,如:刪除用戶時,產生一個對話框,提示“確定刪除用戶嗎?”。轉賬操作時,要求用戶輸入二次密碼。
2. Token認證
Token即標志、記號的意思,在IT領域也叫做令牌。
CSRF攻擊成功的兩個要素:
(1)攻擊者可得知URL的所有參數項,并了解其含義;
(2)誘導用戶訪問構造好的POC(意思應該是偽造的請求)。
步驟:即使用驗證碼驗證,Token是一個不需要輸入的驗證碼。
- 每當用戶登錄后會隨機生成一段字符串,并且存儲在session中。
- 在敏感操作中加入隱藏標簽,value即為Session中保存的字符串,如:
<input type="hiden" name="token" value="3a8d9fx0s8v8" />
,表單提交的時候就會帶上token進行驗證。 - 如果為GET/POST請求,考慮使用在Cookie中存儲Token,只要向服務器進行請求,那么一般都會帶入Cookie,即可進行后面的驗證。
- 提交請求后,服務器端取出Session中的字符串與提交的Token對比,如果一致,則認為是正常請求,否則可能是CSRF攻擊。
- 更新Token值。
有人認為:CSRF其實就是XSS攻擊的一種“縮小版”。
所以在防范CSRF時,首先要確定網站是否存在XSS漏洞,如果網站存在XSS漏洞,那么防范CSRF是沒有任何意義的。