明志科技大學校園入口網站利用競爭條件繞過帳號鎖定機制 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00410
  •  發信 Vendor: 明志科技大學
  • Title: 明志科技大學校園入口網站利用競爭條件繞過帳號鎖定機制
  • Introduction: 透過併發封包觸發競爭條件,使多次密碼錯誤嘗試僅被寫入一次,進而成功繞過防暴力破解的次數限制

處理狀態

目前狀態

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

處理歷程

  • 2026/03/24 21:33:02 : 新提交 (由 M4RVjN 更新此狀態)
  • 2026/03/24 21:35:26 : 新提交 (由 M4RVjN 更新此狀態)
  • 2026/03/24 22:27:23 : 新提交 (由 M4RVjN 更新此狀態)
  • 2026/03/24 22:43:23 : 新提交 (由 M4RVjN 更新此狀態)
  • 2026/03/24 22:46:04 : 新提交 (由 M4RVjN 更新此狀態)
  • 2026/03/25 15:04:12 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/04/09 18:22:46 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/04/09 18:22:46 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/04/09 18:22:46 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/04/20 14:44:18 : 已修補 (由 組織帳號 更新此狀態)
  • 2026/04/28 03:00:06 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00410
  • 通報者:M4RVjN (M4RVjN)
  • 風險:中
  • 類型:其他 (Other)

參考資料

暫無資料
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

https://portal.mcut.edu.tw/index.do

敘述

漏洞描述

目標系統的登入驗證機制存在檢查與使用時間差(TOCTOU)的競爭條件漏洞。攻擊者可透過同時發送帶有不同 JSESSIONID 的併發 HTTP 登入封包,繞過會話互斥鎖。這導致後端在處理錯誤登入計數時發生狀態覆寫,使多次密碼錯誤嘗試僅被記錄為一次,進而成功繞過系統設定的防暴力破解與帳號鎖定機制。

重現步驟
  1. 透過腳本發送無狀態請求,獲取獨立會話狀態,從伺服器的 Set-Cookie 標頭中取得多個全新且獨立的 JSESSIONID。此步驟旨在確保每個登入請求皆分配到獨立的 Session 物件,避免後端伺服器因等待同一個 Session 鎖而將併發請求強制序列化。( 腳本於附錄中)
    圖片

  2. 在 Burp Suite Repeater 中,建立多個登入封包(此測試採用七個封包),統一設定為相同的目標帳號與錯誤密碼,各個封包的 JSESSIONID 分別替換為步驟 1 取得的獨立 JSESSIONID。隨後使用 Burp Suite 的 Send group (parallel) 功能,將這批封包同步送出。

    • 併發封包一
      圖片
    • 併發封包二
      圖片
    • 併發封包三
      圖片
    • 併發封包四
      圖片
    • 併發封包五
      圖片
    • 併發封包六
      圖片
    • 併發封包七
      圖片
  3. 在發送完 7 個併發的錯誤登入封包後,觀察回應可以發現僅被記錄一次輸入錯誤。

影響

攻擊者可利用此併發缺陷,對特定目標帳號進行高頻率的密碼猜測,有效提高惡意使用者爆破成功的可能性。

附錄
import requests
import re
url = "https://portal.mcut.edu.tw/index.do"
for i in range(1,9):
    response = requests.get(url)
    set_cookie = response.headers.get('Set-Cookie')
    if set_cookie:
        match = re.search(r'JSESSIONID=([^;]+)', set_cookie)
        if match:
            jsessionid = match.group(1)
            print(f"{jsessionid}")
        else:
            print("未發現 JSESSIONID")
    else:
        print("未發現 Set-Cookie")

擷圖

留言討論

聯絡組織

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