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

SQL 查詢結果集對注入攻擊的影響與利用技巧深度解析

     編輯:關於SqlServer

前言:錯誤回饋是注入判斷的關鍵

SQL 注入中,「錯誤回饋」指頁面回應與正常情況不同的結果。高手極重視此點,因為它是精準判斷注入點、推斷資料庫結構的核心依據。本文系統整理錯誤類型、產生原理及實戰利用方式。

三大錯誤回饋類型

  1. 邏輯錯誤:語法正確但條件導致結果集差異 (如 1=1 vs 1=2)。
  2. 語法錯誤:SQL 解析失敗,導致腳本中斷或回傳空結果集。
  3. 執行階段錯誤:如 MySQL BENCHMARK() 導致超時、路徑洩露、盲注判斷依據。

一、邏輯錯誤:結果集差異的本質

以 $sql = "select * from news where id=$_GET[id]" 為例:

  • id=1 and 1=2 → 結果集為 NULL,程式取值失敗、無顯示或跳轉。Oracle/PostgreSQL 可能在頁面顯示字串 null。
  • id=1 or 1=1 → 結果集龐大 (全表)。若程式用迴圈讀取 (不良習慣),可能極慢或取到非預期第一筆 (導致頁面內容變化)。

核心:皆因結果集不同。靈活掌握結果集行為是關鍵,非單純經驗。

二、語法錯誤:資訊洩露的金鑰

SQL Server、PostgreSQL、Sybase 的語法錯誤訊息極豐富,可直接提取資料庫結構、版本、資料。若伺服器/腳本屏蔽錯誤,表現為結果集不存在 (連 NULL 都不是),攻擊者收到類似邏輯錯誤的空回應。Oracle/PostgreSQL 可能顯示 null 字樣。

三、執行階段錯誤:盲注與副作用利用

  • MySQL BENCHMARK() 拖延執行 → 超時 → 洩露實體路徑。
  • 利用超時差異作為盲注真/假判斷通道。

四、邏輯與語法錯誤結合:IFF/CASE 技巧

當回饋不明顯時,利用條件函數製造型別衝突觸發語法錯誤:

-- 假設支援 IFF(條件, 真值, 假值)
id=1 and 1=IFF(1=1, 1, 'no')   -- 回傳數字 1,型別一致,成功
id=1 and 1=IFF(1=2, 1, 'no')   -- 回傳字串 'no',與數字 1 型別衝突 → 語法錯誤

可惜支援 IFF 的資料庫較少,但 CASE WHEN、CONVERT、CAST 同理可構造。

結果集在注入中的實戰利用原理

1. 從 OR/= 開始:登入繞過

$sql = "select top 1 * from admin where username='$username' and password=md5('$password')"
-- 輸入 ' OR ''=' → WHERE 子句恆真 → 回傳第一筆管理員記錄 → 驗證通過

2. 現代驗證模式:分離查詢與比對

$sql = "select top 1 * from admin where username='$username'"
-- 程式再以記錄集中的密碼欄位比對 MD5
-- ' OR ''=' 仍產生結果集 (第一筆),但密碼比對失敗 → 登入失敗

突破:用 UNION 構造想要的結果集:

' AND 1=2 UNION SELECT TOP 1 username, 'md5_of_123456', id FROM admin WHERE username='admin

產生的記錄集密碼欄位為已知雜湊值,配合帳號 admin/123456 通過驗證並繼承權限。

3. 盲狙與歷史經典案例

  • 全盲注入 (XXX 法) 需嚴格型別匹配 (SQL Server 2000/Sybase),UNION 型別不符會語法錯誤導致失效。
  • eWebEditor 上傳木馬經典案例:即利用 UNION 操作結果集寫入惡意檔案路徑。

總結

深入理解 結果集如何影響應用程式流程,比死記 Payload 更關鍵。掌握邏輯/語法/執行錯誤的表現差異,善用 UNION、條件函數、型別轉換構造可觀測差異,是進階注入測試的核心能力。

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