Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00409
- Vendor: 翔評互動股份有限公司
- Title: AlleyPin 翔評互動 API JWT 簽名密鑰可猜測,可偽造 Token 繞過所有 API 端點認證
- Introduction: 攻擊者可偽造任意 JWT Token,無需帳號即可完全繞過認證存取所有 API 端點。
- 獎勵金
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/03/24 17:44:15 : 新提交 (由 Marco 更新此狀態)
- 2026/03/24 17:50:27 : 新提交 (由 Marco 更新此狀態)
- 2026/03/25 15:03:42 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/04/09 16:52:46 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/04/09 16:52:46 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/11 17:54:31 : 新提交 (由 Marco 更新此狀態)
- 2026/05/19 12:32:12 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/05/25 15:45:35 : 新提交 (由 Marco 更新此狀態)
- 2026/05/25 17:00:36 : 新提交 (由 Marco 更新此狀態)
- 2026/05/25 17:05:03 : 新提交 (由 Marco 更新此狀態)
- 2026/05/25 17:06:12 : 新提交 (由 Marco 更新此狀態)
- 2026/05/25 17:34:48 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/05/27 12:53:36 : 確認已修補 (由 Marco 更新此狀態)
- 2026/05/28 03:00:04 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00409
- 通報者: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
相關網址
敘述
漏洞描述
整理利用方式與 ZD-2026-00383 類似,不過此次主要問題為 JWT 使用可輕易猜測的弱密鑰。
AlleyPin 的 API 認證使用 JWT(JSON Web Token),簽名演算法為 HS256(HMAC-SHA256)。經測試發現其 JWT 簽名驗證使用弱密碼作為共用 signing key。
攻擊者只需取得或猜測該弱密鑰,即可偽造任意 JWT Token,無需註冊帳號或取得任何合法認證資訊,即可繞過 API 認證機制。
此漏洞影響多個核心微服務子系統,包括:
- 對外 API
- 內部管理 API
- 預約系統
- 合約系統
- 其他共用 JWT 驗證服務
環境資訊
- 技術棧:Go 後端、HS256 JWT 驗證
- 漏洞位置:JWT HS256 簽名驗證流程(所有需認證之 API 端點)
重現漏洞方式
步驟一:偽造 JWT Token
使用 HMAC-SHA256 搭配弱密鑰,可自行簽署合法 JWT Token。
攻擊者可建立包含管理員權限欄位(如 role: admin)的 payload,並利用弱密鑰完成簽章,藉此繞過後端 JWT 驗證。
成功簽章後,即可攜帶偽造 JWT 呼叫原本需要授權的 API 端點。
步驟二:驗證簽章可成功繞過認證
當 JWT 使用錯誤簽章時,系統會回傳簽章驗證失敗訊息:
{"error":"invalid token signature"}
當 JWT 使用正確弱密鑰完成簽章後,API 會接受該 Token,並回傳 HTTP 200 OK,代表認證已被成功繞過。
步驟三:存取受保護 API
未攜帶合法 JWT 時:
{"error":"forbidden"}
攜帶偽造 JWT 後,可成功通過認證並存取原本需授權的 API 功能。
即使查詢參數為隨機值,仍可觀察到:
- JWT 驗證已成功通過
- 系統進入後續業務邏輯處理流程
- 僅因查詢資料不存在而回傳資料錯誤
此現象可證明 JWT 驗證機制已被繞過。
步驟四:實際存取診所管理資料
透過公開 API 可取得診所對應之 client identifier,之後即可利用偽造 JWT 存取內部管理 API。
回傳 HTTP 200 後,可取得診所管理資料,包含:
| 欄位 | 說明 | 洩漏情況 |
|---|---|---|
contactName |
聯絡人姓名 | [已隱碼] |
cellPhoneNumber |
手機 | [已隱碼] |
email |
[已隱碼] |
|
address |
地址 | [某縣市已隱碼] |
VAT |
統編/敏感資訊 | [已隱碼,長度 22 chars] |
username |
帳號 | [已隱碼] |
googleAccountAccessToken |
Google OAuth Token | [已隱碼] |
googleAccountId |
Google 帳號 ID | [已隱碼] |
fbFanPageToken |
Facebook 粉專 Token | (存在) |
contractStartDay |
合約起始日 | [部分隱碼] |
contractEndDay |
合約結束日 | [部分隱碼] |
風險分析
最嚴重之風險包括:
googleAccountAccessToken為有效 OAuth Access Token,可直接操作診所 Google 商家檔案- 敏感欄位存在明文儲存情況
- 攻擊者可大規模列舉公開診所資訊後,批次取得診所管理資料與 OAuth Token
- 同一組 signing key 被多個微服務共用,導致單點失陷即可影響整體系統
影響
-
完整認證繞過
攻擊者可自行偽造 JWT Token,繞過 API 認證。 -
敏感資料外洩
可存取診所管理資料、病患資料與 OAuth Token。 -
商業資料外洩
可存取合約、設定、客戶管理資訊。 -
資料竄改風險
可修改預約、通知、客戶設定等資料。 -
跨微服務全面影響
同一 signing key 用於多個核心服務,導致影響範圍擴大。
根因
- 使用 HS256 對稱式 JWT 驗證
- 使用弱密碼作為 signing key
- 多個微服務共用同一組 JWT signing key
- 缺乏 key rotation 與 secret management 機制
修補建議
1. 立即更換 JWT 簽名密鑰 — 使用密碼學安全的隨機密鑰(至少 256 bits),切勿使用可猜測的字串
2. 改用非對稱加密演算法 — 使用 RS256 或 ES256 取代 HS256,降低密鑰洩漏風險
3. 限制內部 API 存取 — api.internal.alleypin.cc 應限制為 VPC 內部存取,不應對外暴露