SQL注入攻擊利用應用程序輸入驗證缺陷,結合 UNION 查詢與系統表(sysobjects、syscolumns)可枚舉數據庫結構、竊取敏感數據。本文從攻擊原理出發,構建分層防禦體系,嚴禁用於非授權測試環境。
ORDER BY N + UNION SELECT 1,2,...N FROM sysobjectsUNION SELECT 1,@@VERSION,DB_NAME(),...SELECT TOP 1 NAME FROM sysobjects WHERE xtype='U' AND NAME NOT IN (SELECT TOP 0 NAME...) 遞增 TOP N 遍歷。SELECT TOP 1 NAME FROM syscolumns WHERE ID IN (SELECT ID FROM sysobjects WHERE NAME='target_table')...UNION SELECT TOP 1 1, username, password FROM admin...前提條件:注入點有效、無單引號過濾、具備DBO權限。
-- 錯誤示範 (拼接)
sql = "SELECT * FROM users WHERE id=" & Request("id")
-- 正確示範 (參數化)
cmd.CommandText = "SELECT * FROM users WHERE id=@id"
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , Request("id"))
原理:數據與代碼分離,徹底消除注入可能。
SELECT/INSERT/UPDATE/DELETE 業務必需權限。sysadmin、db_owner 或訪問系統表(sysobjects/syscolumns)的權限。xp_cmdshell, xp_regread, xp_dirtree 等。ISNUMERIC() 或正則 ^\d+$。UNION SELECT、sysobjects、xp_ 等特征的惡意請求。UNION、系統表訪問)。sysobjects、導出數據)。系統表注入的根因是「拼接SQL」與「過高權限」。參數化查詢+最小權限賬號可阻斷99%以上注入風險。安全是體系工程,需代碼、數據庫、網絡、運維多層疊加,定期滲透測試驗證防禦有效性。