首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL單字節與寬字節SQL注入原理、利用鏈與修復方案

     編輯:MySQL 資料庫相關知識

一、單字節注入經典鏈路

  1. 判斷注入點:id=1607 AND 1=1/*(/*/#截斷後續SQL)
  2. 爆欄位數:ORDER BY 1..N至報錯,N-1即列數
  3. 聯合查詢撞庫:UNION SELECT username,password,1,2,3 FROM user → 前端直接顯示帳號密碼

單字節防禦三板斧

  1. 參數化查詢/預處理(根治)
  2. 全量轉義:mysql_real_escape_string()或addslashes()(次選)
  3. 數據入庫統一加引號:哪怕數字也'123',防id=1 OR 1=1繞過

二、寬字節注入(GBK/Big5編碼環境)

核心原理

%df'經addslashes→%df\'(\=0x5c)
GBK雙字節:0xdf 0x5c合法字符 **縗** → 單引號**逃逸**
最終SQL:WHERE username='縗' OR 1=1 LIMIT 1,1#'

漏洞復現代碼

mysql_query("SET NAMES 'GBK'");
$user = mysql_escape_string($_GET['user']);
$sql = "SELECT * FROM cms_user WHERE username='$user' AND password='$pass'";

Payload:user=%df' OR 1=1 LIMIT 1,1#

徹底修復

mysql_query("SET NAMES 'GBK'");
mysql_query("SET character_set_client=binary");  // 關鍵:客戶端按二進制處理,禁用多字節解析

或**統一UTF-8**(無多字節逃逸風險)+ **預處理語句**。

總結

  • 單字節:addslashes可防,但**預處理才是銀彈**
  • 寬字節:編碼層面逃逸,**設置character_set_client=binary或棄用GBK**
  • **永不拼接SQL**,參數化贏遍天下
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved