1. 程式人生 > >CSRF(跨站點偽造請求)

CSRF(跨站點偽造請求)

  CSRF是Web應用程式的一種常見漏洞,其攻擊特性是危害性大但非常隱蔽,尤其是在大量Web 2.0技術的應用背景下,攻擊者完全可以在使用者毫無察覺的情況下發起CSRF攻擊。本文將對其基本特性、攻擊原理、攻擊分類、檢測方法及防範手段做一個系統的闡述,並列舉攻擊例項。

 1. CSRF漏洞簡介

  CSRF(Cross-Site Request Forgery,跨站點偽造請求)是一種網路攻擊方式,該攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求傳送給受攻擊站點,從而在未授權的情況下執行在許可權保護之下的操作,具有很大的危害性。具體來講,可以這樣理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義傳送惡意請求,對伺服器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義傳送郵件、發訊息,盜取你的賬號,新增系統管理員,甚至於購買商品、虛擬貨幣轉賬等。
  CSRF攻擊方式並不為大家所熟知,實際上很多網站都存在CSRF的安全漏洞。早在2000年,CSRF這種攻擊方式已經由國外的安全人員提出,但在國內,直到2006年才開始被關注。2008年,國內外多個大型社群和互動網站先後爆出CSRF漏洞,如:百度HI、NYTimes.com(紐約時報)、Metafilter(一個大型的BLOG網站)和YouTube等。但直到現在,網際網路上的許多站點仍對此毫無防備,以至於安全業界稱CSRF為“沉睡的巨人”,其威脅程度由此“美譽”便可見一斑。

 2. CSRF攻擊原理及例項

 CSRF攻擊原理

  CSRF攻擊原理比較簡單,如圖1所示。其中Web A為存在CSRF漏洞的網站,Web B為攻擊者構建的惡意網站,User C為Web A網站的合法使用者。
這裡寫圖片描述
    圖1 CSRF攻擊原理

  1. 使用者C開啟瀏覽器,訪問受信任網站A,輸入使用者名稱和密碼請求登入網站A;
  2. 在使用者資訊通過驗證後,網站A產生Cookie資訊並返回給瀏覽器,此時使用者登入網站A成功,可以正常傳送請求到網站A;
  3. 使用者未退出網站A之前,在同一瀏覽器中,開啟一個TAB頁訪問網站B;
  4. 網站B接收到使用者請求後,返回一些攻擊性程式碼,併發出一個請求要求訪問第三方站點A;
  5. 瀏覽器在接收到這些攻擊性程式碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie資訊,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據使用者C的Cookie資訊以C的許可權處理該請求,導致來自網站B的惡意程式碼被執行。

 CSRF攻擊分類

  CSRF漏洞一般分為站外和站內兩種型別。

  CSRF站外型別的漏洞本質上就是傳統意義上的外部提交資料問題。通常程式設計師會考慮給一些留言或者評論的表單加上水印以防止SPAM問題(這裡,SPAM可以簡單的理解為垃圾留言、垃圾評論,或者是帶有站外連結的惡意回覆),但是有時為了提高使用者的體驗性,可能沒有對一些操作做任何限制,所以攻擊者可以事先預測並設定請求的引數,在站外的Web頁面裡編寫指令碼偽造檔案請求,或者和自動提交的表單一起使用來實現GET、POST請求,當用戶在會話狀態下點選連結訪問站外Web頁面,客戶端就被強迫發起請求。

  CSRF站內型別的漏洞在一定程度上是由於程式設計師濫用REQUESTPOST使_REQUEST等變數,程式除支援接收POST請求傳遞的引數外也支援接收GET請求傳遞的引數,這樣就會為攻擊者使用CSRF攻擊創造條件。一般攻擊者只要把預測的請求引數放在站內一個貼子或者留言的圖片連結裡,受害者瀏覽了這樣的頁面就會被強迫發起這些請求。

  CSRF攻擊例項

  下面以Axous 1.1.1 CSRF Add Admin Vulnerability(漏洞CVE編號:CVE-2012-2629)為例,介紹CSRF攻擊具體實施過程。

  Axous是一款網上商店應用軟體。Axous 1.1.1以及更低版本在實現上存在一個CSRF漏洞,遠端攻擊者可以通過構造特製的網頁,誘使該軟體管理員訪問,成功利用此漏洞的攻擊者可以新增系統管理員。利用此漏洞主要包含以下三個過程:

  1. 攻擊者構造惡意網頁。在實施攻擊前,攻擊者需要構造一個與正常新增管理員使用者基本一樣的網頁,在該惡意網頁中對必要的引數項進行賦值,並將該網頁的action指向正常新增管理員使用者時訪問的URL,核心程式碼如圖2所示;
  2. 攻擊者利用社會工程學誘使Axous系統管理員訪問其構造的惡意網頁;
  3. 執行惡意程式碼。當系統管理員訪問惡意網頁時,惡意程式碼在管理員不知情的情況下以系統管理員的合法許可權被執行,攻擊者偽造的管理員賬戶新增成功。

