萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

vBulletin 2.3.x SQL 注入漏洞分析:calendar.php UNION 攻擊

⚠️ 安全警示

本文僅供安全研究、漏洞修復、歷史教學用途。嚴禁用於非授權系統測試或攻擊。請遵守當地法律法規,負責任地揭露漏洞。

漏洞詳情

  • 影響版本: vBulletin 2.3.x
  • 漏洞檔案: calendar.php
  • 漏洞參數: eventid
  • 漏洞類型: SQL Injection (UNION-based)
  • 代碼位置: 第 585 行附近

脆弱代碼片段

else if ($action == "edit") {
    $eventinfo = $DB_site->query_first(
        "SELECT allowsmilies, public, userid, eventdate, event, subject 
         FROM calendar_events 
         WHERE eventid = $eventid"
    );
}

問題: $eventid 直接拼接進 SQL 字串,未經過滿足/參數化處理。

攻擊向量 (MySQL 4.0+)

利用 UNION SELECT 將任意資料查詢結果合併回原查詢:

https://www.example.com/bbs/calendar.php?action=edit&eventid=12 UNION (SELECT allowsmilies, public, userid, '0000-0-0', user(), version() FROM calendar_events WHERE eventid = 13) ORDER BY eventdate

攻擊原理解析

  1. eventid=12 使原查詢可能無結果或返回已知資料
  2. UNION 附加第二個查詢,欄位數、型別必須匹配
  3. user() 獲取資料庫用戶,version() 獲取版本
  4. query_first() 只返回第一行 → 攻擊者構造確保惡意查詢排在第一行

修復方案

1. 參數化查詢(最佳)

$eventid = intval($eventid);  // 強制轉整數
$eventinfo = $DB_site->query_first(
    "SELECT allowsmilies, public, userid, eventdate, event, subject 
     FROM calendar_events 
     WHERE eventid = $eventid"
);

2. 預處理語句(現代 PDO/MySQLi)

$stmt = $pdo->prepare("SELECT ... FROM calendar_events WHERE eventid = ?");
$stmt->execute([$eventid]);
$eventinfo = $stmt->fetch();

3. 輸入驗證與過濾

if (!ctype_digit($eventid)) die('Invalid eventid');

防禦最佳實踐

  1. 永不信任使用者輸入:所有 $_GET/$_POST/$_COOKIE 視為污染資料
  2. 全域參數化查詢:杜絕字串拼接 SQL
  3. 最小權限原則:資料庫帳號僅擁有必要權限
  4. 錯誤訊息不外露:生產環境關閉 display_errors
  5. WAF/輸入過濾:ModSecurity、應用層過濾
  6. 定期更新:vBulletin 2.3.x 已停止維護,強烈建議升級

責任揭露流程

  1. 確認漏洞存在
  2. 聯繫廠商/維護團隊(security@vbulletin.com)
  3. 提供詳細復現步驟、影響範圍、建議修復
  4. 給予合理修復時間(通常 90 天)
  5. 協調發布公告與修補程式
copyright © 萬盛學電腦網 all rights reserved