DVWA靶場通關筆記-暴力破解(Impossible級別)

目錄

一、查看源碼

二、功能分析

三、SQL注入分析

1、使用PDO預處理語句和參數綁定

2、mysqli_real_escape_string轉義

3、stripslashes去除反斜杠

四、暴力破解分析

1、token防止暴力破解機制?

2、登錄失敗隨機延遲機制

3、登陸失敗報錯信息相同

4、登陸失敗的賬戶鎖定機制


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

一、查看源碼

進入DVWA靶場源目錄,找到impossible.php源碼,分析其為何能讓這一關卡名為不可能實現暴力破解。

打開impossible.php文件,對其進行代碼審計,詳細注釋的impossible.php源碼如下所示。

<?php// 檢查是否通過 POST 方法提交了名為 'Login' 的表單數據,并且用戶名和密碼字段均已設置
if( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {// 檢查反跨站請求偽造(CSRF)令牌// $_REQUEST['user_token'] 是從請求中獲取的用戶令牌// $_SESSION['session_token'] 是存儲在會話中的令牌// 'index.php' 是如果令牌驗證失敗將跳轉的頁面checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 從 POST 請求中獲取用戶輸入的用戶名$user = $_POST[ 'username' ];// 去除用戶名中的反斜杠(如果有的話)$user = stripslashes( $user );// 使用 mysqli_real_escape_string 函數對用戶名進行轉義處理,防止 SQL 注入$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// 從 POST 請求中獲取用戶輸入的密碼$pass = $_POST[ 'password' ];// 去除密碼中的反斜杠(如果有的話)$pass = stripslashes( $pass );// 使用 mysqli_real_escape_string 函數對密碼進行轉義處理,防止 SQL 注入$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// 使用 md5 函數對密碼進行加密$pass = md5( $pass );// 設置默認值// 允許的最大失敗登錄次數$total_failed_login = 3;// 賬戶鎖定時間(分鐘)$lockout_time       = 15;// 標記賬戶是否被鎖定$account_locked     = false;// 從數據庫中查詢用戶的失敗登錄次數和最后登錄時間$data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );// 綁定用戶名參數$data->bindParam( ':user', $user, PDO::PARAM_STR );// 執行查詢$data->execute();// 獲取查詢結果的一行$row = $data->fetch();// 檢查用戶是否因多次失敗登錄而被鎖定if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {// 計算用戶可以再次登錄的時間$last_login = strtotime( $row[ 'last_login' ] );$timeout    = $last_login + ($lockout_time * 60);$timenow    = time();// 檢查是否已經過了鎖定時間,如果未過則鎖定賬戶if( $timenow < $timeout ) {$account_locked = true;}}// 從數據庫中查詢用戶名和密碼匹配的記錄$data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );// 綁定用戶名和密碼參數$data->bindParam( ':user', $user, PDO::PARAM_STR);$data->bindParam( ':password', $pass, PDO::PARAM_STR );// 執行查詢$data->execute();// 獲取查詢結果的一行$row = $data->fetch();// 如果是有效的登錄且賬戶未被鎖定if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {// 獲取用戶的頭像、失敗登錄次數和最后登錄時間$avatar       = $row[ 'avatar' ];$failed_login = $row[ 'failed_login' ];$last_login   = $row[ 'last_login' ];// 登錄成功,顯示歡迎信息和用戶頭像$html .= "<p>Welcome to the password protected area <em>{$user}</em></p>";$html .= "<img src=\"{$avatar}\" />";// 如果賬戶之前被鎖定過,給出警告信息if( $failed_login >= $total_failed_login ) {$html .= "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";$html .= "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";}// 重置失敗登錄次數$data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );$data->bindParam( ':user', $user, PDO::PARAM_STR );$data->execute();} else {// 登錄失敗,腳本暫停 2 到 4 秒之間的隨機時間sleep( rand( 2, 4 ) );// 給出登錄失敗的反饋信息$html .= "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";// 更新失敗登錄次數$data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );$data->bindParam( ':user', $user, PDO::PARAM_STR );$data->execute();}// 設置用戶的最后登錄時間$data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );$data->bindParam( ':user', $user, PDO::PARAM_STR );$data->execute();
}// 生成反跨站請求偽造(CSRF)令牌
generateSessionToken();?>

二、功能分析

此 PHP 代碼實現了一個具備反 CSRF 保護、防暴力破解機制的用戶登錄驗證系統。當用戶通過 POST 方法提交登錄表單時,代碼會先檢查 CSRF 令牌的有效性,接著對用戶名和密碼進行處理,包括去除反斜杠和轉義處理,再對密碼進行 MD5 加密。之后會從數據庫中查詢用戶的失敗登錄次數和最后登錄時間,判斷賬戶是否被鎖定。若賬戶未鎖定且用戶名和密碼匹配,則登錄成功,顯示歡迎信息和用戶頭像,同時重置失敗登錄次數;若登錄失敗,會暫停一段時間并給出反饋信息,同時更新失敗登錄次數。無論登錄結果如何,都會更新用戶的最后登錄時間。最后,會生成一個新的反 CSRF 令牌。

三、SQL注入分析

代碼中使用了如下三種方法進行防御,具體如下所示。

  • 使用PDO預處理語句和參數綁定
  • 對用戶名和密碼輸入進行了mysqli_real_escape_string轉義
  • 使用了stripslashes去除反斜杠

1、使用PDO預處理語句和參數綁定

PDO預處理語句是SQL注入防護的黃金標準。通過參數綁定,用戶輸入的數據不會被解釋為SQL代碼的一部分,而是作為純數據處理。這種方式完全隔離了代碼和數據,即使輸入中包含SQL特殊字符(如單引號、分號等),也不會改變SQL語句的結構。這是最有效的SQL注入防護措施,從根本上消除了SQL注入風險的可能性。

$data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', $user, PDO::PARAM_STR);
$data->bindParam( ':password', $pass, PDO::PARAM_STR );
$data->execute();

2、mysqli_real_escape_string轉義

mysqli_real_escape_string對特殊字符進行轉義,特別是在字符串上下文中。它會轉義單引號(')、雙引號(")、反斜杠()和NULL字符等,防止這些字符破壞SQL語句結構。雖然這在PDO預處理的基礎上是冗余的,但提供了額外的防御層。這種深度防御策略確保了即使預處理機制出現問題,轉義功能仍然能提供保護。

$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : "");
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : "");

