參考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.htmlphp
CSRF,中文名字,跨站請求僞造,聽起來是否是和XSS差很少?區別就在於,CSRF並無盜取cookie而是直接利用。通俗的來講,就是攻擊者盜用了你的身份,在你不知情的狀況下執行一些違法操做,好比密碼修改,增長管理員,轉帳等敏感操做,危害很大。html
這裏已DVWA爲例,經過實例演示本身的學習過程。對DVWA陌生,而且想了解搭建一下的,能夠參考這篇文章 https://www.cnblogs.com/lxfweb/p/12678463.html mysql
打開DVWA,選擇CSRF,先從最低級別的low開始,查看源代碼web
經過查看發現,代碼中,password_new,password_conf,兩個參數沒有作任何防禦,這樣是至關危險的,若是攻擊者對受害者的這套程序很熟悉,能夠很輕易的構造連接,只要攻擊者一點擊這個連接,就會觸發CSRF攻擊。這是DVWA修改密碼的連接 http://www.test.com/DVWA-master/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change# 受害者只要帶登錄狀況下點擊這個連接(同一瀏覽器),密碼就會被修改成12345678,不過這連接一看就是改密碼的,基本不會有人點,因此須要我們精心構造一下,這裏以burpsuite演示。進去修改密碼頁面,抓包。sql
點擊Generate CSRF PoC burp會構造簡單的一個頁面,如圖瀏覽器
接下來,將構造的網址複製到瀏覽器,就會有一個按鈕,用戶點擊就會觸發CSRF攻擊,密碼被修改。安全
不過這個作法也有些粗糙,點擊完,會自動跳轉到,密碼修改的頁面,受害者就知道密碼被修改,服務器
參考上面提到的文章裏面的思路,那就是隱藏img src 標籤,再能夠精心構造一個錯誤頁面,讓受害者認爲這是一個無效的URL,但已經進行了CSRF攻擊。構造的代碼以下cookie
下面看一下中級的DVWA部分源代碼截圖,看作了什麼防護。ide
能夠看到,中級別的代碼檢查了保留變量 HTTP_REFERER(http包頭的Referer參數的值,表示來源地址)中是否包含SERVER_NAME(http包頭的Host參數,及要訪問的主機名)抓包看一下,通俗的講,不在本域的請求,就會拒絕訪問。
那該如何繞過呢,這個,只須要將我們構造的頁面名字改成受害者的主機名便可,如上圖,至於要將名字改成 www.test.com.html,就能夠繞過啦。
HTTP頭中有一個Referer字段,這個字段用以標明請求來源於哪一個地址。在處理敏感數據請求時,一般來講,Referer字段應和請求的地址位於同一域名下。可是這樣的方式,也是不安全的,上文中已經講解了,如何繞過Referer字段的檢查。
因爲CSRF的本質在於攻擊者欺騙用戶去訪問本身設置的地址,因此若是要求在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在cookie中,而且攻擊者沒法僞造的數據做爲校驗,那麼攻擊者就沒法再運行CSRF攻擊。這種數據一般是窗體中的一個數據項。服務器將其生成並附加在窗體中,其內容是一個僞隨機數。當客戶端經過窗體提交請求時,這個僞隨機數也一併提交上去以供校驗。正常的訪問時,客戶端瀏覽器可以正確獲得並傳回這個僞隨機數,而經過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個僞隨機數的值,服務端就會由於校驗token的值爲空或者錯誤,拒絕這個可疑請求。
在這種狀況下,攻擊者在不知道原密碼的狀況下是沒法進行CSRF攻擊的。