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

什麼是 SQL 注入攻擊?原理、手法與防禦全解析

     編輯:關於SqlServer

SQL 注入攻擊簡介

SQL 注入(SQL Injection)是 Web 應用程式最常見且危害最大的安全漏洞之一。駭客透過在輸入欄位、URL 參數或 Cookie 中植入惡意 SQL 片段,繞過應用程式的邏輯檢查,直接操控後端資料庫執行非預期的查詢、修改甚至刪除操作。

攻擊原理

當開發人員未對使用者輸入進行嚴格驗證與參數化處理,直接將輸入拼接到 SQL 字串中時,資料庫會將攻擊者提供的惡意字串視為合法 SQL 指令的一部分而執行。例如:

-- 原本程式碼
String sql = "SELECT * FROM users WHERE username = '" + input + "' AND password = '" + pwd + "'";

-- 攻擊者輸入:admin' --
-- 實際執行 SQL 變為:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx'
-- 註解符號 -- 導致密碼驗證被忽略,直接以 admin 身分登入

典型攻擊步驟

  1. 探測注入點:嘗試輸入單引號 '、雙引號 "、分號 ;、註解符號 -- 等,觀察頁面回應錯誤訊息或行為異常。
  2. 判斷資料庫類型:利用各資料庫特有的函數(如 @@version、version()、sqlite_version())或系統表差異識別後端 DBMS。
  3. 提取資訊:透過 UNION SELECT、盲注、錯誤回顯等技術,竊取資料庫結構、帳號密碼、敏感資料。
  4. 提權與持久化:若資料庫權限過高(如 sa、root),可能進一步呼叫擴展預存程序(xp_cmdshell)、寫入 Web Shell、修改登入機制以取得伺服器控制權。

常見注入類型

類型特徵範例
聯集注入利用 UNION 合併多個查詢結果' UNION SELECT null, username, password FROM users--
錯誤型注入透過故意製造錯誤讓資料庫吐出資料' AND 1=CONVERT(int, (SELECT TOP 1 name FROM sysobjects))--
布林盲注根據頁面真/假回應逐位推測資料' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a'--
時間盲注利用延遲函數判斷條件真假'; IF (SELECT TOP 1 name FROM sysobjects)='a' WAITFOR DELAY '0:0:5'--
堆疊查詢支援多語句執行的資料庫可直接執行 DDL/DML'; DROP TABLE users;--

防禦措施

1. 參數化查詢(最有效)

-- Java (PreparedStatement)
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();

-- C# (SqlCommand)
string sql = "SELECT * FROM users WHERE username = @user AND password = @pwd";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@user", username);
cmd.Parameters.AddWithValue("@pwd", password);

2. 輸入驗證與白名單

  • 限制輸入長度、字元集(如僅允許英數字)。
  • 對識別碼、枚舉值使用白名單驗證,拒絕非預期值。

3. 最小權限原則

  • 應用程式連線資料庫使用最低權限帳號,嚴禁使用 sa、root、admin 等高權限帳號。
  • 移除不必要的擴展預存程序(xp_cmdshell、sp_OACreate 等)。

4. 錯誤訊息隱藏

生產環境關閉詳細錯誤回顯,統一導向友善錯誤頁面,避免洩露資料庫結構、SQL 片段等敏感資訊。

5. WAF 與定期掃描

部署 Web 應用程式防火牆(WAF)攔截已知攻擊特徵;定期使用自動化掃描工具(如 SQLMap、OWASP ZAP)進行滲透測試。

總結

SQL 注入並非高深技術,而是開發疏忽造成的經典漏洞。掌握參數化查詢、最小權限、輸入驗證三大核心防禦,即能有效杜絕 99% 以上的注入風險。安全是系統設計的基因,而非事後補丁。

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