58金融的CSRF防禦實踐

2020-11-10 58技術


導讀

防範CSRF攻擊對於網際網路企業來說意義重大,本文結合58金融的實踐場景,旨在幫助大家共同提高nodejs服務的安全性。


背景

Web端的跨站點請求偽造(Cross Site Request Forgery)攻擊,簡稱CSRF攻擊,存在巨大的危害性。CSRF裡,攻擊者借用了受害者的身份對伺服器發送請求,對伺服器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作:危害小的如以受害者的名義發帖子,危害大的可以冒用受害者的帳號下單甚至轉帳。

舉個例子,受害者無意訪問到了某個邪惡網頁,該網頁裡只需要定義一個圖片:

<img src=」 https://hellobank.com/transfer/money/to/?accountId=6225&money=100」 />

即可達到以受害者的名義向helloback的伺服器發送該請求。如果恰好受害者之前訪問過hellobank,受害者的合法cookie很有可能會被自動帶上一起發送給hellobank伺服器,進而通過後者的身份校驗,最終轉帳100元給6225帳號。

上面只是一個簡單偽造get請求的例子,事實上post請求也可以同樣偽造,而且攻擊方式也更為複雜。例如,CSRF結合XSS,受害者沒有訪問過任何邪惡網頁的前提下也會被CSRF攻擊成功。

由上可見,CSRF攻擊的危害性極大,特別是對於金融業務,很多接口都是和貨幣產品相關,被攻擊成功的話後果非常嚴重。58金融的全部web流量都由nodejs承接,由nodejs負責防禦web相關的安全攻擊。針對CSRF攻擊,我們建立了一套專門的防禦方案,在此分享給大家,共同提高web服務安全。

常見認知誤區

網上有很多文章介紹使用Http請求頭的referrer欄位檢測是否CSRF,以及介紹使用Post請求代替Get請求來防禦CSRF。其實這些手段僅僅是增加了CSRF攻擊的難度,並不能真正意義上防禦。

想要100%防禦CSRF攻擊,不僅涉及到後端(伺服器)的工作,也涉及到前端(瀏覽器)的JavaScript代碼改造。而且更為重要的是,光靠技術手段遠遠不夠,更需要前後端達成並遵守一套開發規則,才能徹底杜絕CSRF攻擊。


開發規則

我們在眾多實際項目中總結出如下6條規則。

規則1:get請求無需防禦CSRF攻擊。

按照HTTP語義來說,get請求僅用於查詢,不能用於提交信息。也就是說任何一個get請求,都不應該導致後端業務狀態及業務數據的變化。攻擊者一定是希望通過CSRF攻擊造成後端業務數據的變化,如發帖購物轉帳等,沒有變化也就無需防禦。(接口防惡意刷數的除外,不在本文的討論範圍)

該規則雖看似簡單,實際開發中卻常被接口制定者所忽略。在實際開發中我們見到很多開發中使用get請求提交信息,或者更為隱蔽的漏洞是,雖然get請求沒有提交任何信息,但卻導致了後端服務狀態或資料庫數據發生了改變。因此該規則的重點在於後端同學正確理解HTTP語義和定義前後端接口。

規則2:不攜帶業務cookie的請求無需防禦

這條規則看似簡單,但往往最容易被開發人員所忽略。CSRF的攻擊者一定是希望冒用受害者的身份,通常更準確的術語是cookie,去發送某些請求到伺服器以達到攻擊者的目的。但如果受害者連業務cookie都沒有的話,說明伺服器根本不認識該受害者,攻擊者的目的也就無法實現了。換句話理解:用戶都沒登錄,不為系統識別,模擬他沒有任何收益。(接口防惡意刷數的除外,不在本文的討論範圍)

舉個例子,新聞網站的列表頁和詳情頁,一般都開放給所有人查看。攻擊者誘使其他非登錄用戶訪問某個新聞頁面,沒有收益且不會導致新聞網站後臺的業務和狀態數據改變,因此一般來講無需防範。(當然如果考慮到點擊量和曝光率、廣告費的話也有必要防禦,這些不在本文討論範圍)

規則3:URL白名單裡的post請求無需防範

業務中總會有一些接口,必須設置為禁止防禦CSRF攻擊。比如第三方的回調請求,一般都是對方伺服器直接發起請求到我們的伺服器,根本沒有經過瀏覽器,因此肯定無法通過CSRF防禦。這類請求一般是靠固定IP、業務token頒發的方式進行安全校驗。我們在服務端不做CSRF檢測和防禦。很多銀行類接口如轉帳,以及微信公眾號配置伺服器,這類請求經常需要銀行伺服器或微信伺服器異步回調我們的業務伺服器,因此必須配置白名單,繞過CSRF檢測。

規則4:瀏覽器端發送post請求時,為header添加csrf參數,其值由業務cookie計算得出

規則5:伺服器端收到post請求時,檢查其業務cookie及header中的csrf是否正確匹配

