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

SQL Server SQL 注入攻擊完整防禦指南:攻擊類型、參數化查詢、掃描工具與程式碼審查

     編輯:關於SqlServer

七大 SQL 注入攻擊類型

類型原理範例危害
1. 未過濾轉義字元單引號閉合原查詢,注入任意 SQL' OR '1'='1 → 繞過登入資料洩露、繞過驗證
2. 型別處理不當數值欄位未驗證型別,直接拼接1; DROP TABLE users資料破壞、結構破壞
3. 資料庫引擎漏洞MySQL mysql_real_escape_string() 編碼繞過特定字元集下繞過跳脫繞過防護
4. 盲目注入無回顯,透過邏輯判斷 (真/假、延遲、錯誤) 推測資料IF (SELECT SUBSTRING(pwd,1,1)='a') WAITFOR DELAY '0:0:5'逐位元竊取敏感資料
5. 條件回應頁面根據邏輯真假顯示不同內容AND 1=1 正常 / AND 1=2 異常確認注入點
6. 條件錯誤強制產生錯誤 (除零、轉換失敗) 判斷真假CASE WHEN (SELECT 1) = 1 THEN 1/0 ELSE 1 END繞過 WAF、提取資料
7. 時間延遲注入長耗時操作 (WAITFOR、重度運算) 計時判斷WAITFOR DELAY '0:0:10'無回顯環境提取資料

自動化攻擊工具鏈:Asprox Trojan 案例

  1. 垃圾郵件傳播僵屍網路
  2. 感染主機下載二進位模組
  3. 搜尋引擎掃描 inurl:.asp、inurl:.aspx 表單頁
  4. 自動化 SQL 注入攻擊 (UNION、盲目、時間)
  5. 植入惡意 JavaScript、重導向、下載木馬
  6. 竊取帳號、金融資訊、勒索軟體

核心防禦:參數化查詢 (Prepared Statements)

C# / ADO.NET

// 錯誤:字串拼接
string sql = "SELECT * FROM Users WHERE Name = '" + userName + "'";

// 正確:參數化
string sql = "SELECT * FROM Users WHERE Name = @Name";
using (var cmd = new SqlCommand(sql, conn))
{
    cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = userName;
    // 執行...
}

Java / JDBC

PreparedStatement ps = conn.prepareStatement("SELECT * FROM Users WHERE Name = ?");
ps.setString(1, userName);
ResultSet rs = ps.executeQuery();

PHP / PDO

$stmt = $pdo->prepare("SELECT * FROM Users WHERE Name = :name");
$stmt->execute([':name' => $userName]);

Python / pyodbc

cursor.execute("SELECT * FROM Users WHERE Name = ?", userName)

參數化查詢為何有效?

  • SQL 文本與資料分離傳輸,資料庫先編譯計畫,再綁定參數值
  • 參數值永不被解析為 SQL 語法,單引號、分號、註解皆視為字面資料
  • 計畫快取重用,效能優於動態 SQL

多層次防禦體系

  1. 程式碼層:強制參數化、ORM (EF、Dapper、Hibernate) 原生參數化、禁止動態 SQL 拼接
  2. 輸入驗證層:白名單驗證 (長度、型別、格式、正則)、拒絕清單不可靠
  3. 資料庫層:最小權限帳號 (僅 SELECT/INSERT/UPDATE/DELETE)、拒絕 DDL/DCL、DENY EXECUTE ON xp_cmdshell
  4. 錯誤處理層:生產環境統一錯誤頁面,不回傳堆疊追蹤、SQL 文本、資料庫結構
  5. 掃描與監控層:
     專業掃描器:Acunetix、Burp Suite、OWASP ZAP、SQLMap
     WAF:ModSecurity (CRS 規則集)、雲端 WAF (Cloudflare、AWS WAF、Azure Front Door)
     資料庫審計:SQL Server Audit、Extended Events 記錄失敗登入、DDL、權限變更
  6. 開發流程層:
     程式碼審查清單 (必檢參數化)
     SAST 工具:SonarQube、Checkmarx、Fortify
     上線前滲透測試
     事件回應預案

動態 SQL 安全模式 (不得已時)

-- 僅用於結構描述/物件名稱動態,資料值仍用參數
DECLARE @Schema SYSNAME = QUOTENAME(@InputSchema)  -- QUOTENAME 防注入
DECLARE @Table SYSNAME = QUOTENAME(@InputTable)
DECLARE @SQL NVARCHAR(MAX) = N'SELECT * FROM ' + @Schema + N'.' + @Table + N' WHERE Id = @Id'
EXEC sp_executesql @SQL, N'@Id INT', @Id
  • QUOTENAME() 安全包裝識別碼
  • sp_executesql 參數化資料值
  • 嚴禁 EXEC('SQL ' + @Input)

快速自測:輸入單引號檢測法

在所有輸入框輸入 ' (單引號) → 若頁面拋錯 (黃畫面、500、SQL 錯誤訊息) → 99.9% 存在注入漏洞。

法規與合規

  • OWASP Top 10 A03:2021 – Injection
  • PCI DSS 要求 6.5.1 防禦注入
  • GDPR 第 32 條資料安全
  • ISO 27001 A.14.2.5 安全系統工程原則
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved