DVWA靶場通關筆記-CSRF(Impossible級別)

目錄

一、查看源碼

二、功能分析

三、CSRF防范分析

1、CSRF令牌驗證機制

(1)核心原理

(2)防范機制

2、舊密碼確認防御實現

(1)核心原理

(2)為什么舊密碼確認能有效防范CSRF?


本系列為通過《DVWA靶場通關筆記》的CSRF關卡(low,medium,high,impossible共4關)滲透集合,通過對相應關卡源碼的代碼審計找到講解滲透原理并進行滲透實踐,本文為CSRF impossible關卡的原理分析部分,講解相對于low、medium和high級別,為何對其進行滲透測試是Impossible的。

一、查看源碼

進入DVWA靶場CSRF的源碼目錄,找到impossible.php源碼,分析其為何能讓這一關卡名為不可能實現命令執行滲透。

打開impossible.php文件,對其進行代碼審計,這段PHP代碼實現了一個密碼修改功能,通過CSRF令牌驗證防止跨站請求偽造,使用預處理語句防范SQL注入,并對用戶輸入的當前密碼進行MD5加密驗證,確保新舊密碼匹配后才更新數據庫。

  • 密碼修改驗證:處理用戶發起的密碼更改請求

  • CSRF防護:通過token驗證防止跨站請求偽造攻擊

  • 密碼驗證:確認當前密碼正確且新密碼匹配

詳細注釋后的impossible.php源碼如下所示,主要實現密碼修改功能,修復了CSRF安全風險。

<?php
// 檢查是否通過 GET 方法提交了 'Change' 參數(觸發密碼修改操作)
if( isset( $_GET[ 'Change' ] ) ) {// 驗證 CSRF 令牌,防止跨站請求偽造攻擊checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 獲取用戶輸入的當前密碼、新密碼和確認密碼$pass_curr = $_GET[ 'password_current' ];$pass_new  = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// 處理當前密碼:// 1. 移除可能的轉義字符// 2. 使用 mysqli_real_escape_string 進行 SQL 轉義(盡管后續使用了預處理語句)// 3. 計算 MD5 哈希值(用于與數據庫中存儲的密碼比較)$pass_curr = stripslashes( $pass_curr );$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_curr = md5( $pass_curr );// 查詢數據庫,驗證當前密碼是否正確// 使用 PDO 預處理語句防止 SQL 注入$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );$data->execute();// 驗證條件:// 1. 新密碼和確認密碼是否一致// 2. 當前密碼是否與數據庫中存儲的密碼匹配if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {// 條件滿足,處理新密碼:// 1. 移除可能的轉義字符// 2. 使用 mysqli_real_escape_string 進行 SQL 轉義(盡管后續使用了預處理語句)// 3. 計算 MD5 哈希值(用于存儲到數據庫)$pass_new = stripslashes( $pass_new );$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new );// 更新數據庫中的密碼// 使用 PDO 預處理語句確保安全性$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );$data->execute();// 顯示成功信息$html .= "<pre>Password Changed.</pre>";}else {// 顯示失敗信息(密碼不匹配或當前密碼錯誤)$html .= "<pre>Passwords did not match or current password incorrect.</pre>";}
}// 生成新的 CSRF 令牌,用于后續請求的驗證
generateSessionToken();
?>

二、功能分析

這段 PHP 代碼實現了一個密碼修改功能,用戶提交當前密碼、新密碼和確認密碼后,系統先驗證Anti-CSRF令牌防止跨站請求偽造,然后檢查當前密碼是否正確(通過數據庫查詢)以及新密碼是否匹配。驗證通過后,對新密碼進行MD5哈希處理并更新到數據庫。代碼使用PDO預處理語句防止SQL注入,同時兼容性地使用mysqli_real_escape_string進行額外防護。

  • Anti-CSRF 防護
    • 使用?checkToken()?驗證用戶提交的 Token,防止 CSRF 攻擊。
    • 每次頁面加載時生成新的 TokengenerateSessionToken())。
  • 密碼修改邏輯
    • 用戶提交?password_current(當前密碼)、password_new(新密碼)、password_conf(確認密碼)。
    • 檢查?password_new??password_conf?是否一致。
    • 檢查?password_current?是否正確(查詢數據庫)。
    • 如果驗證通過,更新數據庫中的密碼。
  • 輸入清理與哈希
    • 使用?stripslashes()?去除可能的反斜杠(防止魔術引號影響)。
    • 使用?mysqli_real_escape_string?防止 SQL 注入(兼容舊代碼)。
    • 使用?md5()?對密碼進行哈希。
  • 數據庫操作
    • 使用 PDO 預處理語句(prepare?+?bindParam)防止 SQL 注入。
    • 查詢當前密碼是否正確(SELECT ... LIMIT 1)。
    • 更新密碼(UPDATE users SET password = ...)。
  • 反饋信息
    • 成功時返回?Password Changed.
    • 失敗時返回?Passwords did not match or current password incorrect.

三、CSRF防范分析

代碼中主要使用兩種方法進行防御,一個惡意請求必須同時滿足以下兩個條件才能成功:

  1. 攜帶正確且最新的CSRF Token。(第一道關卡)

  2. 攜帶正確的當前用戶密碼。(第二道關卡)

缺少任何一個,攻擊都會失敗。具體如下所示。

防御層機制優點局限性
第一層:CSRF Token驗證請求是否來源于真正的網站表單。直接針對CSRF攻擊原理,防范絕大多數自動化攻擊。如果Token生成、存儲或驗證邏輯存在缺陷,可能被繞過。
第二層:舊密碼確認驗證執行敏感操作的用戶是否知曉某個機密。極其強大。即使CSRF Token因某種原因失效,此層依然堅挺。攻擊者幾乎無法繞過。對用戶體驗有輕微影響(需要多輸入一個字段)。

1、CSRF令牌驗證機制

(1)核心原理

核心原因在于,它不僅僅驗證用戶的登錄憑證(Session Cookie),還要求每個敏感請求(如修改密碼)都必須攜帶一個一次性、隨機的、與會話綁定的令牌

// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

(2)防范機制

同步令牌模式:服務器為每個會話生成一個隨機、不可預測的令牌(Token),并將其同時存儲在服務器端(Session)和客戶端(表單隱藏域)。當客戶端提交請求時,必須帶回此令牌。服務器通過比對兩者是否一致來驗證請求是否來源于真實的網站頁面,從而拒絕偽造的跨站請求。

  • 生成令牌 (Generate):在用戶訪問包含表單的頁面時(如第一次訪問密碼修改頁面),服務器端會調用?generateSessionToken()?函數生成一個隨機令牌,并將其存儲在用戶的會話($_SESSION)中。

  • 分發令牌 (Distribute):服務器將這個令牌值嵌入到返回給用戶的HTML表單中,作為一個隱藏字段(hidden field)。

  • 提交令牌 (Submit):當用戶提交表單時,瀏覽器會自動將這個隱藏字段的值連同其他表單數據一并提交到服務器。

  • 驗證令牌 (Verify):服務器接收到請求后,首先調用?checkToken()?函數,比對用戶提交的令牌($_REQUEST['user_token'])和存儲在服務器端會話中的令牌($_SESSION['session_token'])是否完全一致

    • 一致:請求被認為是合法的,繼續執行密碼修改邏輯。

    • 不一致或缺失:請求被認為是偽造的,立即終止,并將用戶重定向到首頁('index.php'

2、舊密碼確認防御實現

(1)核心原理

權限復核(Re-authentication):要求用戶在執行極高權限操作(如修改密碼、郵箱)時,再次提供一項只有本人才知道的機密信息(當前密碼)。這確保了即使是已經通過Cookie認證的用戶會話,也必須證明操作者確實知道密碼,而不僅僅是持有會話ID。這有效防御了CSRF、會話劫持以及在已登錄設備上離開后的未授權操作。

(2)為什么舊密碼確認能有效防范CSRF?

CSRF攻擊的核心是?“借刀殺人”?:利用用戶瀏覽器中已有的身份憑證(如Session Cookie)來執行非用戶本意的操作。這里特別強調非本意,即用戶根部不知道要點擊這個鏈接會直接導致什么后果。

舊密碼確認能防御CSRF,并不是因為它是一個“明顯的確認步驟”來提醒用戶(雖然這算是一個次要的副作用),而是因為它在服務器端的技術層面,為執行敏感操作增加了一個攻擊者無法提供的、必須驗證通過的必要參數。

它將請求從?“有Cookie就能執行”?變成了?“有Cookie且知道密碼才能執行”?,從而從根本上破壞了CSRF攻擊成立的條件。這是一種非常強大且根本的防御措施。

  • 未知的“秘密”:用戶的當前密碼是一個只有用戶自己知道的秘密。攻擊者可以偽造請求的URL和參數,但他們無法偽造用戶當前的密碼

  • 攻擊請求必然失敗:攻擊者構造的CSRF惡意鏈接中,password_current?參數只能是一個猜測值(如?123456password?等常見密碼)或空值。

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

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

相關文章

深層語義在自然語言處理中的理論框架與技術融合研究

摘要本文章系統闡述了深層語義在自然語言處理&#xff08;NLP&#xff09;領域的定義、特征及其與知識圖譜和大型預訓練語言模型的融合方法。基于截至2025年8月的最新研究成果&#xff0c;報告深入分析了深層語義的多維度特性、技術實現路徑以及面臨的挑戰&#xff0c;為研究人…

深入解析HarmonyOS:UIAbility與Page的生命周期協同

深入解析HarmonyOS&#xff1a;UIAbility與Page的生命周期協同 在HarmonyOS應用開發中&#xff0c;理解UIAbility和Page的生命周期是構建高質量應用的關鍵。本文將深入探討這兩大核心概念的生命周期及其協同工作機制&#xff0c;幫助開發者更好地管理應用資源、優化用戶體驗。…

規律作息 + 養成好的習慣 + 考研倒計時 111 天 + 線面積分入門 1 下半部分

文章目錄前言雜進度10.4空間直線一般式方程對稱式方程 點向式方程參數式方程轉換位置關系10.510.610.7平面束方程10.810.9總結前言 規律作息&#xff01; 雜 欲買桂花同載酒&#xff0c;終不似&#xff0c;少年游。 進度 向量代數和空間解析幾何。 10.4 這題就是算一個…

序列容器(vector,deque,list)

STL 序列式容器&#xff08;vector、deque、list、array、forward_list&#xff09;的核心特征是按插入順序存儲元素&#xff08;元素的邏輯順序與物理存儲順序一致&#xff09; vector 下圖是底層原理 具體點擊鏈接vector介紹 deque(雙端隊列) 在 C STL 中&#xff0c;deque…

Time-MOE添加MLP分類頭進行分類任務

文章目錄一、背景&#xff1a;Time-MoE 的 4096 長度限制二、數據準備&#xff08;以帕金森二分類為例&#xff09;三、標簽對齊&#xff08;弱監督&#xff09;四、類別不平衡 & 數據劃分五、模型微調&#xff08;凍結 backbone&#xff0c;只訓 MLP 頭&#xff09;六、評…

樸素貝葉斯:用 “概率思維” 解決分類問題的經典算法

一、貝葉斯&#xff1a;從 “逆概” 問題走來的數學家要理解樸素貝葉斯&#xff0c;得先回到它的 “源頭”—— 貝葉斯公式&#xff0c;以及它要解決的核心問題&#xff1a;逆概問題。1. 貝葉斯的 “生不逢時”托馬斯?貝葉斯&#xff08;Thomas Bayes&#xff0c;約 1701-1761…

Qt/C++開發監控GB28181系統/視頻點播主碼流子碼流/動態切換碼流/支持海康大華/全網唯一

一、前言說明 目前市面上的國標監控系統&#xff0c;沒有看到可以切換碼流的&#xff0c;都是默認主碼流&#xff0c;包括easynvr、livegbs、wvp等&#xff0c;很是奇怪為什么他們不做呢&#xff1f;難道沒有用戶反饋需要這個&#xff1f;我這就遇到過一些用戶需要能夠切換主碼…

【 MYSQL | 基礎篇 四大SQL語句 】資料位于文章末尾

摘要&#xff1a;本文先介紹數據庫 SQL 的核心概念&#xff0c;接著闡述 SQL 通用語法與 DDL、DML、DQL、DCL 四大分類&#xff0c;隨后詳細講解各類語句操作&#xff0c;包括 DDL 的數據庫與表操作及數據類型&#xff0c;DML 的數據增刪改&#xff0c;DQL 的查詢語法與功能&am…

Webrtc支持FFMPEG硬解碼之Intel

Intel QSV下載編譯git clone https://github.com/lu-zero/mfx_dispatch.git1.使用CMake生產VS工程編譯生成libmfx.lib文件 頭文件為mfx文件夾libmfx---include---mfx---lib---libmfx.libWebrtc中ffmpeg的修改因為Webrtc中的ffmpeg是使用gn進行編譯的&#xff0c;所以這里先找到…

【二叉樹(DFS) - LeetCode】437. 路徑總和 III

437. 路徑總和 III 題解&#xff1a;DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullp…

【Python】shutil.make_archive() 方法詳解

文章目錄功能概述函數簽名核心參數詳解1. base_name2. format3. root_dir4. base_dir使用示例將 /home/user/project/data 目錄打包為 data.tar.gz&#xff0c;并保存到 /home/user/backups/打包當前工作目錄下的 docs 文件夾為 zip 文件替代方案總結shutil.make_archive() 是 …

CAN總線(Controller Area Network Bus)控制器局域網總線(二)

6、錯誤幀 總線上所有設備都會監督總線的數據&#xff0c;一旦發現“位錯誤”或“填充錯誤”或“CRC錯誤”或“格式錯誤”或“應答錯誤” &#xff0c;這些設備便會發出錯誤幀來破壞數據&#xff0c;同時終止當前的發送設備。7、過載幀 當接收方收到大量數據而無法處理時&#…

LeetCode 317 離建筑物最近的距離

LeetCode 317 題的詳細題目信息如下&#xff1a;題目名稱Shortest Distance from All Buildings&#xff08;中文譯名&#xff1a;離建筑物最近的距離&#xff09;題目描述給你一個由 0、1 和 2 組成的二維網格&#xff0c;其中&#xff1a;0 代表空地1 代表建筑物2 代表障礙物…

AI之CodeTool之Kode:Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略

AI之CodeTool之Kode&#xff1a;Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 相關文章 LLMs之PE之SystemPrompt&#xff1a;analysis_claude_code的簡介、使用方法、案例應用之詳細攻略 AI之CodeTool之Kode&#xff1a;Kode(claude_code風格)的簡…

網絡請求優化:用 Retrofit 攔截器玩轉日志、重試與緩存,OkHttp 和 Volley 誰更香?

目錄 1. 攔截器:Retrofit 的“超級管理員” 攔截器的本質 為什么用攔截器? 2. 日志攔截器:讓請求和響應“現原形” 引入日志攔截器 實現日志攔截器 日志輸出示例 生產環境注意事項 3. 重試攔截器:網絡不穩定也能穩如狗 設計重試邏輯 集成到 Retrofit 優化重試策…

LeetCode - 283. 移動零

題目 283. 移動零 - 力扣&#xff08;LeetCode&#xff09; 思路 我們使用左右兩個指針&#xff1a;左指針left指向已處理好的非零元素的末尾位置&#xff0c;右指針right用于遍歷數組。 算法步驟&#xff1a; 初始化left為-1&#xff08;表示還沒有處理任何非零元素&…

Redis不同場景下的注意事項

Redis常見的 使用場景&#xff1a; 緩存系統(核心場景) 存儲熱點數據&#xff0c;減少數據庫訪問壓力。提升接口響應速度。技術點&#xff1a; 用String/Hash 存儲結構化數據結合過期時間&#xff08;TTL&#xff09;和緩存淘汰策略(如LRU)管理內存。解決緩存問題&#xff1a;穿…

【完整源碼+數據集+部署教程】高速公路施工區域物體檢測系統源碼和數據集:改進yolo11-RepNCSPELAN

背景意義 隨著城市化進程的加快&#xff0c;高速公路建設與維護工作日益頻繁&#xff0c;施工區域的安全管理成為亟待解決的重要問題。在高速公路施工區域&#xff0c;工人和設備的安全是首要考慮因素&#xff0c;而有效的物體檢測系統能夠顯著提高施工現場的安全性與工作效率。…

如何在FastAPI中玩轉全鏈路追蹤,讓分布式系統故障無處遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全鏈路追蹤如何讓FastAPI微服務架構的每個請求都無所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全鏈路追蹤是現代微服務架構中監控系統行為的核心技術,通…

Win11 壓縮實測:Win11 的壓縮軟件的最佳配置和使用方式

文章目錄測試環境機器配置被壓縮文件WinRAR7zipLinux子系統準備極限壓縮減小字典的極限壓縮7zipWin11準備極限壓縮7zip系統內置右鍵壓縮菜單極限壓縮總結&#xff1a;Win11 的壓縮軟件的最佳配置和使用方式測試環境 機器配置 Win11系統 16GB內存 8核CPU 被壓縮文件 文件夾內…