Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00383
- Vendor: 翔評互動股份有限公司
- Title: AlleyPin 翔評互動 內部客戶管理 API 未授權存取,免費帳號即可取得大量診所完整資料(聯絡人、手機、地址、Email、統編),且 VAT 欄位被濫用儲存明文密碼
- Introduction: 內部客戶管理 API 存在跨服務 JWT 驗證缺失。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/03/22 13:28:11 : 新提交 (由 Marco 更新此狀態)
- 2026/03/22 13:42:10 : 新提交 (由 Marco 更新此狀態)
- 2026/03/22 13:47:53 : 新提交 (由 Marco 更新此狀態)
- 2026/03/25 14:30:20 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/26 19:30:27 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/26 19:30:27 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/26 19:30:27 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/14 10:56:48 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/05/18 06:17:19 : 新提交 (由 Marco 更新此狀態)
- 2026/05/18 14:05:59 : 新提交 (由 Marco 更新此狀態)
- 2026/05/18 14:06:30 : 新提交 (由 Marco 更新此狀態)
- 2026/05/18 14:09:17 : 新提交 (由 Marco 更新此狀態)
- 2026/05/18 19:43:12 : 新提交 (由 Marco 更新此狀態)
- 2026/05/19 12:14:11 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/05/25 17:13:18 : 確認已修補 (由 Marco 更新此狀態)
- 2026/05/26 03:00:13 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00383
- 通報者:mlgzackfly (Marco)
- 風險:嚴重
- 類型:存取控制缺陷 (Broken Access Control)
參考資料
OWASP Top 10 - 2017 A5 - Broken Access Control
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control
CWE-284: Improper Access Control
https://cwe.mitre.org/data/definitions/284.html
相關網址
https://pinmed.alleypinapis.com/login
https://api.internal.alleypin.cc/v1/clientsmanager
敘述
漏洞描述
AlleyPin 的內部客戶管理 API(api.internal.alleypin.cc)原本應僅供內部員工存取,但因跨服務 JWT 驗證缺失,任何在 admin.pinmed.co 免費註冊的使用者,都能透過取得的 JWT 存取 /v1/clientsmanager 端點,取得大量診所客戶資料。
每筆記錄包含數十個欄位,涵蓋診所名稱、聯絡人姓名、手機號碼、完整地址、Email、統一編號、合約資訊,以及第三方整合相關權杖等敏感資料。
此外,部分記錄的 VAT(統一編號)欄位被誤用儲存非預期內容,構成明文密碼儲存的嚴重安全問題。
重現步驟
Step 1:在 admin.pinmed.co 免費註冊帳號
前往:
https://admin.pinmed.co/account/register
填寫 email 和密碼即可完成註冊,無需額外驗證、付費或診所綁定。
Step 2:取得 JWT Token(有效期 90 天)
curl -s -X POST https://pinmed.alleypinapis.com/login \
-H "Content-Type: application/json" \
-d '{"Username":"[email protected]","Password":"your_password"}'
JWT 的 role 為 user,clients 為空陣列(未綁定任何診所)。
Step 3:存取內部客戶管理 API
curl -s -H "Authorization: Bearer {JWT}" \
https://api.internal.alleypin.cc/v1/clientsmanager | python3 -m json.tool | jq | head -60
實測結果
| 指標 | 說明 |
|---|---|
| 診所資料 | 超過 2,000 間診所 |
| 每筆欄位數 | 約 50 個欄位 |
| 暴露的 PII | 聯絡人姓名、手機、地址、Email、統編 |
| 暴露的商業資訊 | 合約資訊、功能開關、科別、品牌 |
| VAT 欄位含明文密碼 | 逾六成包含明文密碼 |
| Google OAuth Access Token | 多數診所暴露 Google OAuth Token |
| Facebook Page Token | 部分診所暴露 Facebook Page Token |
| 登入帳號欄位 | 多數診所可取得登入帳號資訊 |
| SMS 剩餘額度 | 數百萬則簡訊額度 |
每筆記錄包含的欄位(節錄)
companyName, contactName, cellPhoneNumber, address, email, VAT,
contractStartDay, contractEndDay, category, active, authRole,
adminStoreId, bindingStoreIds, blackList, brands, content,
customerAgeRange, customerExpireDay, facebookStartingNumber,
fbExchangeToken, fbFanPage, fbFanPageToken, fbId, fbReviewLink,
features (analytics, appointNotification, calendar, fbReply, googleReply...),
createdAt, ...
VAT 欄位明文密碼問題
部分記錄的 VAT 欄位包含明文密碼內容:
| 診所 | VAT 欄位內容 | 問題 |
|---|---|---|
| OO眼科診所 | 密碼:[已編輯] |
明文密碼 |
| OO牙醫診所 | 密碼:[已編輯] |
明文密碼 |
| OO牙醫診所 | [已編輯] |
正常統一編號 |
逾六成的記錄都包含疑似明文密碼資訊。
Facebook Page Token 洩漏
部分診所的 Facebook 粉絲頁存取權杖(fbFanPageToken)可被直接取得。攻擊者可能利用這些權杖:
- 代替診所發佈 Facebook 貼文
- 讀取粉絲頁私訊
- 存取粉絲頁洞察報告
- 管理粉絲頁設定
Google OAuth Access Token 洩漏
多數診所的 Google OAuth Access Token(googleAccountAccessToken)可被直接取得。
Token 範例格式:
ya29.***
範例:
| 診所 | Token(節錄) |
|---|---|
| A 牙醫診所 | ya29.*** |
| B 牙醫診所 | ya29.*** |
攻擊者可能利用這些權杖:
- 存取 Google 商家資訊管理功能
- 修改 Google 商家資料與回覆評論
- 存取 Google Calendar 排程
- 存取 Google 帳號已授權的相關服務
其他敏感資料
| 欄位 | 說明 |
|---|---|
| 登入帳號欄位 | 可搭配明文密碼進行登入嘗試 |
| Google 帳號識別碼 | Google 帳號相關識別資訊 |
| Facebook 帳號識別碼 | Facebook 粉專相關識別資訊 |
| SMS 剩餘額度 | 可被濫用發送大量簡訊 |
| 內部備註欄位 | 含客戶溝通紀錄與內部作業資訊 |
完整攻擊鏈
admin.pinmed.co/account/register (免費註冊)
→ pinmed.alleypinapis.com/login (取得 JWT, 90天有效)
↓
api.internal.alleypin.cc/v1/clientsmanager (取得大量診所資料)
→ 聯絡人姓名 + 手機 + 地址 + Email + 統編
→ VAT 欄位含明文密碼
→ 合約資訊 + 功能開關
→ Facebook / Google OAuth Token
↓
可利用明文密碼嘗試登入診所相關後台系統
↓
可利用 Facebook / Google OAuth Token 存取第三方整合服務
根本原因
-
跨服務 JWT 驗證缺失
api.internal.alleypin.cc接受 PinMed Suite 的 JWT,但未驗證 audience / role -
Internal API 暴露於外網
api.internal.alleypin.cc可從公網直接存取,未限制來源 IP -
欄位用途未受限制
VAT 欄位被誤用儲存非預期內容,系統未限制欄位用途 -
缺乏資料存取控制
單一 GET 請求即可回傳大量客戶資料,缺乏最小權限與分頁限制
修補建議
1. 緊急: 立即限制 /v1/clientsmanager 的存取權限,僅允許內部管理員
2. 緊急: 清除 VAT 欄位中的所有明文密碼,通知受影響客戶更改密碼
3. 緊急: api.internal.alleypin.cc 限制為內網存取(VPN/IP 白名單)
4. 短期: JWT 加入 audience 驗證,PinMed Suite token 不應被 internal API 接受
5. 短期: 縮短 JWT 有效期(目前 90 天過長)
6. 中期: 實施欄位用途驗證,VAT 欄位應只接受數字格式的統一編號
7. 中期: 加入 API 分頁和速率限制,防止一次性大量資料抓取