這裡寫圖片描述
    圖2 CSRF攻擊新增管理員核心程式碼

 3. CSRF 漏洞檢測

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

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

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

 4. CSRF漏洞防禦

  CSRF漏洞防禦主要可以從三個層面進行,即服務端的防禦、使用者端的防禦和安全裝置的防禦。

 4.1 服務端的防禦

  目前業界伺服器端防禦CSRF攻擊主要有三種策略:驗證HTTP Referer欄位,在請求地址中新增token並驗證,在HTTP頭中自定義屬性並驗證。下面分別對這三種策略進行簡要介紹。

  4.1.1 驗證HTTP Referer欄位

  根據HTTP協議,在HTTP頭中有一個欄位叫Referer,它記錄了該HTTP請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。比如某銀行的轉賬是通過使用者訪問http://bank.test/test?page=10&userID=101&money=10000頁面完成,使用者必須先登入bank. test,然後通過點選頁面上的按鈕來觸發轉賬事件。當用戶提交請求時,該轉賬請求的Referer值就會是轉賬按鈕所在頁面的URL(本例中,通常是以bank. test域名開頭的地址)。而如果攻擊者要對銀行網站實施CSRF攻擊,他只能在自己的網站構造請求,當用戶通過攻擊者的網站傳送請求到銀行時,該請求的Referer是指向攻擊者的網站。因此,要防禦CSRF攻擊,銀行網站只需要對於每一個轉賬請求驗證其Referer值,如果是以bank. test開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果Referer是其他網站的話,就有可能是CSRF攻擊,則拒絕該請求。

  4.1.2 在請求地址中新增token並驗證

  CSRF攻擊之所以能夠成功,是因為攻擊者可以偽造使用者的請求,該請求中所有的使用者驗證資訊都存在於Cookie中,因此攻擊者可以在不知道這些驗證資訊的情況下直接利用使用者自己的Cookie來通過安全驗證。由此可知,抵禦CSRF攻擊的關鍵在於:在請求中放入攻擊者所不能偽造的資訊,並且該資訊不存在於Cookie之中。鑑於此,系統開發者可以在HTTP請求中以引數的形式加入一個隨機產生的token,並在伺服器端建立一個攔截器來驗證這個token,如果請求中沒有token或者token內容不正確,則認為可能是CSRF攻擊而拒絕該請求。

  4.1.3. 在HTTP頭中自定義屬性並驗證

  自定義屬性的方法也是使用token並進行驗證,和前一種方法不同的是,這裡並不是把token以引數的形式置於HTTP請求之中,而是把它放到HTTP頭中自定義的屬性裡。通過XMLHttpRequest這個類,可以一次性給所有該類請求加上csrftoken這個HTTP頭屬性,並把token值放入其中。這樣解決了前一種方法在請求中加入token的不便,同時,通過這個類請求的地址不會被記錄到瀏覽器的位址列,也不用擔心token會通過Referer洩露到其他網站。

 4.2 使用者端的防禦

  對於普通使用者來說,都學習並具備網路安全知識以防禦網絡攻擊是不現實的。但若使用者養成良好的上網習慣,則能夠很大程度上減少CSRF攻擊的危害。例如,使用者上網時,不要輕易點選網路論壇、聊天室、即時通訊工具或電子郵件中出現的連結或者圖片;及時退出長時間不使用的已登入賬戶,尤其是系統管理員,應儘量在登出系統的情況下點選未知連結和圖片。除此之外,使用者還需要在連線網際網路的計算機上安裝合適的安全防護軟體,並及時更新軟體廠商釋出的特徵庫,以保持安全軟體對最新攻擊的實時跟蹤。

 4.3 安全裝置的防禦

  由於從漏洞的發現到補丁的釋出需要一定的時間,而且相當比例的廠商對漏洞反應不積極,再加之部分系統管理員對系統補丁的不夠重視,這些都給了攻擊者可乘之機。鑑於上述各種情況,使用者可以藉助第三方的專業安全裝置加強對CSRF漏洞的防禦。

  CSRF攻擊的本質是攻擊者偽造了合法的身份,對系統進行訪問。如果能夠識別出訪問者的偽造身份,也就能識別CSRF攻擊。研究發現,有些廠商的安全產品能基於硬體層面對HTTP頭部的Referer欄位內容進行檢查來快速準確的識別CSRF攻擊。圖3展示了這種防禦方式的簡圖。目前H3C公司的IPS產品採用了特殊技術,支援對部分常用系統的CSRF漏洞攻擊進行檢測和阻斷。

