DVWA靶場通關筆記-SQL注入(SQL Injection Impossible級別)

目錄

一、源碼分析

1、index.php

2、impossible.php

二、SQL注入防范分析

1、Anti-CSRF 令牌

2、參數化查詢

3、輸入驗證


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

一、源碼分析

1、index.php

進入DVWA靶場SQL Injection源目錄,找到index.php源碼。

這段代碼實現了這段 PHP 代碼是 Damn Vulnerable Web Application (DVWA) 中 SQL 注入攻擊演示頁面的主控制器,主要功能包括:

  • 環境初始化:設置頁面路徑、驗證用戶身份、連接數據庫。
  • 安全級別控制:根據用戶 Cookie 中的安全級別設置(低、中、高、不可能),加載不同級別的實現文件。這些文件包含不同防護級別的 SQL 查詢代碼,用于演示不同難度的 SQL 注入場景。
  • 表單生成:根據安全級別動態生成不同的用戶輸入表單(低級、中級、高級、不可能共4個級別)
  • 環境檢測:檢查 PHP 配置中的魔術引號和安全模式,提供環境安全提示。
  • 結果展示:將 SQL 查詢結果和安全參考資料鏈接整合到頁面中。

經過注釋后的詳細代碼如下所示。

<?php// 定義網站根目錄路徑常量,并引入頁面處理工具
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 初始化頁面,驗證用戶認證狀態并啟動PHPIDS防護模塊
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 創建新頁面實例并設置頁面元信息
$page = dvwaPageNewGrab();
$page[ 'title' ]   = 'Vulnerability: SQL Injection' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'sqli';
$page[ 'help_button' ]   = 'sqli';
$page[ 'source_button' ] = 'sqli';// 連接數據庫
dvwaDatabaseConnect();// 設置表單提交方式和級別文件
$method            = 'GET';
$vulnerabilityFile = '';
// 根據安全級別Cookie選擇不同的級別實現文件
switch( $_COOKIE[ 'security' ] ) {case 'low':$vulnerabilityFile = 'low.php';break;case 'medium':$vulnerabilityFile = 'medium.php';$method = 'POST'; // 中等級別使用POST方法break;case 'high':$vulnerabilityFile = 'high.php';break;default:$vulnerabilityFile = 'impossible.php'; // 默認使用安全實現break;
}// 引入對應安全級別的SQL注入攻擊實現文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/sqli/source/{$vulnerabilityFile}";// 檢查PHP環境配置并生成警告信息
$WarningHtml = '';
// 檢測魔術引號是否開啟(已棄用的安全機制)
if( ini_get( 'magic_quotes_gpc' ) == true ) {$WarningHtml .= "<div class=\"warning\">The PHP function \"<em>Magic Quotes</em>\" is enabled.</div>";
}
// 檢測安全模式是否開啟(已棄用的安全機制)
if( ini_get( 'safe_mode' ) == true ) {$WarningHtml .= "<div class=\"warning\">The PHP function \"<em>Safe mode</em>\" is enabled.</div>";
}// 構建頁面主體內容
$page[ 'body' ] .= "
<div class=\"body_padded\"><h1>Vulnerability: SQL Injection</h1>{$WarningHtml}<div class=\"vulnerable_code_area\">";// 高級安全級別使用JavaScript彈窗獲取用戶ID
if( $vulnerabilityFile == 'high.php' ) {$page[ 'body' ] .= "Click <a href=\"#\" onclick=\"javascript:popUp('session-input.php');return false;\">here to change your ID</a>.";
}
// 其他安全級別使用表單獲取用戶ID
else {$page[ 'body' ] .= "<form action=\"#\" method=\"{$method}\"><p>User ID:";// 中等級別使用下拉菜單限制輸入范圍if( $vulnerabilityFile == 'medium.php' ) {$page[ 'body' ] .= "\n				<select name=\"id\">";// 動態生成下拉選項(基于數據庫行數)for( $i = 1; $i < $number_of_rows + 1 ; $i++ ) { $page[ 'body' ] .= "<option value=\"{$i}\">{$i}</option>"; }$page[ 'body' ] .= "</select>";}// 低級別和不可能級別使用文本框直接輸入else$page[ 'body' ] .= "\n				<input type=\"text\" size=\"15\" name=\"id\">";$page[ 'body' ] .= "\n				<input type=\"submit\" name=\"Submit\" value=\"Submit\"></p>\n";// 不可能級別添加CSRF令牌保護if( $vulnerabilityFile == 'impossible.php' )$page[ 'body' ] .= "			" . tokenField();$page[ 'body' ] .= "</form>";
}// 添加查詢結果區域和安全參考資料鏈接
$page[ 'body' ] .= "{$html} // 存儲SQL查詢結果的變量</div><h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet( 'http://www.securiteam.com/securityreviews/5DP0N1P76E.html' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/SQL_injection' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/SQL_Injection' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://bobby-tables.com/' ) . "</li></ul>
</div>\n";// 輸出HTML頁面
dvwaHtmlEcho( $page );?>

2、impossible.php

進入DVWA靶場SQL Injection的source源碼目錄,找到impossible.php源碼,分析其為何能讓這一關卡名為不可能實現SQL注入滲透。

打開源碼impossible.php,分析可知這段代碼實現了用戶信息查詢功能,如下所示。

  • 驗證用戶登錄狀態:通過檢查$_SESSION['id']判斷用戶是否已登錄。
  • 查詢用戶信息:從數據庫中查詢當前登錄用戶的姓和名,并將結果以 HTML 形式展示。
  • 數據庫操作流程:獲取會話 ID 構建 SQL 查詢 執行查詢 解析結果 關閉連接。

詳細注釋后的impossible.php源碼如下所示。

<?php// 檢查是否通過GET方法提交了表單
if( isset( $_GET[ 'Submit' ] ) ) {// 驗證CSRF令牌,防止跨站請求偽造攻擊// 比較用戶請求中的令牌與會話存儲的令牌是否一致checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 從GET參數中獲取用戶ID$id = $_GET[ 'id' ];// 驗證輸入是否為數字(防止非數字類型的SQL注入)if(is_numeric( $id )) {// 準備SQL查詢:從users表中查詢指定ID的用戶的名字和姓氏// 使用預處理語句防止SQL注入$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );// 將用戶輸入的ID綁定為整數類型參數// 這一步確保即使輸入包含非數字字符也會被轉換為整數$data->bindParam( ':id', $id, PDO::PARAM_INT );// 執行SQL查詢$data->execute();// 獲取查詢結果的第一行$row = $data->fetch();// 確保查詢只返回一行結果(防止越權訪問)if( $data->rowCount() == 1 ) {// 提取查詢結果中的名字和姓氏$first = $row[ 'first_name' ];$last  = $row[ 'last_name' ];// 輸出用戶信息(存在XSS風險,未對輸出進行HTML轉義)$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}
}// 生成新的CSRF令牌并存儲到會話中
generateSessionToken();?>

二、SQL注入防范分析

impossible.php 主要功能是處理用戶提交的 ID 查詢請求,通過驗證 Anti-CSRF 令牌確保請求合法性,檢查輸入 ID 是否為數字,再使用 PDO 參數化查詢從數據庫中獲取對應用戶的姓名并反饋給用戶,通過多重安全措施有效防范 SQL 注入等攻擊。impossible.php 主要功能是處理用戶提交的 ID 查詢請求,通過驗證 Anti-CSRF 令牌確保請求合法性,檢查輸入 ID 是否為數字,再使用 PDO 參數化查詢從數據庫中獲取對應用戶的姓名并反饋給用戶,通過多重安全措施有效防范 SQL 注入等攻擊。

  • 參數化查詢(Prepared Statement):使用 PDO 預編譯語句,分離 SQL 代碼與用戶輸入數據。
  • 輸入驗證:限制輸入為數字類型(is_numeric?檢查)。
  • Anti-CSRF 令牌:防止跨站請求偽造,間接提升安全性。

1、Anti-CSRF 令牌

通過generateSessionToken生成隨機令牌并存儲在會話中,表單提交時包含該令牌字段,服務器端checkToken驗證請求中的令牌與會話中存儲的是否一致,不一致則拒絕請求。

// 驗證令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 生成令牌
generateSessionToken();
// 表單中包含令牌字段
$page[ 'body' ] .= "			" . tokenField();

CSRF 攻擊依賴盜用用戶身份發起惡意請求,而 Anti-CSRF 令牌為每個請求附加隨機且時效性的驗證信息。攻擊者攻擊者難以獲取合法令牌,即使構造惡意請求,因令牌不匹配也會被攔截,間接保障 SQL 查詢的輸入來源合法性,降低惡意注入請求的成功率。

2、參數化查詢

通過 PDO 預編譯語句將 SQL 結構與用戶輸入分離,先用:id作為占位符定義查詢模板,再通過bindParam綁定參數并指定類型為整數,最后執行查詢。即使輸入包含惡意 SQL 片段,也只會被當作數據處理,無法改變查詢邏輯

$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();

預編譯階段 SQL 語句結構已固定,數據庫會將占位符視為數據而非可執行代碼。綁定參數時強制類型為整數(PDO::PARAM_INT),進一步確保輸入僅作為數值處理,從根本上避免用戶輸入被解析為 SQL 指令,徹底阻斷斷裂取數據庫控制權的注入路徑。

3、輸入驗證

獲取用戶輸入的id后,通過is_numeric函數驗證其是否為數字。只有當輸入為數字時,才執行后續數據庫操作;非數字輸入會被直接攔截,不進入查詢流程。

$id = $_GET[ 'id' ];
if(is_numeric( $id )) {// 執行數據庫查詢
}

SQL 注入常依賴字符串拼接注入惡意指令,而數字類型輸入無法包含引號、關鍵字等注入要素。is_numeric從輸入源頭限制數據類型,過濾掉包含字母、符號的潛在惡意輸入,減少注入攻擊的可能性。即使參數化查詢存在疏漏,該驗證也能作為第二道防線攔截風險輸入。

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

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

相關文章

MySQL中事務的作用和定義

在 MySQL 中&#xff0c;??事務&#xff08;Transaction&#xff09;?? 是一組數據庫操作的邏輯單元&#xff0c;這些操作要么??全部成功執行??&#xff0c;要么??全部失敗回滾??&#xff0c;以確保數據庫從一個一致狀態轉換到另一個一致狀態。事務是關系型數據庫&…

華為Fit4:腕間助手,守護你的健康,帶你開啟智慧生活

清晨被鬧鐘吵醒&#xff0c;想要關掉卻怎么也找不到手機&#xff1f;經常睡很久卻還是很困&#xff1f;重要的事情常常因為沒有被記錄和規劃清楚最終變得手忙腳亂&#xff1f;人流擁擠的地鐵上半天找不到刷碼信息&#xff1f;這些問題是不是生活中常常遇到&#xff0c;別擔心&a…

【交易系統系列36】揭秘幣安(Binance)技術心臟:從公開信息拼湊“MatchBox”撮合引擎架構

一、 核心概覽:從白皮書的豪言到監管文件的“實錘” 要理解幣安的架構,我們首先要抓住幾個關鍵的、有據可查的事實: 性能目標:在其早期白皮書中,幣安宣稱其撮合引擎能夠達到每秒140萬筆訂單的處理能力。這串數字,無論是在當時還是現在,都代表著對系統吞吐量和低延遲的極…

SpringBoot08-Spring Boot 多環境配置

方式一&#xff1a;純 Spring Profile&#xff08;最常用&#xff0c;官方推薦&#xff09;思路&#xff1a;用 application-{profile}.yml 切分配置&#xff0c;運行時指定用哪個 profile。 如何做&#xff1a;src/main/resources/application.ymlapplication-dev.ymlapplicat…

蒼穹外賣項目筆記day04--Redis入門

Redis 概念 Redis 是一個開源的、高性能的鍵值存儲系統&#xff0c;常被歸類為NoSQL數據庫。它支持多種數據結構&#xff0c;如字符串、列表、哈希、集合和有序集合&#xff0c;適用于緩存、消息隊列、實時分析等多種場景。Redis是一個基于內存的key-value結構數據庫。Redis …

OpenCV 圖像處理實戰與命令行參數配置:從輪廓檢測到模板匹配

在計算機視覺領域&#xff0c;OpenCV 是一款功能強大且應用廣泛的開源庫&#xff0c;它提供了豐富的 API&#xff0c;支持圖像讀取、預處理、特征檢測等多種操作。本文將結合實際代碼案例&#xff0c;詳細講解如何使用 OpenCV 實現輪廓檢測、輪廓近似、模板匹配等常用功能&…

深度學習---pytorch卷積神經網絡保存和使用最優模型

在深度學習模型訓練過程中&#xff0c;如何提升模型性能、精準保存最優模型并實現高效推理&#xff0c;是每個開發者必須攻克的關鍵環節。本文結合實際項目經驗與完整代碼示例&#xff0c;詳細拆解模型訓練優化、最優模型保存與加載、圖像預測全流程&#xff0c;幫助大家避開常…

FPGA實現Aurora 64B66B圖像視頻點對點傳輸,基于GTY高速收發器,提供2套工程源碼和技術支持

目錄 1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;為何要用你這個&#xff1f;工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 GT 高速接口解決方案本方案在Aurora 8B10B上的應用 3、工程詳細設…

LeetCode 524.通過刪除字母匹配到字典里最長單詞

給你一個字符串 s 和一個字符串數組 dictionary &#xff0c;找出并返回 dictionary 中最長的字符串&#xff0c;該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個&#xff0c;返回長度最長且字母序最小的字符串。如果答案不存在&#xff0c;則返回空字符串。 示例…