3、stripslashes去除反斜杠

stripslashes函數去除輸入中的反斜杠,主要用于處理Magic Quotes功能開啟時自動添加的轉義字符。雖然現代PHP版本默認關閉Magic Quotes,但這個處理確保了向后兼容性。它防止了雙重轉義問題,確保數據在進入數據庫前保持正確的格式。這是防御深度策略的一部分,處理各種可能的輸入場景。

$user = stripslashes( $user );
$pass = stripslashes( $pass );

綜上,代碼在處理用戶輸入時,使用了stripslashes和mysqli_real_escape_string對用戶名和密碼進行處理,并且在后續的數據庫查詢中使用了 PDO 預處理語句。PDO 預處理語句本身能夠有效防止 SQL 注入,因為它將 SQL 語句和用戶輸入分開處理,數據庫會自動對輸入進行正確的轉義。但stripslashes的使用可能會破壞mysqli_real_escape_string的轉義效果,不過由于后續使用了 PDO 預處理語句,整體上 SQL 注入的風險相對較低。

四、暴力破解分析

代碼中使用了如下三種方法進行防御暴力破解,具體如下所示。

  • 基于token防暴力破解驗證機制
  • 失敗登錄后有隨機延遲(2-4秒)
  • 所有登錄失敗都打印同一錯誤信息,不利于攻擊者枚舉有效用戶名
  • 登陸失敗后的賬戶鎖定機制

1、token防止暴力破解機制?

CSRF令牌驗證有效防止自動化暴力破解。攻擊者必須首先獲取有效的user_token才能提交登錄請求,這增加了攻擊復雜度。每個會話的令牌唯一且有時效性,阻止了重放攻擊和批量自動化請求。Token機制確保了每個登錄請求都是來自合法的用戶會話,顯著提高了暴力破解的門檻,迫使攻擊者需要先破解CSRF保護才能進行密碼猜測。

// 檢查反跨站請求偽造(CSRF)令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

2、登錄失敗隨機延遲機制

隨機2-4秒延遲極大降低了暴力破解的速度。傳統攻擊每秒可嘗試數十次,現在降至每分鐘僅15-30次。對于萬級密碼字典,攻擊時間從幾分鐘延長到數小時。隨機性防止攻擊者通過固定時間模式優化攻擊節奏,增加了不確定性。這種時間成本策略有效消耗攻擊者資源,使得大規模暴力破解在經濟和時間上變得不可行,顯著提升防御效果。

sleep( rand( 2, 4 ) );

3、登陸失敗報錯信息相同

統一錯誤信息有效防止用戶名枚舉攻擊。攻擊者無法通過錯誤消息區分"用戶名不存在"和"密碼錯誤",必須同時猜測正確的用戶名和密碼組合。

$html .= "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";

這使得攻擊復雜度從O(n+m)增加到O(n×m),顯著擴大搜索空間。雖然當前實現仍透露了鎖定信息,但基本防止了通過錯誤信息差異進行用戶枚舉,迫使攻擊者采用更耗時耗力的組合攻擊方式。如下所示,如果登錄錯誤,報錯信息均如下所示,并不會出現只是用戶名錯誤,密碼錯誤,使攻擊者不清楚到底是輸入參數中哪個信息是不正確的。

4、登陸失敗的賬戶鎖定機制

記錄了失敗登錄次數和最后登錄時間,有賬戶鎖定機制(3次失敗后鎖定15分鐘=15*60秒)。

if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) {$last_login = strtotime( $row[ 'last_login' ] );$timeout = $last_login + ($lockout_time * 60);if( $timenow < $timeout ) {$account_locked = true;}
}

賬戶鎖定機制針對性地保護每個用戶賬戶。在3次失敗登錄后鎖定15分鐘,有效阻止針對特定用戶的持續暴力破解。時間基于最后登錄時間計算,確保鎖定期的準確性。這種機制保護了用戶賬戶免受定向攻擊,迫使攻擊者要么等待鎖定解除,要么轉向其他目標,分散了攻擊壓力。結合全局延遲和令牌驗證,形成了多層次的有效防護體系。

綜上,代碼采取了多種措施來防范暴力破解。包括token防暴力破解,設置了最大失敗登錄次數限制(3次),當失敗次數達到上限時,賬戶會被鎖定一段時間(3次失敗后鎖定15分鐘);登錄失敗時,腳本會暫停 2 到 4 秒之間的隨機時間,增加每次嘗試的時間成本。但是本關卡仍然存在一些小問題:

  • 鎖定是基于用戶名而非IP,允許攻擊者針對不同用戶嘗試
  • 鎖定時間較短(僅15分鐘)
  • 隨機延遲不夠長(2-4秒不足以阻止自動化攻擊)

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

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

相關文章

IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)

最近一直在使用vscodeclangd的方式編寫代碼&#xff0c;感覺使用clangd查找函數調用、函數聲明、類型定義等等都比使用vscode自帶的c/c插件好用太多了。現在我有一個功能是IAR版本的&#xff0c;那么有沒有辦法生成clangd使用的compile_commands.json文件呢&#xff1f;答案是&…

QT5.14.2、CMake 擴展openCV

一、準備工具Qt5.14.2c11cmake3.24.0opencv3.4.16二、使用cmake可擴展opencv 首先解壓cmake、opencv 兩個下載的壓縮包&#xff0c;如下&#xff1a;運行cmake-gui.exe打開后有彈窗選擇&#xff0c;然后進入QT的安裝路徑下找 mingw73_64文件下的 C和C的執行文件這個截圖是我擴展…

【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼

3D重建評估指標對比表 每個指標的具體代碼位于文章末尾指標計算方法數值范圍評估重點優缺點適用場景Chamfer Distance (C1)從預測網格到真實網格的平均距離[0, ∞)幾何形狀準確性優點&#xff1a;直觀、計算高效缺點&#xff1a;對噪聲敏感整體形狀評估Chamfer Distance (C2)從…

香港電訊創新解決方案,開啟企業數字化轉型新篇章

在數字化浪潮席卷全球的今天&#xff0c;企業正加速突破傳統辦公和業務模式的桎梏&#xff0c;力求通過高效協同與業務創新實現跨越式發展。香港電訊作為科技解決方案提供商&#xff0c;持續推動技術創新應用。近期&#xff0c;香港電訊通過多項創新應用、產品升級及戰略合作&a…

數據分析編程第六步:大數據運算

6.1 數據介紹直接打開集算器運行 createEventsAndUsers.splx 文件&#xff0c;就可以得到如下兩張表&#xff08;也可以根據代碼中的注釋&#xff0c;修改起止日期以及每天的數據量&#xff09;&#xff1a;電商數據表 events.csv字段名含義eventID事件編號, 從 1 開始流水號us…

vue2+elementui 表格單元格增加背景色,根據每列數據的大小 顏色依次變淺顯示2

注意&#xff1a; 正數前5和負數后5的顏色是固定的&#xff0c;剩下5之后的數據顏色是根據第5個顏色依次變淺的&#xff1b; 封裝的js方法&#xff1a; /*** 最終版表格顏色處理器* param {Array} data 完整表格數據* param {String} field 當前字段名* param {Object} row 當前…

【AOSP】Android Dump 開發與調試指南

在 Android 系統開發與調試中&#xff0c;dump 是一個不可或缺的強大工具。它能夠提供關于系統服務、應用程序狀態以及底層硬件信息的詳細快照。對于希望深入了解 Android 系統內部工作原理、排查復雜問題或進行性能優化的開發者來說&#xff0c;掌握 dump 的使用至關重要。一、…

Qt數據結構與編碼技巧全解析

文章目錄Qt中的數據結構QDebugqDebug函數QT的內置類型一般都會重載 << 運算符QT的幾何規則QString 字符串編碼變長 VS 定長QString 適合中轉數據嗎&#xff1f;Qstring 的底層使用寫時復制QString的具體使用QString 的構造函數格式化構造數值轉化為字符串字符串轉成數值增…

Ubuntu操作系統下MySQL、MongoDB、Redis

在開發和運維過程中&#xff0c;經常需要從Windows客戶端遠程連接到Ubuntu服務器上的數據庫。本文將詳細介紹如何在Ubuntu操作系統下安裝和配置MySQL、MongoDB和Redis&#xff0c;以允許從Windows客戶端進行遠程連接&#xff0c;并提供詳細的遠程連接命令和配置說明。一、MySQL…

校園勤工儉學微信小程序的設計與實現:基于數字化服務生態的賦能體系構建

在高等教育普及化與數字化校園建設的雙重驅動下&#xff0c;傳統校園勤工儉學管理模式正面臨深刻變革。當前高校勤工儉學工作普遍存在崗位匹配效率低下、過程管理粗放、數據孤島嚴重等痛點——根據教育部全國學生資助管理中心2022年統計數據&#xff0c;全國普通高校共有約450萬…

Apisix工作流程

是的,你的理解基本正確:當請求到達APISIX時,它會先根據請求的URI、Host、請求方法、 headers等信息匹配最合適的路由,然后執行路由關聯的插件邏輯,最后轉發到路由配置的上游服務。下面詳細講解APISIX處理請求的全鏈路及可能的情況。 一、請求全鏈路流程 APISIX處理請求的…

InnoDB存儲引擎底層拆解:從頁、事務到鎖,如何撐起MySQL數據庫高效運轉(上)

目錄 Page頁** B樹查詢 如何加快記錄的查詢&#xff1f; 索引** 聚簇索引(主鍵) 二級索引(非主鍵) 聯合索引——多列 bufferPool* Free鏈表 flush鏈表 Flush鏈表刷新方式有如下兩種&#xff1a; LRU鏈表 針對LRU鏈表方案缺點的優化 redoLog* redo簡單日志類型 redo復雜日志類型…

【人工智能99問】GPT4的原理是什么?(32/99)

【人工智能99問】GPT4的原理是什么&#xff1f;(32/99) 文章目錄GPT-4簡介一、結構與原理二、使用場景三、優缺點分析四、訓練技巧與關鍵改進五、示例說明六、總結GPT-4簡介 一、結構與原理 1. 架構設計 GPT-4基于Transformer解碼器架構&#xff0c;核心改進包括&#xff1a;…

//Q是一個隊列,S是一個空棧,實現將隊列中的元素逆置的算法。

#include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define Size 6 typedef struct SqNode//隊列結點 {int data;struct SqNode* next; }LinkNode; typedef struct SqQueue//隊列 {LinkNode* front, * rear; //頭指針和尾指針 }LinkQueue; typedef …

畢馬威 —— 公眾對人工智能的信任、態度及使用情況調查

文章目錄 前言 一、背景介紹 二、對人工智能的信任與接受度 三、人工智能的使用與認知情況 四、人工智能的益處與風險 五、人工智能的監管與治理 六、工作場所的人工智能應用 七、人工智能對工作的影響 八、學生對人工智能的應用 九、核心啟示 1.新興經濟體在公眾與員工人工智能…

基于Spring Session + Redis + JWT的單點登錄實現

實現思路 用戶訪問受保護資源時&#xff0c;若未認證則重定向到認證中心認證中心驗證用戶身份&#xff0c;生成JWT令牌并存儲到Redis認證中心重定向回原應用并攜帶令牌應用驗證JWT有效性并從Redis獲取會話信息用戶在其他應用訪問時&#xff0c;通過相同機制實現單點登錄 代碼…

微服務Eureka組件的介紹、安裝、使用

微服務 Eureka 組件的介紹、安裝與使用詳解 在微服務架構中&#xff0c;服務注冊與發現是至關重要的一環&#xff0c;而 Eureka 作為 Netflix 開源的服務注冊中心&#xff0c;廣泛應用于 Spring Cloud 微服務體系中。本文將帶你全面了解 Eureka 的概念、安裝及在 Spring Boot …

【PostgreSQL內核學習:通過 ExprState 提升哈希聚合與子計劃執行效率(一)】

PostgreSQL內核學習&#xff1a;通過 ExprState 提升哈希聚合與子計劃執行效率&#xff08;一&#xff09;引言背景補丁的意義補丁概述JIT & LLVM實際例子&#xff08;以 PostgreSQL 為例&#xff09;提交信息提交描述引入 ExprState 進行哈希計算&#xff1a;支持 JIT 編譯…

web端播放flv視頻流demo(flv.js的使用)

需求&#xff1a;原本是需要前端播放RTMP視頻流的&#xff0c;但是現在的瀏覽器都不支持flash插件了&#xff0c;讓用戶安裝flash插件也不現實&#xff0c;所以直接讓后端將RTMP視頻流轉換成flv視頻流給到前端進行播放。 直接上demo&#xff0c;直接就能播放&#xff0c;如果遇…

【拍攝學習記錄】04-拍攝模式/曝光組合

曝光組合全自動半自動光圈優先手動擋【固定物體長時間不變時候、閃光燈時候、】手機上的光學變焦與數碼變焦是不同的&#xff0c;使用檔位推薦可以提升畫質。手機夜景模式長曝光【車流軌跡、星軌】HDR 大光比【日落時候使用】專業模式&#xff0c;【感光度iso、快門可以調節】…