0x01 CSRF的攻擊原理html
CSRF 百度上的意思是跨站請求僞造,其實最簡單的理解咱們能夠這麼講,假如一個微博關注用戶的一個功能,存在CSRF漏洞,那麼此時黑客只須要僞造一個頁面讓受害者間接或者直接觸發,而後這個惡意頁面就能夠使用受害者的微博權限去關注其餘的人微博帳戶。CSRF只要被批量化利用起來其危害仍是比較大的。ajax
舉個例子,好比筆者在新浪首頁執行了一次搜索請求。json
能夠看到這裏有個Referer的信息,Referer也就是請求來源地址,也就是說這個請求是從http://www.sina.com.cn這裏發起的。而後去掉Referer,去執行這個請求,發現這個請求仍然能夠進行正常的搜索,那麼就說明這個請求沒有判斷請求來源也就是Referer,在請求頭部也沒有發現存在token的跡象,那麼筆者能夠判斷此處存在CSRF,這個CSRF是沒有任何危害的,可是換成其餘請求呢?好比加關注,修改資料或者其餘敏感操做呢?服務器
0x02 CSRF漏洞成因及分類post
1)第一種測試
請求直接是個GET請求,而後請求中沒有token驗證參數,而後還有一個固定的變量能夠被控制。這種是比較常見的一種CSRF漏洞。這種漏洞的檢測方法很簡單:網頁操做某功能,抓包後,若是發現知足上面條件,而後再去頁面測試下,基本就能夠肯定存在不存在CSRF漏洞了。spa
實例.net
某微博站曾存在的一個漏洞,關注用戶微博的請求以下(其中key的值是每個用戶獨有惟一的):code
1
|
http://***.****.com/reflow/follow?resType=json&isAjax=1&key=226216966
|
筆者根據上面的測試方法進行測試發現無token,可是對referer作了校驗,可是csrf的狀況仍是存在的,由於被攻擊者的referer每每是和CSRF漏洞的GET請求是同域的,因此除非驗證的至關的嚴格,通常狀況下的驗證是無效的,此類的站點輸入微博類的站點,用戶能夠隨隨便便在上面發送微博,微博中能夠帶上該連接,只要受害者點擊便可關注黑客的微博了。orm
2)第二種
請求是個POST請求,post請求中沒有token參數,而後請求也沒有驗證referer信息。這種是存在CSRF狀況最多的一種。這種漏洞的檢測方法也很簡單:網頁操做某功能,抓包後,若是發現沒有token等參數,而後就將referer信息設置爲空,再次發包請求,若是請求成功了,就說明這裏有CSRF漏洞。
若是有token等參數,能夠嘗試將token去掉,而後再將referer也去掉,進行驗證。這種CSRF漏洞的利用,是須要在本身服務器構造一個form表單的,而後將服務器form表單的URL做爲CSRF攻擊進行利用的,或者用js代碼生成form表單,或者用ajax實現。
實例
某微博主頁刷粉絲,利用poc以下:
1
2
3
4
5
6
7
8
9
10
|
<
html
>
<
body
>
<
form
name
=
"px"
method
=
"post"
action
=
"http://widget.******.com/plugin/followbutton/addfans"
>
<
input
type
=
"text"
name
=
"page_id"
value
=
"60185****"
>
</
form
>
<
script
>
document.px.submit();
</
script
>
</
body
>
</
html
>
|
3)第三種
請求是POST,post請求中沒有token參數,可是驗證了referer信息。然而能夠將post請求改寫爲get請求,而後經過第一種狀況下的那個方法利用。這種的檢測方法,就是先執行了第二種的驗證後,發現有對CSRF進行防護。而後將post請求改寫爲GET請求,發現仍然能夠成功執行。漏洞成因是由於服務器端接收請求參數的時候,沒有嚴格的用$_POST 而是用的相似於 $_REQUEST這種post,get請求的參數均可以接收的寫法。