悟空科技股份有限公司 台日測試站未限制存取,導致未付款即可取得原需付費的服務結果 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00962
  •  發信 Vendor: 誠和國際股份有限公司, 悟空科技股份有限公司, 株式会社喜喜
  • Title: 悟空科技股份有限公司 台日測試站未限制存取,導致未付款即可取得原需付費的服務結果
  • Introduction: 透過 OSINT 子網域枚舉可發現測試站網址,連線後經 IP 導向台灣測試站或日本測試站;兩者測試站皆未限制外部存取,且可讓外部使用者在未支付真實款項的情況下,取得與正式站最終交付圖片無明顯差異的圖片處理結果。

處理狀態

目前狀態

公開
Last Update : 2026/09/27
  • 新提交
  • 已審核
  • 已通報
  • 未回報修補狀況
  • 未複測
  • 公開

處理歷程

  • 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 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00962
  • 通報者:S_Cyrus ()
  • 風險:高
  • 類型:其他 (Other)

參考資料

暫無資料
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

https://diyidphoto.com/
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,未經授權的外部使用者在知悉網址後即可直接存取。

進一步測試後,我發現台日測試站:

  1. 可正常上傳測試圖片。

  2. 由於台灣測試站付款流程使用 TapPay sandbox 環境,因此可使用 TapPay 官方公開提供的測試卡(sandbox credit card)完成付款流程。

  3. 日本測試站也可使用 TapPay 官方公開提供的測試卡,完成付款流程。

  4. 完成付款流程,台日測試站皆會導向完成頁,並顯示經網站處理後可下載的最終交付圖片。

經上述步驟取得的圖片未含浮水印或測試標記;且經肉眼比較,與正式站最終交付圖片在視覺品質上無明顯差異。

因此,知悉測試站網址的外部使用者,只需上傳圖片並使用 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 子網域枚舉發現並存取測試站

  1. 使用 OSINT 子網域枚舉服務(例如 https://rapiddns.io/ 與 https://main.whoisxmlapi.com/ 等),輸入 diyidphoto.com,即可在結果中發現測試站網址 https://test.diyidphoto.com/。

  2. 使用 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 環境

  1. 在台灣測試站 https://test.diyidphoto.com/zh-tw/ 依正常流程上傳測試圖片。圖片處理完成並點擊確認後,網站會進入選擇付款方式頁面。

    選擇街口支付、LINE Pay 等掃碼式支付方式,填妥相關資料並點擊確定,即會跳轉至對應的付款頁面。

  2. 查看 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 信用卡測試交易

  1. 重新在台灣測試站 https://test.diyidphoto.com/zh-tw/ 上傳測試圖片,進入付款方式頁面後選擇信用卡付款。

  2. 填入 TapPay 官方公開提供的測試卡資料(可查看 https://docs.tappaysdk.com/tutorial/zh/reference.html#what-is-it243),例如:

   卡號:4242 4242 4242 4242
   有效期限:任一尚未到期的有效年月
   CCV:123
  1. 填妥相關資料並點擊確定後,網站顯示付款成功並導向完成頁。

  2. 完成頁會顯示經網站服務處理後的最終交付圖片。該圖片沒有浮水印或測試標記,且可正常下載,未觀察到明顯的解析度限制。

圖片


步驟 4:透過後台比較台灣正式站與測試站的最終交付圖片

  1. 在 Burp Suite 的瀏覽器開啟另一個分頁,連上台灣正式站 https://diyidphoto.com/zh-tw/,上傳與前述測試相同的圖片,並進行至付款頁面。

    選擇街口支付、LINE Pay 等掃碼式支付方式以避免實際付款,填妥相關資料並點擊確定後,網站會跳轉至 QR code 付款頁面。

  2. 查看 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`。
  1. 在 Burp Suite 的瀏覽器開啟另一個分頁,連上後台 https://helper.diyidphoto.com/login,並使用已建立的帳號及密碼登入。可參考未授權使用者可匿名建立後台帳號並任意指定 role與低權限後台帳號可繞過 RBAC建立。

  2. 在後台左側的管理控制面板(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` 的值為最終交付圖片路徑。
  1. 將任一登入後台後的 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 信用卡測試交易

  1. 在日本測試站 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。
  1. 點擊 次へ 後,網站會跳轉到 TapPay - Sandbox 3D 驗證測試 頁面,並提示 若要繼續進行測試,請輸入簡訊 OTP 密碼:1234567。

    在 簡訊 OTP 框框處填入 1234567 並點擊送出,網站顯示付款成功並導向完成頁。

  2. 可能由於環境是 Burp Suite 的瀏覽器,完成頁未正常顯示經網站服務處理後的最終交付圖片。

    然而在剛剛填入的 Email 中,會收到一封由 [email protected] 寄來的電子郵件,將裡面的連結由其它瀏覽器開啟,會正常顯示圖片。

    且圖片沒有浮水印或測試標記,且可正常下載,未觀察到明顯的解析度限制。

圖片

圖片


步驟 6:透過後台比較日本正式站與測試站的最終交付圖片

  1. 在 Burp Suite 的瀏覽器開啟另一個分頁,連上日本正式站 https://jp.diyidphoto.com/,上傳與前述測試相同的圖片,並進行至付款頁面。

    選擇 PayPay 等掃碼式支付方式以避免實際付款,填妥相關資料並點擊 次へ 後,網站會跳轉至 QR code 付款頁面。

  2. 查看 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`。
  1. 在 Burp Suite 的瀏覽器開啟另一個分頁,連上後台 https://helper.diyidphoto.com/login,並使用已建立的帳號及密碼登入。可參考未授權使用者可匿名建立後台帳號並任意指定 role與低權限後台帳號可繞過 RBAC建立。

  2. 登入後點擊左上角 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` 的值為最終交付圖片路徑。
  1. 將任一登入後台後的 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)

問題可能源於測試環境未限制外部存取,且未與正式環境妥善隔離,導致外部使用者可取得品質與正式站相當的交付結果。

可能原因包括:

  1. 台日測試站皆未限制為僅供 VPN、allowlisted IP 或內部帳號存取;經 OSINT 子網域枚舉發現測試站點後,即可連線進入。
  2. 台日測試站仍提供完整的圖片上傳、處理、付款與交付流程,未與正式站的服務能力妥善隔離。
  3. 台日測試站後端接受 TapPay sandbox 交易成功結果,並據此進入完成頁及提供最終交付圖片。
  4. 台日測試站產生的最終交付圖片未經降級處理,例如加入浮水印、測試標記、降低解析度或禁止下載。

8. 嚴重性評估(Severity Assessment)

高風險(High)

理由:

  • 同時涉及測試環境公開暴露,以及原需付費的網站服務可被免費使用
  • 測試站未限制為僅供 VPN、allowlisted IP 或內部帳號存取
  • 外部使用者可透過台日測試站,在未支付真實款項的情況下取得原需付費的服務結果
  • 可重複上傳多張圖片並取得結果,且目前未觀察到 IP、session 或 order 數量限制
  • 測試站需透過 OSINT 子網域枚舉發現,具有低度前置門檻
  • 目前尚未觀察到實際營收、服務成本或運算成本損失;若後續確認可被大規模濫用,並影響正式環境資源或服務可用性,則可再上調風險等級

9. 補充說明(Researcher Note)

  1. 本報告之測試僅限確認漏洞存在,未進行批次化、大量化或自動化操作,也未進行破壞性操作。

  2. 由於此系統與技術牽涉到三家公司-台灣公司為誠和國際股份有限公司(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 路徑等。

擷圖

留言討論

聯絡組織

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