為什麼最後這倆條規則要放一起呢?因為這倆條規則是CSRF防禦的技術核心,前後端代碼配合一起作用,才能防禦CSRF攻擊。單獨僅前端或後端防禦肯定行不通。

首先,為什麼要給請求增加header呢?因為受害者在訪問邪惡網頁時,受害者向我們的伺服器所發出的請求,該請求和邪惡網頁的域名一定是不同的,這也是CSRF中的Cross-Site的含義。因此受到跨域的限制,攻擊者無法改變該請求的任何信息,特別是受害者的業務cookie值。

所以我們在瀏覽器端,給合法用戶請求的header上加上csrf的參數,並且該參數的值由業務cookie計算得出。如此則攻擊者無法事先知道受害者的cookie,也就無法計算出header的csrf參數。

然後在伺服器端獲取業務cookie以及header中的csrf值進行匹配校驗,一致則認為是有效請求,不一致則認為是CSRF攻擊進行攔截。

規則6:可以使用專門的CSRF cookie替換業務cookie,但要保證cookie足夠隨機、無法被預測

針對某些網站,其業務cookie因安全原因或其他歷史原因設置為httponly,導致JavaScript無法讀取。此時我們需要在nodejs端生成一個可以被JavaScript讀取的cookie,專門負責處理CSRF邏輯。


具體實現

上述規則可以用如下代碼邏輯實現(代碼僅供邏輯展示,均已脫敏僅供參考)。

這裡我們選用了koa2,將判斷邏輯抽象成一個函數,返回true時代表截獲到了CSRF攻擊。

然後在業務代碼裡應用該方法,對CSRF攻擊返回403狀態碼。需要注意的是根據koa2的洋蔥模型,下面代碼應該放置在post路由中間件之前。

這裡可以根據業務需要,適當拓展防禦措施,如根據CSRF攻擊的頻次考慮增加校驗碼流程,或對IP進行限制。此處不做詳述。


作者簡介:

賈建容,58金融前端負責人,主要負責金融中後臺系統架構和建設。