這裡寫圖片描述

    圖3 安全裝置傳統防禦方式

 5. 結束語

CSRF攻擊作為一種存在已久的攻擊方式,在大量的商業網站上都可以找出。對廣大系統維護者來說需要深入理解CSRF攻擊,並制定最適合當前系統的防禦方案,在不損害應用程式效能的前提下,提高系統安全性;而對即將開發的網路應用系統來說,深刻理解CSRF的危害性,在設計階段就考慮到對CSRF的防範將會取得事半功倍的效果。

相關推薦

CSRF站點偽造請求

  CSRF是Web應用程式的一種常見漏洞,其攻擊特性是危害性大但非常隱蔽,尤其是在大量Web 2.0技術的應用背景下,攻擊者完全可以在使用者毫無察覺的情況下發起CSRF攻擊。本文將對其基本特性、攻擊原理、攻擊分類、檢測方法及防範手段做一個系統的闡述,並列舉

web安全2-- CSRF站點請求偽造

CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。  一、CSRF攻擊原理 CSRF攻擊原理比較簡單,如圖1所示。其中W

ASP.NET MVC與CSRF站腳本攻擊

轉移 off end gis 帳戶 blank 表單 密碼 message CSRF 一 何為CSRF CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CS

你已經不再需要 CSRF站點請求偽造

本文作者:Scott Helme,安全研究員,國際演講者和本部落格的作者。也是 securityheaders.co

django 淺談CSRFCross-site request forgery請求偽造 淺談CSRFCross-site request forgery請求偽造寫的非常好

淺談CSRF(Cross-site request forgery)跨站請求偽造(寫的非常好) 本文目錄 一 CSRF是什麼 二 CSRF攻擊原理 三 CSRF攻擊防範

django 淺談CSRFCross-site request forgery請求偽造

指向 其他 喜歡 發生 過期 hid 偽造 有一個 結束 一 CSRF是什麽 二 CSRF攻擊原理 三 CSRF攻擊防範 回到目錄 一 CSRF是什麽 CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Att

CSRF請求偽造詳細說明

