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

SQL 注入攻擊實戰複盤 (上):從登入頁繞過到資料庫結構逆向推導

     編輯:MySQL 綜合教學

攻擊目標環境

  • 自建 ASP.NET 應用,IIS 6,SQL Server 後端。
  • 登入頁:帳號/密碼表單 + 「忘記密碼」郵件重設功能。
  • 屬於 盲目注入:無源碼、無錯誤回顯、需透過布林推導。

第一步:確認注入點

在 Email 欄位輸入 ' (單引號) → 回傳 500 Server Error → 證明輸入未過濾、直接拼接 SQL。

-- 推測原始 SQL
SELECT fieldlist FROM table WHERE field = '$EMAIL';

輸入 steve@unixwiz.net' 產生:

SELECT fieldlist FROM table WHERE field = 'steve@unixwiz.net'';  -- 語法錯誤

第二步:布林盲注驗證

輸入 ' OR 'x'='x → 條件永真 → 回傳「密碼已寄送至 random.person@example.com」。

SELECT fieldlist FROM table WHERE field = 'anything' OR 'x'='x';

觀察到三種回應模式:

  1. 「密碼已寄送」→ 查詢有結果 (TRUE)
  2. 「無法識別 Email」→ 查詢無結果 (FALSE)
  3. 「500 錯誤」→ SQL 語法錯誤 (ERROR)

第三步:欄位名稱枚舉

利用 AND column IS NULL 不改變結果集特性,配合 -- 註解掉後續 SQL:

-- 測試 email 欄位
' AND email IS NULL --

-- 回傳「無法識別」→ email 欄位存在
-- 回傳 500 → 欄位名錯誤

成功枚舉欄位:email, passwd, login_id, full_name。

第四步:表名推導 (待續)

下一步將利用 UNION SELECT、系統表 INFORMATION_SCHEMA、錯誤回顯進一步奪取結構與資料。

防禦對策 (開發者必讀)

  1. 參數化查詢 / 預編譯:SqlCommand.Parameters.AddWithValue、PreparedStatement、ORM 參數綁定。
  2. 最小權限帳號:應用連線帳號僅擁有必要 CRUD,無 DROP/CREATE/xp_cmdshell。
  3. 錯誤訊息不外露:生產環境關閉詳細錯誤頁面,統一友善提示。
  4. WAF / 輸入驗證:雙重防線,但不可替代參數化。
  5. 定期滲透測試:自動掃描 + 人工驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved