> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/web/server/path-traversal.md).

# Path traversal

https\://portswigger.net/web-security/file-path-traversal

Ces vulnérabilités permettent à un attaquant de lire des fichiers arbitraires sur le serveur qui héberge une application.

Sur Windows `../` et `..\` sont valides.

Dans le pire des cas on peut se balader sur le serveur directement dans l'URL sans paramètre:

`http://serveur-vulnerable/../../fichier-secret`

Certains sites chargent leur images en utilisant une API du système de fichiers `<img src="/image?filename=photo.png">` dans ce cas on peut se balader comme ça:

`http://serveur-vulnerable/image?filename=../../fichier-secret`

## Bypass les filtres

* utiliser un chemin absolu (`etc/passwd` au lieu de `../../etc/passwd` par exemple)
* utiliser des séquences imbriquées comme `....//` ou `...\/` :
  1. si le serveur supprime `../` du premier input il reste `../`
  2. s'il supprime `..\` du second il reste `../`
* utiliser l'URL encoding (ou double URL encoding) :

<table><thead><tr><th width="107" align="center">Input</th><th align="center">URL encoding</th><th align="center">Double URL encoding</th><th align="center">Non-standart encoding</th></tr></thead><tbody><tr><td align="center"><code>../</code></td><td align="center"><code>%2e%2e%2f</code></td><td align="center"><code>%252e%252e%252f</code></td><td align="center"><code>..%c0%af</code></td></tr><tr><td align="center"><code>..\</code></td><td align="center"><code>%2e%2e%5c</code></td><td align="center"><code>%252e%252e%255c</code></td><td align="center"><code>..%c1%9c</code></td></tr></tbody></table>

* bypass la validation de l'extension du fichier avec un null byte. Dans le cas d'une image par exemple `<img src="/image?filename=photo.png>` si le serveur vérifie l'extension du fichier on peut entrer par exemple `filename=../../../etc/passwd%00.png`
