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

MySQL 單位元組與寬位元組 SQL 注入攻擊原理與防禦實戰

     編輯:關於SqlServer

一、單位元組 SQL 注入

MySQL 注入攻擊歷久彌新,典型步驟如下:

  1. 判斷資料庫類型:在 GET 參數加入 /* 或 #(MySQL 註解),如 id=1607 and 1=1/*。
  2. 猜解欄位數:遞增 order by N 直到頁面報錯,得到欄位數。
  3. 聯合查詢竊取資料:利用 UNION SELECT 關聯使用者表,在前端顯示帳號密碼。需猜解表名與欄位名,如欄位數為 5:union select username,password,1,2,3 from user。

防禦對策

  • 資料過濾:在適當位置實施嚴格輸入驗證與過濾,消除多數隱患。
  • 統一加引號:所有資料類型在 SQL 中均以單引號包裹(MySQL 支援)。
  • 轉義處理:使用 mysql_escape_string() 或資料庫原生轉義函式;無原生函式時可用 addslashes() 兜底。

二、寬位元組注入

近期專案中發現。當 PHP 開啟 GPC 或使用 addslashes/iconv 轉義,單引號 ' 會被加反斜線 \ 變為 \'(十六進位 %5C)。若資料庫連線字元集為 GBK 等寬位元組編碼,%df%5c 會被視為一個雙位元組字元「縗」,導致單引號「逃脫」:

%df\' = %df%5c%27 = 縗'

攻擊範例:

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#
// 實際 SQL: select * from cms_user where username = '縗' or 1=1 limit 1,1#' and password=''

根治方案

初始化連線與字元集後,強制設定客戶端字元集為二進位:

mysql_query("SET character_set_client=binary");

此舉使驅動程式以二進位模式處理輸入,徹底杜絕寬位元組編碼導致的注入繞過。

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