Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00962
- Vendor: 誠和國際股份有限公司, 悟空科技股份有限公司, 株式会社喜喜
- Title: 悟空科技股份有限公司 台日測試站未限制存取,導致未付款即可取得原需付費的服務結果
- Introduction: 透過 OSINT 子網域枚舉可發現測試站網址,連線後經 IP 導向台灣測試站或日本測試站;兩者測試站皆未限制外部存取,且可讓外部使用者在未支付真實款項的情況下,取得與正式站最終交付圖片無明顯差異的圖片處理結果。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
未回報修補狀況
-
未複測
-
公開
處理歷程
- 2026/07/28 10:26:16 : 新提交 (由 更新此狀態)
- 2026/07/28 11:04:11 : 新提交 (由 更新此狀態)
- 2026/07/28 11:57:58 : 新提交 (由 更新此狀態)
- 2026/08/03 12:57:53 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/08/05 19:01:39 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/08/05 19:01:39 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/08/05 19:01:39 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/09/27 03:00:19 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
參考資料
相關網址
https://test.diyidphoto.com/
https://test-jp.diyidphoto.com/
https://diyidphoto.com/zh-tw/
https://jp.diyidphoto.com/
敘述
0. 摘要(Summary)
透過公開的 OSINT 子網域枚舉服務(例如 https://rapiddns.io/ 與 https://main.whoisxmlapi.com/ 等),輸入網域 diyidphoto.com 可找到測試站網址 https://test.diyidphoto.com。
連上測試站網址,可發現若連線者 IP 非日本 IP,會連向台灣測試站 https://test.diyidphoto.com/zh-tw/;日本 IP 則會連向日本測試站 https://test-jp.diyidphoto.com/。
而台日測試站皆未實施任何有效存取限制,例如登入驗證、VPN、IP allowlist 或 Basic Auth,未經授權的外部使用者在知悉網址後即可直接存取。
進一步測試後,我發現台日測試站:
-
可正常上傳測試圖片。
-
由於台灣測試站付款流程使用 TapPay sandbox 環境,因此可使用 TapPay 官方公開提供的測試卡(sandbox credit card)完成付款流程。
-
日本測試站也可使用 TapPay 官方公開提供的測試卡,完成付款流程。
-
完成付款流程,台日測試站皆會導向完成頁,並顯示經網站處理後可下載的最終交付圖片。
經上述步驟取得的圖片未含浮水印或測試標記;且經肉眼比較,與正式站最終交付圖片在視覺品質上無明顯差異。
因此,知悉測試站網址的外部使用者,只需上傳圖片並使用 TapPay 測試卡完成 sandbox 交易,即可在未支付真實款項的情況下,取得原本需付費才能取得的圖片處理結果。
1. 受影響功能(Affected Feature)
-
主要受影響站點:
https://test.diyidphoto.com/https://test-jp.diyidphoto.com/
-
正式站站點:
https://diyidphoto.com/zh-tw/https://jp.diyidphoto.com/
-
已驗證付款方式:
- 信用卡(使用 TapPay 測試卡卡號)
-
補充觀察付款方式:
- 使用付款選項中的街口支付、LINE Pay,可觀察到付款環境為 TapPay sandbox
2. 漏洞驗證之前置條件(Preconditions for Verification)
- 需使用 Burp Suite 等 proxy 工具連線到
https://test.diyidphoto.com/或https://test-jp.diyidphoto.com/進行相關操作並觀察請求。 - 需知道 TapPay 測試卡卡號(可查看
https://docs.tappaysdk.com/tutorial/zh/reference.html#what-is-it243)。 - 如需驗證測試站與正式站的圖片處理結果是否一致,則需要擁有一個可登入
https://helper.diyidphoto.com/後台的 PB user 帳號,建議該帳號"role": ["admin"]會比較方便測試。可參考未授權使用者可匿名建立後台帳號並任意指定 role與低權限後台帳號可繞過 RBAC建立。
3. 重現步驟(Steps to Reproduce)與概念驗證(Proof of Concept)
以下重現步驟皆使用 Burp Suite 作為工具。
以下 PoC 僅整理我在實際測試中看到的重點證據。因為 HITCON 提交附件最多只能上傳 10 張圖,所以我只附足以證明主問題成立的必要代表性截圖。其餘我都有保留,若需要可再補充。
步驟 1:使用 OSINT 子網域枚舉發現並存取測試站
-
使用 OSINT 子網域枚舉服務(例如
https://rapiddns.io/與https://main.whoisxmlapi.com/等),輸入diyidphoto.com,即可在結果中發現測試站網址https://test.diyidphoto.com/。 -
使用 Burp Suite 的瀏覽器連上測試站網址
https://test.diyidphoto.com/。若連線者 IP 非日本 IP,會連向台灣測試站
https://test.diyidphoto.com/zh-tw/;日本 IP 則會向日本測試站https://test-jp.diyidphoto.com/。兩者皆可直接進入並瀏覽。網站未實施存取限制,例如要求登入、VPN、Basic Auth、測試帳號或內部 IP。
步驟 2:在台灣測試站上傳圖片,並確認 TapPay sandbox 環境
-
在台灣測試站
https://test.diyidphoto.com/zh-tw/依正常流程上傳測試圖片。圖片處理完成並點擊確認後,網站會進入選擇付款方式頁面。選擇街口支付、LINE Pay 等掃碼式支付方式,填妥相關資料並點擊確定,即會跳轉至對應的付款頁面。
-
查看 Burp Suite 的 Proxy 頁籤中的 HTTP history,可觀察到付款流程使用 TapPay sandbox 環境,例如:
POST /payment/jko-pay/sandbox/get-prime HTTP/2
Host: js.tappaysdk.com
POST /payment/line-pay/sandbox/get-prime HTTP/2
Host: js.tappaysdk.com
POST /payment/easy-wallet/sandbox/get-prime HTTP/2
Host: js.tappaysdk.com
上述請求的內容包括:
{
"app_id": <App_Id>,
"app_key": "<TapPay_App_Key>",
"app_name": "test.diyidphoto.com",
"platform_type": 1,
"tappay_sdk_version": "v5.21.0"
}
補充說明:
由於第三方錢包測試可能需要向 TapPay 客服申請或核對廠商資訊,因此本次未進一步測試,下一步將以信用卡完成驗證。
步驟 3:使用 TapPay sandbox 信用卡測試交易
-
重新在台灣測試站
https://test.diyidphoto.com/zh-tw/上傳測試圖片,進入付款方式頁面後選擇信用卡付款。 -
填入 TapPay 官方公開提供的測試卡資料(可查看
https://docs.tappaysdk.com/tutorial/zh/reference.html#what-is-it243),例如:
卡號:4242 4242 4242 4242
有效期限:任一尚未到期的有效年月
CCV:123
-
填妥相關資料並點擊確定後,網站顯示付款成功並導向完成頁。
-
完成頁會顯示經網站服務處理後的最終交付圖片。該圖片沒有浮水印或測試標記,且可正常下載,未觀察到明顯的解析度限制。
步驟 4:透過後台比較台灣正式站與測試站的最終交付圖片
-
在 Burp Suite 的瀏覽器開啟另一個分頁,連上台灣正式站
https://diyidphoto.com/zh-tw/,上傳與前述測試相同的圖片,並進行至付款頁面。選擇街口支付、LINE Pay 等掃碼式支付方式以避免實際付款,填妥相關資料並點擊確定後,網站會跳轉至 QR code 付款頁面。
-
查看 Burp Suite 的 HTTP history,可發現以下請求:
POST /api/pay HTTP/2
Host: diyidphoto.com
Content-Type: text/plain;charset=UTF-8
{
"payType": "<PayType>",
"token": "<UUID>",
"prime": "<Prime>",
"email": "<Email>",
"order_id": "<OrderID>",
"photo_type": <Photo_Type>,
"invoice": "email",
"carrier_phone": "",
"carrier_natual": "",
"tax_number": "",
"tax_name": "",
"donate_code": "",
"method": "<Method>",
"webhook": "/zh-tw/takePhoto",
"mail": "",
"name": "",
"address": "",
"phone": "<Phone>",
"use_for_what": <Number>
}
記下請求中的 `OrderID`。
-
在 Burp Suite 的瀏覽器開啟另一個分頁,連上後台
https://helper.diyidphoto.com/login,並使用已建立的帳號及密碼登入。可參考未授權使用者可匿名建立後台帳號並任意指定 role與低權限後台帳號可繞過 RBAC建立。 -
在後台左側的管理控制面板(admin panel)點擊訂單查詢功能,在
關鍵字欄位輸入剛才記下的OrderID,並點擊關鍵字搜尋按鈕,即可看到正式站的原始上傳圖片與最終交付圖片。
也可從 Burp Suite 的 HTTP history 查看以下請求:
POST /api/orders/search?diy_type=tw HTTP/2
Host: helper.diyidphoto.com
Content-Type: application/json
Cookie: access_token=<access_token>; uid=<uid>; role=%5B%22admin%22%5D
{"keyword":"<OrderID>"}
其回應可見:
{
"error_code": 0,
"error_text": "",
"data": [
{
"orderID": "<OrderID>",
"token": "<Order_Token>",
...,
"images": {
"origin": "/api/order/img/origin/<Image_Token>?t=<timestamp>",
"face": "/api/order/img/face/<Image_Token>?t=<timestamp>",
"ruler": "/api/order/img/ruler/<Image_Token>?t=<timestamp>",
"beauty": "/api/order/img/beauty/<Image_Token>?t=<timestamp>",
"final": "/api/order/img/final/<Image_Token>?t=<timestamp>",
"formal": "/api/order/img/formal/<Image_Token>?t=<timestamp>",
"formal711": "/api/order/img/formal_711/<Image_Token>?t=<timestamp>",
"formalFamily": "/api/order/img/formal_family/<Image_Token>?t=<timestamp>",
"receipt": "/api/order/img/receipt_jp/<Image_Token>?t=<timestamp>"
}
},
...
]
}
其中參數 `final` 的值為最終交付圖片路徑。
- 將任一登入後台後的
Host: helper.diyidphoto.com請求發送至 Repeater,並修改為:
GET /api/order/img/final/<Image_Token>?t=<timestamp> HTTP/2
Host: helper.diyidphoto.com
Cookie: access_token=<access_token>; uid=<uid>; role=%5B%22admin%22%5D
取得正式站最終交付圖片後,與台灣測試站產生的圖片進行肉眼比較,可發現兩者在視覺結果及解析度方面無明顯差異。
步驟 5:在日本測試站上傳圖片,並使用 TapPay sandbox 信用卡測試交易
-
在日本測試站
https://test-jp.diyidphoto.com/依正常流程上傳測試圖片。進入付款方式頁面後選擇信用卡付款。填入 TapPay 官方公開提供的測試卡資料(可查看
https://docs.tappaysdk.com/tutorial/zh/reference.html#what-is-it243),例如:
卡號:4242 4242 4242 4242
有效期限:任一尚未到期的有效年月
CCV:123
填妥相關資料,這裡值得注意的是,E-MAIL 處請填入確認可收到信件的 Email。
-
點擊
次へ後,網站會跳轉到TapPay - Sandbox 3D 驗證測試頁面,並提示若要繼續進行測試,請輸入簡訊 OTP 密碼:1234567。在
簡訊 OTP框框處填入1234567並點擊送出,網站顯示付款成功並導向完成頁。 -
可能由於環境是 Burp Suite 的瀏覽器,完成頁未正常顯示經網站服務處理後的最終交付圖片。
然而在剛剛填入的 Email 中,會收到一封由
[email protected]寄來的電子郵件,將裡面的連結由其它瀏覽器開啟,會正常顯示圖片。且圖片沒有浮水印或測試標記,且可正常下載,未觀察到明顯的解析度限制。
步驟 6:透過後台比較日本正式站與測試站的最終交付圖片
-
在 Burp Suite 的瀏覽器開啟另一個分頁,連上日本正式站
https://jp.diyidphoto.com/,上傳與前述測試相同的圖片,並進行至付款頁面。選擇 PayPay 等掃碼式支付方式以避免實際付款,填妥相關資料並點擊
次へ後,網站會跳轉至 QR code 付款頁面。 -
查看 Burp Suite 的 HTTP history,可發現以下請求:
POST /api/pay-ja HTTP/2
Host: diyidphoto.com
Content-Type: text/plain;charset=UTF-8
{
"method": "paypay",
"token": "<UUID>",
"prime": "paypay",
"email": "<Email>",
"order_id": "<OrderID>",
"phone": "",
"passport_name": "<Name>",
"photo_name": "<Photo_Name>",
"photo_kind": <Photo_Kind>,
"webhook": "https://jp.diyidphoto.com/takePhoto",
"three_domain_secure": false,
"user_agent": "<User_Agent>"
}
記下請求中的 `OrderID`。
-
在 Burp Suite 的瀏覽器開啟另一個分頁,連上後台
https://helper.diyidphoto.com/login,並使用已建立的帳號及密碼登入。可參考未授權使用者可匿名建立後台帳號並任意指定 role與低權限後台帳號可繞過 RBAC建立。 -
登入後點擊左上角 DIY 旁類似雙彎曲箭頭的按鈕,會切換至日本站後台(DIYJP),在左側管理控制面板點擊訂單查詢功能,在
關鍵字欄位輸入剛才記下的OrderID,並點擊關鍵字搜尋按鈕,即可看到正式站的原始上傳圖片與最終交付圖片。
也可從 Burp Suite 的 HTTP history 查看以下請求:
POST /api/orders/search?diy_type=ja HTTP/2
Host: helper.diyidphoto.com
Content-Type: application/json
Cookie: access_token=<access_token>; uid=<uid>; role=%5B%22admin%22%5D
{"keyword":"<OrderID>"}
其回應可見:
{
"error_code": 0,
"error_text": "",
"data": [
{
"orderID": "<OrderID>",
"token": "<Order_Token>",
...,
"images": {
"origin": "/api/order/img/origin/<Image_Token>?t=<timestamp>",
"face": "/api/order/img/face/<Image_Token>?t=<timestamp>",
"ruler": "/api/order/img/ruler/<Image_Token>?t=<timestamp>",
"beauty": "/api/order/img/beauty/<Image_Token>?t=<timestamp>",
"final": "/api/order/img/final/<Image_Token>?t=<timestamp>",
"formal": "/api/order/img/formal/<Image_Token>?t=<timestamp>",
"formal711": "/api/order/img/formal_711/<Image_Token>?t=<timestamp>",
"formalFamily": "/api/order/img/formal_family/<Image_Token>?t=<timestamp>",
"receipt": "/api/order/img/receipt_jp/<Image_Token>?t=<timestamp>"
}
},
...
]
}
其中參數 `final` 的值為最終交付圖片路徑。
- 將任一登入後台後的
Host: helper.diyidphoto.com請求發送至 Repeater,並修改為:
GET /api/order/img/final/<Image_Token>?t=<timestamp> HTTP/2
Host: helper.diyidphoto.com
Cookie: access_token=<access_token>; uid=<uid>; role=%5B%22admin%22%5D
取得正式站最終交付圖片後,與日本測試站產生的圖片進行肉眼比較,可發現兩者在視覺結果及解析度方面無明顯差異。
4. 預期行為(Expected Behavior)
測試站點應僅允許透過 VPN、allowlisted IP 或內部測試帳號驗證的使用者存取,不應讓一般外部使用者操作完整服務流程。
即使測試站必須保留圖片處理與付款測試功能,也應加入明顯浮水印、測試標記或降低解析度,不應產出可直接使用、品質與正式站相當的圖片。
5. 實際行為(Actual Behavior)
台日測試站可由外部使用者直接存取,並可在未支付真實款項的情況下,取得與正式站品質相當的圖片處理結果。
主要流程如下:
連上台日測試站
→ 上傳圖片
→ 使用 TapPay 測試卡完成付款流程
→ 進入完成頁並查看或下載最終交付圖片
6. 影響(Impact)
此問題使外部使用者可在未支付真實款項的情況下,取得品質與正式站相當的最終交付圖片。
可能造成的風險包括:
- 原本需付費的服務遭免費使用,造成潛在營收損失
- 測試站遭外部使用者長期或重複濫用,且不易及時察覺
7. 可能的根本原因(Likely Root Cause)
問題可能源於測試環境未限制外部存取,且未與正式環境妥善隔離,導致外部使用者可取得品質與正式站相當的交付結果。
可能原因包括:
- 台日測試站皆未限制為僅供 VPN、allowlisted IP 或內部帳號存取;經 OSINT 子網域枚舉發現測試站點後,即可連線進入。
- 台日測試站仍提供完整的圖片上傳、處理、付款與交付流程,未與正式站的服務能力妥善隔離。
- 台日測試站後端接受 TapPay sandbox 交易成功結果,並據此進入完成頁及提供最終交付圖片。
- 台日測試站產生的最終交付圖片未經降級處理,例如加入浮水印、測試標記、降低解析度或禁止下載。
8. 嚴重性評估(Severity Assessment)
高風險(High)
理由:
- 同時涉及測試環境公開暴露,以及原需付費的網站服務可被免費使用
- 測試站未限制為僅供 VPN、allowlisted IP 或內部帳號存取
- 外部使用者可透過台日測試站,在未支付真實款項的情況下取得原需付費的服務結果
- 可重複上傳多張圖片並取得結果,且目前未觀察到 IP、session 或 order 數量限制
- 測試站需透過 OSINT 子網域枚舉發現,具有低度前置門檻
- 目前尚未觀察到實際營收、服務成本或運算成本損失;若後續確認可被大規模濫用,並影響正式環境資源或服務可用性,則可再上調風險等級
9. 補充說明(Researcher Note)
-
本報告之測試僅限確認漏洞存在,未進行批次化、大量化或自動化操作,也未進行破壞性操作。
-
由於此系統與技術牽涉到三家公司-台灣公司為誠和國際股份有限公司(
https://www.seiwainc.com.tw/)與悟空科技股份有限公司(https://www.goqoo.com/),日本公司為株式会社喜喜(https://jp.diyidphoto.com/)。就可見資料顯示(https://twincn.com/84108618、https://www.twincn.com/80682392、https://jp.diyidphoto.com/lawOfPayment),三間公司經營者高度相關。但目前無法確定哪間公司統籌系統、技術與網站走向,並且問題可牽涉到跨國站點,因此建議同時聯絡三間公司。
以下是三間公司之相關信箱:
誠和國際:[email protected]
悟空科技:[email protected]
DIY證件照-台灣站(悟空科技):[email protected]
DIY證件照-日本站(株式会社喜喜):[email protected]修補建議
## 修補建議(Remediation Suggestions)
1. 將測試站限制為僅供 VPN、allowlisted IP 或內部帳號存取,並可搭配 Basic Auth、SSO 等強制存取控制。
2. 測試站不應提供與正式站相同的完整圖片處理與交付能力。若仍需產生最終交付圖片,應加入明顯浮水印、測試標記、降低解析度或禁止下載。
3. 對測試站加入速率限制、上傳額度限制(upload quota)、訂單額度限制(order quota)及濫用偵測機制。
4. 測試環境與正式環境應妥善隔離,包含圖片處理服務(image processing worker)、檔案儲存(storage bucket)及 CDN 路徑等。