kali_linux

【2024版】最新kali linux入門及常用簡單工具介紹&#xff08;非常詳細&#xff09;從零基礎入門到精通&#xff0c;看完這一篇就夠了-CSDN博客

MyBatis 常見錯誤與解決方案:從坑中爬出的實戰指南

&#x1f50d; MyBatis 常見錯誤與解決方案&#xff1a;從坑中爬出的實戰指南 文章目錄&#x1f50d; MyBatis 常見錯誤與解決方案&#xff1a;從坑中爬出的實戰指南&#x1f41b; 一、N1 查詢問題與性能優化&#x1f4a1; 什么是 N1 查詢問題&#xff1f;?? 錯誤示例? 解決…

藍牙modem端frequency offset compensation算法描述

藍牙Modem中一個非常關鍵的算法:頻偏估計與補償(Frequency Offset Estimation and Compensation)。這個算法是接收機(解調端)能正確工作的基石。 我將為您詳細解釋這個算法的原理、必要性以及其工作流程。 一、核心問題:為什么需要頻偏補償? 頻偏的來源: 如第一張圖所…

基于STM32的居家養老健康安全檢測系統

若該文為原創文章&#xff0c;轉載請注明原文出處。一、 項目背景與立項意義社會老齡化趨勢加劇&#xff1a;全球范圍內&#xff0c;人口結構正經歷著前所未有的老齡化轉變。中國也不例外&#xff0c;正快速步入深度老齡化社會。隨之而來的是龐大的獨居、空巢老年人群體的健康監…

簡易TCP網絡程序

目錄 1. TCP 和 UDP 的基本區別 2. TCP 中的 listen、accept 和 connect 3. UDP 中的區別&#xff1a;沒有 listen、accept 和 connect 4. 總結對比&#xff1a; 2.字符串回響 2.1.核心功能 2.2 代碼展示 1. server.hpp 服務器頭文件 2. server.cpp 服務器源文件 3. …

廣電手機卡到底好不好?

中國廣電于2020年與中國移動簽署了戰略合作協議&#xff0c;雙方在5G基站建設方面實現了共建共享。直到2022年下半年&#xff0c;中國廣電才正式進入號卡服務領域&#xff0c;成為新晉運營商。雖然在三年的時間內其發展速度較快&#xff0c;但對于消費者而言&#xff0c;廣電的…

Git中批量恢復文件到之前提交狀態

<摘要> Git中批量恢復文件到之前提交狀態的核心命令是git checkout、git reset和git restore。根據文件是否已暫存&#xff08;git add&#xff09;&#xff0c;需采用不同方案&#xff1a;未暫存變更用git checkout -- <file>或git restore <file>丟棄修改&…

UniApp 基礎開發第一步:HBuilderX 安裝與環境配置

UniApp 是一個基于 Vue.js 的跨平臺開發框架&#xff0c;支持快速構建小程序、H5、App 等應用。作為開發的第一步&#xff0c;正確安裝和配置 HBuilderX&#xff08;官方推薦的 IDE&#xff09;是至關重要的。下面我將以清晰步驟引導您完成整個過程&#xff0c;確保環境可用。整…

華為云Stack Deploy安裝(VMware workstation物理部署)

1.1 華為云Stack Deploy安裝(VMware workstation物理部署) 步驟 1 安裝軟件及環境準備 HUAWEI_CLOUD_Stack_Deploy_8.1.1-X86_64.iso HCSD安裝鏡像 VMware workstation軟件 VirtualBox安裝包 步驟2 修改VMware workstation網絡模式 打開VMware workstation軟件,點“編輯”…

安全等保復習筆記

信息安全概述1.2 信息安全的脆弱性及常見安全攻擊 ? 網絡環境的開放性物理層--物理攻擊 ? 物理設備破壞 ? 指攻擊者直接破壞網絡的各種物理設施&#xff0c;比如服務器設施&#xff0c;或者網絡的傳輸通信設施等 ? 設備破壞攻擊的目的主要是為了中斷網絡服務 ? 物理設備竊…

【Audio】切換至靜音或振動模式時媒體音自動置 0

一、問題描述 基于 Android 14平臺&#xff0c;AudioService 中當用戶切換到靜音模式&#xff08;RINGER_MODE_SILENT&#xff09;或振動模式&#xff08;RINGER_MODE_VIBRATE&#xff09;時會自動將響鈴和通知音量置0&#xff0c;當切換成響鈴模式&#xff08;RINGER_MODE_NO…