天天看點

CSRF/XSRF 跨站請求僞造攻擊

簡介

CSRF(Cross-site request forgery)​

​跨站請求僞造​

​:攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經擷取的注冊憑證,繞過背景的使用者驗證,達到冒充使用者對被攻擊的網站執行某項操作的目的。

一個典型的CSRF攻擊有着如下的流程:

  1. 受害者登入a.com,并保留了登入憑證(Cookie)。
  2. 攻擊者引誘受害者通路了b.com。
  3. b.com 向 a.com 發送了一個請求:a.com/act=xx。浏覽器會預設攜帶a.com的Cookie。
  4. a.com接收到請求後,對請求進行驗證,并确認是受害者的憑證,誤以為是受害者自己發送的請求。
  5. a.com以受害者的名義執行了act=xx。
  6. 攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者,讓a.com執行了自己定義的操作。

常見的攻擊類型

GET類型的CSRF

GET類型的CSRF利用非常簡單,隻需要一個HTTP請求,一般會這樣利用:

<img src="http://bank.example/withdraw?amount=10000&for=hacker" >      

在受害者通路含有這個img的頁面後,浏覽器會自動向​

​http://bank.example/withdraw?account=xiaoming&amount=10000&for=hacker​

​發出一次HTTP請求。bank.example就會收到包含受害者登入資訊的一次跨域請求。

POST類型的CSRF

這種類型的CSRF利用起來通常使用的是一個自動送出的表單,如:

<form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
</form>
<script>.forms[0].submit();</script>      

通路該頁面後,表單會自動送出,相當于模拟使用者完成了一次POST操作。

連結類型的CSRF

連結類型的CSRF并不常見,比起其他兩種使用者打開頁面就中招的情況,這種需要使用者點選連結才會觸發。這種類型通常是在論壇中釋出的圖檔中嵌入惡意連結,或者以廣告的形式誘導使用者中招,攻擊者通常會以比較誇張的詞語誘騙使用者點選,例如:

<a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
  重磅消息!!
<a/>      

由于之前使用者登入了信任的網站A,并且儲存登入狀态,隻要使用者主動通路上面的這個PHP頁面,則表示攻擊成功。

CSRF的特點

  • 攻擊一般發起​

    ​在第三方網站​

    ​,而不是被攻擊的網站。被攻擊的網站無法防止攻擊發生。
  • 攻擊​

    ​利用受害者在被攻擊網站的登入憑證,冒充受害者送出操作​

    ​;而不是直接竊取資料。
  • 整個過程攻擊者​

    ​并不能擷取到受害者的登入憑證,僅僅是“冒用”​

    ​。
  • 跨站請求可以用各種方式:圖檔URL、超連結、CORS、Form送出等等。部分請求方式可以直接嵌入在第三方論壇、文章中,難以進行追蹤。

CSRF通常是跨域的,因為外域通常更容易被攻擊者掌控。但是如果本域下有容易被利用的功能,比如可以發圖和連結的論壇和評論區,攻擊可以直接在本域下進行,而且這種攻擊更加危險。

防護政策

CSRF通常從第三方網站發起,被攻擊的網站無法防止攻擊發生,隻能通過增強自己網站針對CSRF的防護能力來提升安全性。

上文中講了CSRF的兩個特點:

  1. CSRF(通常)發生在第三方域名。
  2. CSRF攻擊者不能擷取到Cookie等資訊,隻是使用。

針對這兩點,我們可以專門制定防護政策,如下:

  1. 同源檢測
  2. Samesite Cookie
  1. CSRF Token
  2. 雙重Cookie驗證