Web安全滲透測試基礎知識之SQL注入篇

一、SQL注入基礎理論
?
1.1 什么是SQL注入
?
SQL注入是一種常見的Web安全問題,攻擊者通過在Web應用程序的輸入字段中插入惡意的SQL語句,改變原本SQL查詢的邏輯,實現非法獲取數據、篡改數據、執行系統命令等操作。這種情況產生的根本原因在于應用程序對用戶輸入數據的合法性沒有進行嚴格的驗證和過濾,導致用戶輸入的數據被當作SQL語句的一部分執行。
?
1.2 SQL注入的危害
?
數據泄露:攻擊者可以通過SQL注入獲取數據庫中的敏感信息,如用戶賬號、密碼、身份證號等。
數據篡改:修改數據庫中的數據,如篡改用戶的交易記錄、修改網站內容等。
權限提升:在某些情況下,攻擊者可以利用SQL注入獲取數據庫管理員權限,進一步控制整個服務器。
服務器被控制:通過SQL注入執行系統命令,控制服務器,如上傳惡意文件、開啟后門等。
?
1.3 SQL注入的類型
?
數字型注入:當輸入的參數為數字類型時,SQL語句中沒有使用引號包裹參數,如 ?SELECT * FROM users WHERE id = 1?。
字符型注入:輸入的參數為字符類型,SQL語句中使用引號包裹參數,如 ?SELECT * FROM users WHERE username = 'admin'?。
寬字節注入:利用GBK等寬字節編碼的特性,繞過對單引號等特殊字符的過濾。
盲注:在無法直接獲取數據庫返回結果的情況下,通過構造條件語句,根據頁面返回的狀態(如頁面正常、頁面錯誤、響應時間等)來推斷數據庫中的信息,包括布爾盲注和時間盲注。
二次注入:攻擊者將惡意數據存儲在數據庫中,當應用程序再次調用該數據進行SQL操作時,觸發SQL注入。
堆疊注入:在一條SQL語句中執行多條SQL語句,通過分號(;)分隔不同的SQL命令 。
?
二、SQL注入實戰案例
?
2.1 搭建測試環境
?
我們可以使用PHP + MySQL搭建一個簡單的Web應用來模擬相關場景。
?
數據庫表結構:

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50),password VARCHAR(50)
);
INSERT INTO users (username, password) VALUES ('admin', 'admin123'), ('user1', 'user123');

PHP代碼(存在非安全設計):

 
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);// 檢查連接
if ($conn->connect_error) {die("連接失敗: ". $conn->connect_error);
}$user_input = $_GET["username"];
$sql = "SELECT * FROM users WHERE username = '$user_input'";
$result = $conn->query($sql);if ($result->num_rows > 0) {while($row = $result->fetch_assoc()) {echo "id: ". $row["id"]. " Name: ". $row["username"]. "<br>";}
} else {echo "沒有找到匹配的用戶";
}$conn->close();
?>

訪問鏈接 ?http://localhost/test.php?username=admin? 時,會正常查詢并顯示用戶信息。

2.2 數字型SQL注入實戰

假設SQL查詢語句為 ?SELECT * FROM products WHERE id = 1?,我們可以嘗試以下操作:

輸入 ?1 or 1=1?,此時SQL語句變為 ?SELECT * FROM products WHERE id = 1 or 1=1?,由于 ?1=1? 恒成立,會返回所有產品信息。

2.3 字符型SQL注入實戰

對于 ?SELECT * FROM users WHERE username = 'admin'? 這樣的查詢語句:

輸入 ?' or '1'='1?,SQL語句變為 ?SELECT * FROM users WHERE username = '' or '1'='1'?,同樣因為 ?'1'='1'? 恒成立,會返回所有用戶信息。

輸入 ?' and 1=2 union select 1,2 -- -?,?' and 1=2? 使前面的查詢條件不成立,?union select 1,2? 會將 ?1? 和 ?2? 作為查詢結果返回,?-- -? 注釋掉后面的單引號,防止語法錯誤。

