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

SQL 進階技巧:精妙實用語句模式與注入利用原理

     編輯:關於SqlServer

前言

本文匯總兩類「精妙」SQL:一類是解決實際業務問題的高效語句模式 (複製表、外部聯結、分組最新記錄、隨機抽樣、刪除關聯孤兒資料);另一類從安全角度剖析 SQL 注入中結果集差異 (邏輯/語法/執行錯誤) 的利用原理,助開發者理解防禦本質。

一、 實戰精妙語句模式

場景SQL 模式
複製表結構SELECT * INTO b FROM a WHERE 1<>1;
複製表資料INSERT INTO b (c1,c2,c3) SELECT d,e,f FROM a;
顯示文章/作者/最新回覆SELECT a.title, a.username, b.adddate FROM a, (SELECT MAX(adddate) adddate FROM a GROUP BY title) b;
外部聯結查詢SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT OUT JOIN b ON a.a = b.c;
排程提前 5 分鐘提醒SELECT * FROM schedule WHERE DATEDIFF(minute, start_time, GETDATE()) > 5;
刪除主表中副表無對應資料DELETE FROM info WHERE NOT EXISTS (SELECT 1 FROM infobz WHERE info.infid = infobz.infid);
複雜庫存對帳 (Oracle 語法)多層子查詢 + TO_CHAR 日期截取 + NVL 空值處理 + 外部聯結 (+),對比月度入庫/庫存變動。
學生資料篩選 (動態 WHERE)SELECT * FROM studentinfo WHERE NOT EXISTS (SELECT 1 FROM student WHERE studentinfo.id=student.id) AND dept=@dept AND major=@major ORDER BY gender, origin, score DESC;

二、 SQL 注入:結果集差異的三類錯誤與利用原理

1. 邏輯錯誤 (Boolean-based)

SELECT * FROM news WHERE id=1 AND 1=2 → 結果集為空 → 應用層無資料顯示/跳轉。
SELECT * FROM news WHERE id=1 OR 1=1 → 結果集暴增 → 若應用取第一筆 → 可能非預期記錄 → 頁面內容異常。
本質: WHERE 條件真假導致結果集基數變化,引發應用層邏輯分支差異。

2. 語法錯誤 (Error-based)

構造語法錯誤 (如型別轉換失敗、函數參數錯誤) 觸發資料庫拋出錯誤訊息。若應用未屏蔽錯誤 → 錯誤訊息回顯於頁面 (含資料庫版本、表結構、資料內容)。
利用: `CAST((SELECT TOP 1 name FROM sysobjects) AS INT)` 強制轉換失敗,錯誤訊息攜帶表名。Oracle/PostgreSQL 空結果集常顯示 `NULL` 字串,亦為特徵。

3. 執行錯誤 (Time-based Blind)

MySQL `BENCHMARK(1000000, MD5('x'))`、SQL Server `WAITFOR DELAY '0:0:5'` 造成執行緒阻塞。頁面回應延遲 → 推斷條件真假。適用於無回顯、無錯誤訊息的盲注場景。

4. 邏輯+語法結合 (型別衝突)

利用 `IFF(1=1, 1, 'no')` 返回數字,`IFF(1=2, 1, 'no')` 返回字串。
id=1 AND 1=IFF(1=1,1,'no') 成功 (數字=數字);
id=1 AND 1=IFF(1=2,1,'no') 失敗 (數字=字串 → 型別轉換錯誤)。
透過「成功/報錯」二元特徵提取位資訊。支援 IFF/CASE/DECODE 的資料庫適用。

三、 結果集在注入中的具體利用

  • 繞過登入: `' OR '1'='1` 使結果集非空,應用層判斷登入成功。
  • 新式驗證繞過: 先查用戶再比對密碼 → `UNION SELECT 'admin', MD5('123456'), 1` 構造期望結果集,密碼欄位被惡意值覆蓋 → 驗證通過。
  • 嚴格型別資料庫 (SQL Server/Sybase): UNION 需欄位數/型別嚴格匹配,盲注需精確構造。
  • 經典案例: eWebEditor 上傳漏洞利用 UNION 注入寫入 Webshell。

四、 防禦核心

  1. 參數化查詢 / 預存程序 (徹底分離代碼與資料)。
  2. 最小權限原則 (應用帳號僅 SELECT/INSERT/UPDATE/DELETE,無 DDL/DCL)。
  3. 錯誤訊息不回顯用戶端 (自定義錯誤頁、記錄至日誌)。
  4. WAF/IDS 攔截異常 SQL 模式。
  5. 定期代碼審計與滲透測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved