
1. 什么是 SQL 注入SQL 注入是指攻擊者將惡意 SQL 代碼插入到輸入?yún)?shù)中應(yīng)用程序未進行過濾便將其拼接到 SQL 查詢語句中導(dǎo)致數(shù)據(jù)庫執(zhí)行了非預(yù)期的命令。一句話解釋就是你輸入的內(nèi)容被直接當(dāng)作代碼執(zhí)行了2. 四種常見類型2.1 聯(lián)合查詢注入原理利用 UNION 關(guān)鍵字將攻擊者的查詢結(jié)果拼接到正常查詢結(jié)果后面在頁面上回顯。步驟1. 猜列數(shù)1 ORDER BY 1 --2. 找顯示位-1 UNION SELECT 1,2,3 --3. 查數(shù)據(jù)-1 UNION SELECT 1,database() --示例-1 UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schemadvwa --適用條件頁面有顯示位能直接看到查詢結(jié)果。2.2 報錯注入原理利用 updatexml() 或 extractvalue() 函數(shù)故意構(gòu)造非法 XPath 路徑觸發(fā)數(shù)據(jù)庫報錯在錯誤信息中帶出數(shù)據(jù)。示例1 AND updatexml(1, concat(~, database(), ~), 1) --適用條件頁面能顯示 SQL 報錯信息。2.3 布爾盲注原理頁面只有兩種狀態(tài)“存在”/“不存在”通過構(gòu)造布爾條件逐位猜出數(shù)據(jù)。猜長度1 AND LENGTH(database())4 --以此類推。猜字符1 AND SUBSTRING(database(),1,1)d --以此類推。適用條件頁面無數(shù)據(jù)顯示但能區(qū)分“真/假”狀態(tài)。2.4 時間盲注原理通過 SLEEP() 函數(shù)制造時間差根據(jù)頁面響應(yīng)時間判斷條件是否成立。示例1 AND IF(LENGTH(database())4, SLEEP(5), 0) --適用條件頁面沒有任何變化只能靠響應(yīng)時間判斷。3. 防御 SQL 注入最有效的方法是參數(shù)化查詢預(yù)編譯語句。將 SQL 代碼與數(shù)據(jù)分離用戶輸入永遠不會被當(dāng)作代碼執(zhí)行。其他防御措施對輸入進行過濾與轉(zhuǎn)義最小權(quán)限原則關(guān)閉錯誤回顯隱藏數(shù)據(jù)庫報錯信息4. 總結(jié)SQL 注入的本質(zhì)是用戶輸入被拼接到了 SQL 語句中。防御的核心是不信任用戶輸入使用參數(shù)化查詢是根本解決手段。**免責(zé)聲明**本文所有操作均在自建虛擬機環(huán)境中完成僅用于網(wǎng)絡(luò)安全學(xué)習(xí)與研究。嚴禁用于任何非法用途違者自行承擔(dān)后果。