相關焦點

  • 用最簡單的話,一分鐘講明白xss和csrf攻擊,以及如何防禦
    現在網站經常會遭受到一些攻擊,使得用戶信息洩露或者用戶個人財產受到損傷,本文用最簡單的語言,講述一下xss和csrf攻擊,以及他們的防禦手段。postcookies() { let cookies = 當前網頁的用戶cookie //做成表單,自動提交到黑客的伺服器等等代碼}12345這樣的評論寫上去,然後發布評論,如果這個評論功能沒有做一些防禦
  • 「Burpsuite練兵場」CSRF(一)
    實驗二:基於請求方式進行token驗證實驗提示:應用程式 email change模塊存在CSRF漏洞,雖然添加了token,但僅防禦了特定的請求方式。同樣構造POC,然後刪除csrf欄位。根據提示可以推斷出我們可以使用一個有效帳戶的csrf
  • Web滲透測試(CSRF)
    <meta charset=&39;> <form name=&39; action=&39;method=&39;> <input type=&39; name=&39; value=&39;> <input type=&39; name=&39; value=&39;></form> <script>document.csrf.submit
  • 從CSRF到用戶信息洩漏,XSS和完整帳戶接管
    可以通過以下請求更改發送這些計費電子郵件的電子郵件地址:POST /change_billing_emailREQUEST BODY:email=NEW_EMAIL &csrftok=12345在此端點上的CSRF驗證已損壞。
  • django中遇到錯誤:Forbidden CSRF cookie not set
    既然不需要 CSRF 這裡我們就把CSRF檢測關掉即可解決方法1:在你創建的項目中,找到settings.py文件文件settings.py 找到 MIDDLEWARE參數注釋掉'django.middleware.csrf.CsrfViewMiddleware
  • CSRF攻擊實驗——合天網安實驗室學習筆記
    實驗對象:本科/專科信息安全專業實驗類別:實踐實驗類一、在target主機機中登錄留言板打開瀏覽器,登錄留言板網站:http://10.1.1.189/csrf-get-target重新訪問留言板網站: http://10.1.1.189/csrf-get-target/list.php,發現留言板上多了一條惡意的留言內容,如下圖所示:
  • 「Burpsuite練兵場」CSRF(二)
    欄位以及csrf欄位值均未變化。session負責會話管理,根據不同帳戶刷新欄位值;csrfKey以及csrf用於防範csrf攻擊,可能是根據瀏覽器會話或者是IP位址更新值。這從某種角度來說也是可以成功防範csrf攻擊的,因為我們無法構造POC對Cookie中的csrfKey參數進行單獨操縱。
  • 實戰Wordpres的CSRF漏洞利用
    安裝完成我們點擊完成就行接下來我們就一起去時間WordPress的csrf首先我們在火狐瀏覽器去訪問我們搭建好的wordpress我們需要打開火狐的代理設置,設置完成之後,我們隨便評論一個內容,比如說test for csrf,用戶名也隨便寫一個,電子郵件也是隨便弄一個。
  • Spring security CSRF 跨域訪問限制問題
    從這句話的字面意思就很明白就是禁用 csrf,什麼是 csrf,為什麼要禁用可能就一臉懵逼了。因為你很有可能會遇到一個錯誤:HTTP Status 403-Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
  • CSRF和SSRF(Web漏洞及防禦)
    CSRF的防禦:8080/jmx-console/// 發現存在jmx控制臺未授權訪問漏洞通過jboss.deployment接口部署Web木馬應用獲取Webshell執行命令SSRF防禦
  • 藍領亟待普惠金融甘露58金融助力藍領群體實現「小康夢」
    2020年是全面建成小康社會的決勝之年,打贏脫貧攻堅戰是黨對人民的莊嚴承諾,也是金融科技企業應擔當的社會責任。   普惠金融服務可持續發展之路如何前行,成為一項關乎中國社會發展和人民福祉的重大事業,普惠金融實踐已進入由服務理念到創新突破的實質性轉變階段。不過,現實中普惠金融的發展依然瓶頸暗存。
  • Csrf+Xss組合拳
    更改密碼處存在csrf聯想到剛剛的存儲型xss,一個csrf+xss的組合拳漏洞
  • 58技術沙龍|第五期:Flutter在58的應用實踐系列話題
    58技術沙龍第五期——Flutter在58的應用實踐系列話題4月12、19、26日,58同城舉辦Flutter在58的應用實踐系列話題技術沙龍,共6位來自58同城的嘉賓參加,通過6個話題,為大家詳解Flutter
  • CSRF滲透測試 防禦與安全檢測手法剖析
    上一節講到了滲透測試中xss跨站攻擊檢測方法和防護,這一節也是關於跨站攻擊的另一個手法CSRF,很多客戶找到我們Sinesafe想要了解更多的跨站攻擊檢測方法以及防禦此類攻擊的辦法,想要讓網站的安全性更加堅固,對此提醒大家滲透測試網站必須要拿到授權才能測試哦!3.3.1.
  • 威海市環翠區新時代文明實踐金融實踐基地揭牌
    齊魯網·閃電新聞7月9日訊 7月8日上午,威海市環翠區新時代文明實踐金融實踐基地揭牌暨煙臺銀行威海分行志願服務隊授旗儀式在煙臺銀行威海分行舉行。活動現場,「環翠區新時代文明實踐金融實踐基地暨志願服務驛站」揭牌,並為煙臺銀行威海分行志願服務隊授旗。隨後,大家參觀了新時代文明實踐志願者服務驛站、金融實踐講堂、黨建文化長廊、企業文化長廊。打通金融領域服務群眾的「最後一公裡」。
  • 利用csrf實現全論壇用戶頭像C老師
    很有可能存在csrf ....>首先先在頭像處上傳我蒼老師的豔照 抓個包然後生成一個csrf
  • 安芯網盾:構建金融縱深防禦體系之最後一道安全防線
    參賽單位:安芯網盾(北京)科技有限公司案例名稱:構建金融縱深防禦體系之最後一道安全防線案例簡介:某金融機構針對伺服器經常遭受到黑客攻擊和病毒木馬侵犯的情況,該機構提出了加強保障主機業務系統的安全幾點安全需求:1、需實現雲上及雲下業務伺服器共3000臺主機資產安全狀態可視化管理;2、發現高級入侵風險,實現攻擊事件的快速響應;3、建立業務運行時安全機制,確保業務連續性;4
  • 金融壹帳通入選信通院《金融科技應用創新實踐錄》 解決供應鏈金融...
    繼入選《金融科技黨政領導幹部讀本》之後,金融壹帳通再度入選年度重要科研成果。近日,《金融科技應用創新實踐錄》(以下簡稱《實踐錄》)正式發布,金融壹帳通「壹鏈E融區塊鏈智慧貿易融資網絡」(以下簡稱「壹鏈E融」)作為優秀案例入選該書。《實踐錄》中詳細介紹了壹鏈E融的推出背景、創新亮點、技術優勢和應用落地情況。
  • 立言首都金融論壇:《開放金融:理論、實踐與監管》新書發布
    50人論壇協辦的「《開放金融:理論、實踐與監管》新書發布暨新形勢下我國開放金融實踐路徑」研討會在京舉辦。面對日趨複雜的經濟形勢和國內外環境,以新書發布為契機,緊密圍繞我國開放金融的創新實踐和發展大趨勢,立言首都金融論壇第八期圍繞「新形勢下我國開放金融實踐路徑」進行閉門研討,特邀請新書作者及各方專家共同參與,分享深度思考,奉獻真知灼見。
  • 58同城:從一個神奇的網站,到一家神奇的金融企業
    一位接近58好借的從業者告訴新流財經,目前其累計放款約2000萬,日均放款50萬左右。實際58同城在推出自營現金貸之前,早已開啟金融探索之路,並且絕大部份布局與消費金融有關。早在2015年11月,58集團CEO姚勁波就表示,要在未來兩年內發力金融業務,希望拿到全牌照。