CSRF

  • General
黑客獲得用戶有效的cookie,從黑客網站僞造用戶請求,在用戶認證服務器上非法操作。
  • 解決方案
1. Origin & Referer headers
Referer 從哪個頁面鏈接過來的。
2. 改變狀態的操作用POST,不能使用GET
3. CSRF Token
3.1 實現
session建立時生成CSRF Token,存儲在session中,session結束後失效。可使用base64或者256-bit做哈希加密,使用java.security.SecureRandom類來生成token。
很多框架支持CSRF Token,java可使用OWASP CSRFGuard,有相應的library支持。
CSRF token使用java.security.SecureRandom類生成。

3.2 傳統CSRF token設置的缺陷
GET在url中設置CSRF Token。PUT在表單中設置CSRF Token。黑客能直接從url中獲得GET的CSRF Token,所以GET中不能使用CSRF Token。
Example for GET:
Example for POST:
<form action="/transfer.do" method="post">
<input type="hidden" name="CSRFToken"
value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWE...
wYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZ...
MGYwMGEwOA==">
</form>
黑客也可以通過referer中獲得csrf token。
3.3 優化設置
使用XMLHttpRequest,設置CSRF token到header中,不會在瀏覽器中留下數據。缺點是XMLHttpRequest適用於Ajax對局部頁面的異步刷新。不在瀏覽器中留下數據,會影響前進後退。

4. Double submit cookie
提交請求前,將cookie取出來加入request的參數中(POST或者URL),服務器端驗證兩者是否一致。

5. Encrypted token pattern
服務器根據userId,timestamp和nonce,生成加密token。此token放在隱藏filed中發送給客戶端。
客戶端的ajax請求中把此token帶在請求頭中。
服務器端解密此token,獲得的usrId和timestamp分別與當前用戶和時間比較。

6. REST Services:使用Custom Request Headers
X-Requested-With:XMLHttpRequest
AJAX等會自動加入此header,對UI的影響不大。在XMLHttpRequest中加入安全驗證信息。


  • CSRF攻擊實例
銀行網站A:通過GET請求完成轉賬,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危險網站B: <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
登錄A網站後,再訪問B,B使用A的有效token完成轉賬。

  • Background
瀏覽器同源策略 same-origin policy
如果不同源(協議,域名,端口),將受到限制:
無法訪問cookie,local storage
無法讀取response
無法讀取dom
Ajax請求不能發送


由於nginx不支持.htaccess,所以,從這個方面直接去防止是行不通的,我們要通過修改配置文件來解決。
首先,我們找到需要防盜鏈的域名的conf文件,路徑:/usr/local/nginx/conf/vhost/,比如guance.com.conf。先備份下原文件,然後找到下面的部分:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires 30d;}
將它修改爲:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${valid_referers none blocked www.jb51.net jb51.net;if ($invalid_referer) {rewrite ^/ http://www.jb51.net/404.jpg;#return 404;}expires 30d;}
上面的內容,大家請根據個人的情況酌情修改,我這裏做基本的解釋:
第一行gif|jpg|jpeg|png……這些是您需要防止盜鏈的文件類型,您可以補充一些後綴類型;
第三行是你的網站的域名,就是說放行的域名,如果有多個,請添加,注意空格;
第五行是給盜鏈看到的圖片,返回一個404.jpg,這個圖片源地址是要可以外鏈的哦,不然,別人看到的也就一個XX。
完成之後保存,上傳到原位置覆蓋,之後重啓下lnmp使之生效。
/root/lnmp restart
referer指令簡介
nginx模塊ngx_http_referer_module通常用於阻擋來源非法的域名請求.我們應該牢記,僞裝Referer頭部是非常簡單的事情,所以這個模塊只能用於阻止大部分非法請求.我們應該記住,有些合法的請求是不會帶referer來源頭部的,所以有時候不要拒絕來源頭部(referer)爲空的請求.
語法: referer_hash_bucket_size size;
默認值: referer_hash_bucket_size 64;
配置段: server, location
這個指令在nginx 1.0.5中開始出現.
Sets the bucket size for the valid referers hash tables. The details of setting up hash tables are provided in a separate document.
語法:     referer_hash_max_size size;
默認值:     referer_hash_max_size 2048;
配置段:     server, location
這個指令在nginx 1.0.5中開始出現.
Sets the maximum size of the valid referers hash tables. The details of setting up hash tables are provided in a separate document.
語法: valid_referers none | blocked | server_names | string ...;
默認值: —
配置段: server, location
指定合法的來源'referer', 他決定了內置變量$invalid_referer的值,如果referer頭部包含在這個合法網址裏面,這個變量被設置爲0,否則設置爲1.記住,不區分大小寫的.
參數說明
none
“Referer” 來源頭部爲空的情況
blocked
“Referer”來源頭部不爲空,但是裏面的值被代理或者防火牆刪除了,這些值都不以http://或者https://開頭.
server_names
“Referer”來源頭部包含當前的server_names(當前域名)
arbitrary string
任意字符串,定義服務器名或者可選的URI前綴.主機名可以使用*開頭或者結尾,在檢測來源頭部這個過程中,來源域名中的主機端口將會被忽略掉
regular expression
正則表達式,~表示排除https://或http://開頭的字符串.


  • 參考
CSRF攻擊實例的例子:






發佈了18 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章