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

SQL 注入攻擊完整剖析:原理演示、自動化工具威脅與多層防禦體系

     編輯:Oracle 資料庫基礎

SQL 注入為何成為新手盲區?

ASP 門檻低、見效快,新手能在短時間構建功能完整的動態網站。但「能跑」不代表「安全」。介面友好度、執行效能、資安防護是區分新手與資深工程師的三大分水嶺。SQL 注入正是新手最易忽視、危害最大的漏洞類型。

攻擊原理:從錯誤訊息中偷渡資訊

第一階段:探測注入點

正常請求:  https://site/show.asp?ID=444
後端 SQL:  SELECT * FROM News WHERE ID = 444

測試請求:  https://site/show.asp?ID=444 AND USER>0
後端 SQL:  SELECT * FROM News WHERE ID = 444 AND USER>0
-- 強制型別轉換錯誤,洩露資料庫版本、連接帳號(如 sonybb)

第二階段:提取敏感資料

攻擊請求:  https://site/show.asp?ID=444 AND (SELECT PassWord FROM Login WHERE User_Name='admin')>0
錯誤訊息:  [SQL Server] 將 varchar 值 '!@#*&admin' 轉換為 int 失敗
-- 紅框部分即為管理員密碼!

攻擊者利用型別轉換錯誤回顯(Error-based Injection),將查詢結果強制轉為數值型別觸發錯誤,將資料「偷渡」在錯誤訊息中。

工具化威脅:NBSI 2.0 將入侵降為「點點滑鼠」

手動注入需數小時甚至數天,但 NBSI (Network Base SQL Injection) 2.0 等自動化工具可在數分鐘內完成:

  1. 掃描注入點 → 識別資料庫類型、連接權限
  2. 枚舉資料庫/表/欄位名稱
  3. 自動猜解管理員帳號密碼
  4. 取得後台權限 → 上傳 ASP Webshell → 提權控制伺服器

許多「腳本小子」不懂 ASP/SQL,僅靠工具一天癱瘓十餘站點,僅留「善意警告」與署名,惡性不容小覷。

防禦體系:伺服器端與應用端雙重把關

伺服器管理員:統一錯誤頁面切斷資訊洩露

IIS 設定:將 500;100 錯誤頁從 500-100.asp 改為靜態 500.htm。所有 ASP 錯誤統一回傳 HTTP 500,攻擊者無法獲得資料庫結構、帳號等偵察資訊。

代價:開發除錯不便,但生產環境應優先安全。可建立測試環境供開發使用詳細錯誤。

伺服器管理員:嚴格 IIS 執行權限與資料庫帳號分級

  • 靜態網站:無執行權限
  • 動態網站:僅腳本(禁止可執行檔)
  • 上傳目錄:無執行權限(防 Webshell 執行)
  • 資料庫帳號:最小權限原則,僅授予必要表的 SELECT/INSERT/UPDATE/DELETE,**嚴禁 SA 權限**給網站應用(否則 xp_cmdshell 可奪取作業系統控制權)

應用開發人員:輸入驗證與參數化查詢雙管齊下

方案一:通用防注入模組(如「楓葉 SQL 通用防注入 V1.0」)

在每個接收參數的頁面 ,攔截含 exec, insert, select, delete, update, count, *, xp_cmdshell, -- 等關鍵字的請求並終止執行。

方案二:參數化查詢(根治之道)

' 錯誤寫法
sql = "SELECT * FROM Users WHERE Name = '" & Request("name") & "'"

' 正確寫法:Command 物件參數化
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE Name = ?"
cmd.Parameters.Append cmd.CreateParameter("@name", 200, 1, 50, Request("name"))
Set rs = cmd.Execute

參數化查詢將資料與程式碼徹底分離,資料庫引擎將參數視為字面值而非可執行碼,從根本上消除注入可能。

應用開發人員:密碼加鹽雜湊儲存

  • 使用 BCrypt / PBKDF2 / Argon2 等慢速雜湊演算法(而非 MD5/SHA1)
  • 每筆密碼獨立隨機 Salt
  • 即使資料庫外洩,攻擊者也無法透過彩虹表或 GPU 破解還原明文
  • NBSI 等工具無 UPDATE 功能,無法竄改密碼雜湊值

總結與反思

SQL 注入之所以橫行,核心在於「資料與程式碼未分離」。參數化查詢是銀彈,輸入驗證是護盾,統一錯誤頁是迷彩,最小權限是護城河。開發者應建立「所有外部輸入皆不可信」的防禦思維,將安全內建於開發生命週期每個環節,而非事後補丁。

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