2.4 盲注實戰

布爾盲注

假設頁面只有兩種返回狀態:有數據返回時顯示 “查詢成功”,無數據返回時顯示 “查詢失敗”。我們可以通過構造條件語句來推斷數據庫中的信息。例如,判斷數據庫中是否存在 ?admin? 用戶:

輸入 ?' and exists(select * from users where username='admin') -- -?,如果頁面顯示 “查詢成功”,則說明存在 ?admin? 用戶。

時間盲注

當頁面沒有明顯的回顯信息時,可以利用時間盲注。例如,判斷數據庫中 ?users? 表的記錄數是否大于10:

' and if((select count(*) from users)>10, sleep(5), 1) -- -

如果頁面響應時間超過5秒,說明 ?users? 表的記錄數大于10。

三、SQL注入遇到的問題及解決方案

3.1 特殊字符過濾

很多應用程序會對單引號、分號等特殊字符進行過濾,導致相關操作失敗。

解決方案:

使用編碼繞過,如將單引號 ?'? 編碼為 ?%27?(URL編碼)。

利用寬字節注入,在單引號前添加 ?%df?(GBK編碼下,?%df'? 會組成一個合法的漢字,從而繞過單引號過濾)。

3.2 預編譯語句的使用

預編譯語句可以有效防范相關風險,因為它將用戶輸入的數據和SQL語句進行了分離。

示例代碼(PHP PDO預編譯):

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";try {$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);// 設置 PDO 錯誤模式為異常$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$user_input = $_GET["username"];$sql = "SELECT * FROM users WHERE username = :username";$stmt = $conn->prepare($sql);$stmt->bindParam(':username', $user_input);$stmt->execute();$result = $stmt->fetchAll(PDO::FETCH_ASSOC);if (count($result) > 0) {foreach ($result as $row) {echo "id: ". $row["id"]. " Name: ". $row["username"]. "<br>";}} else {echo "沒有找到匹配的用戶";}
} catch(PDOException $e) {echo "Error: ". $e->getMessage();
}
$conn = null;
?>

在上述代碼中,?bindParam? 方法會自動對用戶輸入進行轉義,確保數據的安全性。

四、繞過WAF(Web應用防火墻)

4.1 WAF的工作原理

WAF通過檢測HTTP請求中的數據,與預設的規則庫進行匹配,一旦發現請求中包含可疑的特征,就會攔截該請求。

4.2 繞過WAF的方法

大小寫混合:將SQL關鍵字進行大小寫混合,如 ?SeLeCt?,可能繞過部分基于規則的WAF。

內聯注釋:使用MySQL的內聯注釋,如 ?/*!SELECT*/?,部分WAF可能無法識別這種形式的SQL關鍵字。

雙寫繞過:將關鍵字拆分后雙寫,例如 ?selseselectct?,當WAF過濾掉第一個 ?select? 后,仍能組成完整的 ?select? 關鍵字。

編碼繞過:對相關語句進行URL編碼、Unicode編碼等,如將 ?select? 編碼為 ?%73%65%6C%65%63%74?,繞過基于明文匹配的WAF。

利用WAF的邏輯漏洞:某些WAF在處理長請求、多參數請求時可能存在邏輯問題,可以構造特殊的請求格式來繞過檢測。

五、總結

SQL注入是Web應用中非常危險的安全問題,掌握SQL注入的原理、實戰技巧以及繞過方法,對于滲透測試人員來說至關重要。同時,開發人員也應該重視輸入驗證和使用安全的數據庫操作方式(如預編譯語句),從根源上避免出現相關安全隱患。在實際的滲透測試和安全防護過程中,需要不斷學習和實踐,以應對不斷變化的攻擊和防御技術。

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

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

相關文章

JVM方法區核心技術解析:從方法區到執行引擎

方法區 方法區的內部結構 在經典方法區設計中&#xff0c;主要存儲以下核心數據內容&#xff1a; 一、類型信息 方法區維護的類型信息包含以下要素&#xff1a; 類全稱標識 類名稱&#xff08;含完整包路徑&#xff09;直接父類的完全限定名&#xff08;包含完整包路徑&am…

【MyBatis插件】PageHelper 分頁

前言 在開發 Web 應用時&#xff0c;我們經常需要處理海量數據的展示問題。例如&#xff0c;在一個電商平臺上&#xff0c;商品列表可能有成千上萬條數據。如果我們一次性將所有數據返回給前端&#xff0c;不僅會導致頁面加載緩慢&#xff0c;還會對數據庫造成巨大壓力。為了解…

springboot+vue實現在線書店(圖書商城)系統

今天教大家如何設計一個圖書商城 , 基于目前主流的技術&#xff1a;前端vue&#xff0c;后端springboot。 同時還帶來的項目的部署教程。 視頻演示 在線書城 圖片演示 一. 系統概述 商城是一款比較龐大的系統&#xff0c;需要有商品中心&#xff0c;庫存中心&#xff0c;訂單…

OPC UA + ABP vNext 企業級實戰:高可用數據采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企業級實戰&#xff1a;高可用數據采集框架指南 &#x1f680; &#x1f4d1; 目錄 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企業級實戰&#xff1a;高可用數據采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系統…

Oracle統計信息收集時的鎖持有階段

Oracle統計信息收集時的鎖持有階段 1 準備階段&#xff08;共享模式鎖&#xff09; 鎖類型&#xff1a;對象級共享鎖&#xff08;S鎖&#xff09; 持續時間&#xff1a;通常1-5秒 主要操作&#xff1a; 驗證對象存在性和權限檢查統計信息首選項設置確定采樣方法和并行度 監…

shell常用語法

一、shell變量 定義變量語法&#xff1a; 變量名值 # 等號兩邊不能有空格 示例&#xff1a; #!/bin/bash name"Alice" echo "Hello, $name!" # 使用變量使用變量-語法&#xff1a; 兩種方式&#xff1a; 第一種&#xff1a;${變量名} 第二種&#x…

《教育退費那些事兒:從困境到破局》

《教育退費那些事兒&#xff1a;從困境到破局》 教育退費&#xff1a;不容忽視的熱點問題 在當今社會&#xff0c;教育消費已成為家庭支出的重要組成部分。無論是 K12 階段的學科輔導、藝術特長培訓&#xff0c;還是成人的職業技能提升、學歷繼續教育&#xff0c;家長和學生們…

老字號煥新案例:天貓代運營如何讓傳統品牌年輕化破圈

老字號煥新案例&#xff1a;天貓代運營如何讓傳統品牌年輕化破圈 在消費升級與年輕化浪潮的沖擊下&#xff0c;傳統老字號品牌常面臨“有歷史無活力、有產品無流量”的困境。如何借助電商平臺實現品牌煥新&#xff0c;成為其破局的關鍵。品融&#xff08;PINKROON&#xff09…

高可靠低紋波國產4644電源芯片在工業設備的應用

摘要 隨著工業自動化和智能化的飛速發展&#xff0c;工業設備對于電源芯片的性能和可靠性提出了前所未有的嚴格要求。電源芯片作為工業設備的核心供電組件&#xff0c;其性能直接影響到整個設備的運行效率和穩定性。本文以國科安芯的ASP4644四通道降壓穩壓器為例&#xff0c;通…

Vue組件-霓虹燈:技術解析與實現

Vue組件-霓虹燈&#xff1a;技術解析與實現 本文將詳細解析如何使用Vue 3實現一個動態炫彩霓虹燈效果。 預覽 概述 此Vue組件創建了一個由7個同心圓環組成的霓虹燈效果&#xff0c;每個圓環具有彩虹中的一種顏色&#xff08;紅、橙、黃、綠、藍、靛、紫&#xff09;。這些圓…

【實戰教程】從零實現DeepSeek AI多專家協作系統 - Spring Boot+React打造AI專家團隊協作平臺