Cross-Site Request Forgery(CSRF),中文一般譯作跨站請求偽造。經常入選owasp漏洞列表Top10,在當前web漏洞排行中,與XSS和SQL注入並列前三。與前兩者相比,CSRF相對來說受到的關注要小很多,但是危害卻非常大。 通常情況下,有三

spring boot實戰之CSRF請求偽造

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。攻擊通過在授權使用者訪問的頁面中包含連結或者

yii2中自定義表單或者post請求 csrf驗證站偽請求

第一種解決辦法是關閉Csrf public function init(){ $this->enableCsrfValidation = false; } 第二種解決辦法是在form表單中加入csrf隱藏域表單。表單名根據我們的cookie設定

csrf_token偽造

render 響應 相關 $.ajax 依賴 sta .html 實現 print Django跨站請求偽造 跨站請求偽造(Cross-site request forgery),也被稱為one-click attack或者session riding

AJAX域訪問get、post請求

1、JSONP實現跨域get請求(無論請求方式是get,post或者是put等別的請求,最終都會被預設以get請求傳送) <script type="text/javascript"> $.ajax({ url:"http://crossdomain.

java 模擬http請求域解決方案

1.需要引入的jar包 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId

node.js連線資料庫登入註冊,修改使用者頁面的ajax請求

首先給大家看一下目錄結構,結構如下: index.html 首頁(顯示所有的使用者資訊) login.html 登入頁 register.html 註冊頁 db.js 配置連結資料庫引數 dbhelper.js 資料庫連線池(向外暴露方法) test.js 邏輯js(使用方法:nod

web安全1-- XSS站指令碼攻擊

XSS攻擊,通常指黑客通過“html注入” 篡改了網頁,插入了惡意的指令碼,從而在使用者瀏覽網頁的時候,控制使用者瀏覽器的一種攻擊。其原理是攻擊者向有XSS漏洞的網站中輸入(傳入)一段惡意的HTML程式碼,當其它使用者瀏覽該網站時,這段HTML程式碼會自動執行,從而達到攻擊的目的。如,盜取使用者Co

CORS域資源共享

簡介 跨域資源共享的主要思想就是使用自定義的HTTP頭部讓瀏覽器與伺服器進行溝通,從而決定響應式是成功還是失敗,它允許了瀏覽器向跨源伺服器傳送請求,克服了同源的限制。 CORS需要瀏覽器和伺服器同時支援,所有瀏覽器目前都支援,IE需要10以上。在整個通訊過程中,不需要使用者參與,都是由瀏覽器

java服務端解決js域的問題 CORS域資源共享 的配置

nginx相容跨域上傳 相容情況: 各種新版本的ie10,firefox,opera,safari,chrome以及移動版safari和Android瀏覽器 ie9及一下版本請使用flash方式來相容 通過OPTIONS請求握手一次的方式實現跨根域傳送請求,需要服務端配置

zoj 1648 Circuit Board立相交實驗

題意:給出n條邊,問:如果有相交,輸出burned!,沒有輸出ok!,注意下,這題還說了,相交於端點是不算交叉的。  我們分兩步確定兩條線段是否相交:  (1)快速排斥試驗    設以線段 P1P2 為對角線的矩形為R, 設以線段 Q1Q2 為對角線的矩

自定義介面內部類的一個簡單的使用類傳值

實現使用介面內部類進行跨類傳值 定義一個普通的Java類: package com.example.shiyan; public class haitao { private static haitao instance; hh

自定義介面內部類的兩個具體應用類傳值

個人理解,Android開發中的介面內部類和 C#中委託和事件的作用是一樣的 觸發某類中定義的事件後,會執行所有繫結到這個事件上的方法,這些方法在其它不同的類中 例子一: 例子二:(使用自定義介面內部類實現主Acti

Ajax練習二原生JS非同步請求

(二)JS非同步請求   這裡我使用的編譯器是WebStorm(不管用哪個編譯器我們的最終結果都是一樣的就是要請求後臺的資料,隨後將後臺返回的結果展示在介面中),後臺的配置請參考Ajax練習一(配置J