&#x1f680; 本項目是DeepSeek大模型應用系列的V3版本&#xff0c;基于V1和V2版本的功能進行全面升級&#xff0c;引入了多智能體協作機制&#xff01; 系列教程推薦閱讀順序&#xff1a; 【V1版本】零基礎搭建DeepSeek大模型聊天系統 - Spring BootReact完整開發指南【V2版本…

第8章-5 sql的執行順序

上一篇&#xff1a;《第8章-4 查詢性能優化2》&#xff0c;接著來了解查詢的執行順序&#xff0c;了解順序對于優化會有幫助。 1&#xff0c;sql編寫順序 select distinct 查詢字段 from 表名 JOIN 表名 ON 連接條件 where 查詢條件 group by 分組字段 having 分組后…

設計模式學習整理

目錄 UML類圖 設計模式六大原則 1.單一職責原則 2.里氏替換原則 3.依賴倒置原則 4.接口隔離原則 5.迪米特法則(最少知道原則) 6.開(放封)閉原則 設計模式分類 1.創建型模式 2.結構型模式 4.行為型模式 一、工廠模式(factory——簡單工廠模式和抽象工廠模式) 1.1、…

Linux干貨(二)

前言 從B站黑馬程序員Linux課程摘選的學習干貨&#xff0c;新手友好&#xff01;若有侵權&#xff0c;會第一時間處理。 目錄 前言 1.cd pwd命令 1.cd命令的作用 2.pwd命令的作用 2.相對路徑絕對路徑和特殊路徑符 1.相對路徑和絕對路徑 1.絕對路徑 2.相對路徑 2.特殊…

ngx_http_keyval_module動態鍵值管理

一、模塊安裝與驗證 檢查模塊是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;說明模塊已編譯進 NGINX。 若未找到&#xff0c;請聯系你的 NGINX 供應商&#xff0c;獲取商業版或重新編譯并啟用該模塊&am…

upload-labs通關筆記-第4關 文件上傳之.htacess繞過

目錄 一、.htacess 二、代碼審計 三、php ts版本安裝 1、下載ts版本php 2、放入到phpstudy指定文件夾中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重啟小皮 7、切換…

LeetCode 88. 合并兩個有序數組 | Python 最簡寫法 + 實戰注釋

在日常刷題和面試中,「合并兩個有序數組」是一個經典基礎題。雖然屬于簡單難度,但它非常考察你的數組操作技巧和代碼優化能力。本篇文章將帶你從基礎解法入手,進階到最簡潔的三元表達式寫法,理解每一行代碼背后的邏輯。 ?? 題目描述 給你兩個按 非遞減順序 排列的整數數組…

Kafka進階指南:從原理到實戰

目錄 一、Kafka 基礎回顧 二、生產者進階 2.1 數據生產流程深度解析 2.2 關鍵配置參數詳解 2.3 序列化與自定義序列化器 三、消費者進階 3.1 消費方式與原理 3.2 分區分配策略 3.2.1 Range&#xff08;范圍&#xff09;策略 3.2.2 Round - Robin&#xff08;輪詢&…

Lightpanda開源瀏覽器:專為 AI 和自動化而設計的無界面瀏覽器

?一、軟件介紹 文末提供程序和源碼下載 Lightpanda開源瀏覽器&#xff1a;專為 AI 和自動化而設計的無界面瀏覽器&#xff1b; Javascript execution Javascript 執行Support of Web APIs (partial, WIP)支持 Web API&#xff08;部分、WIP&#xff09;Compatible with Pla…

團結引擎開源車模 Sample 發布:光照渲染優化 動態交互全面體驗升級

光照、材質與交互效果的精細控制&#xff0c;通常意味著復雜的技術挑戰&#xff0c;但借助 Shader Graph 14.1.0(已內置在團結引擎官方 1.5.0 版本中)&#xff0c;這一切都變得簡單易用。通過最新團結引擎官方車模 Sample&#xff0c;開發者能切身感受到全新光照優化與編輯功能…