2 minutes
PWNME 2023 - Tree Viewer [FR]
Catégorie | Web |
Difficulté | Intro |
Auteur | Eteck#3426 |
Introduction
Here, you can check the content of any directories present on the server.
Find a way to abuse this functionality, and read the content of /home/flag.txt
Code Source
L’application web nous permet de voir le contenu de n’importe quel répertoire sur le serveur en donnant le chemin du répertoire en paramètre.
Nous avons accès au code source depuis l’endpoint /?source
:
<?php
$parsed = isset($_POST['input']) ? $_POST['input'] : "/home/";
preg_match_all('/[;|]/m', $parsed, $illegals, PREG_SET_ORDER, 0);
if($illegals){
echo "Illegals chars found";
$parsed = "/home/";
}
if(isset($_GET['source'])){
highlight_file(__FILE__);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tree Viewer</title>
</head>
<body>
<a href="/?source">Source code</a>
<hr/>
<form action="/" method="post">
<label for="input">Directory to check</label>
<input type="text" placeholder="Directory to see" id="input" name="input" value="<?= $parsed ?>">
</form>
<h3>Content of <?= $parsed ?>: <?= shell_exec('ls '.$parsed); ?></h3>
</body>
</html>
Dans le code, on peut directement voir que notre paramètre input
va être utilisé pour l’exécution de la commande suivante :
shell_exec('ls '.$parsed);
La ligne suivante nous montre le filtre appliqué sur notre input.
preg_match_all('/[;|]/m', $parsed, $illegals, PREG_SET_ORDER, 0);
Certains caractères sont interdits : [
;
|
]
Vulnérabilité
Il est possible d’effectuer une injection de commande avec shell_exec('ls '.$parsed);
.
Exploitation
L’injection basique en utilisant ;
n’est pas possible, puisque le caractère est filtré.

En regardant la page de HackTricks sur l’injection de commande, je trouve le séparateur &&
. Celui ci exécute la deuxième commande seulement si la première commande est bien exécuté. Dans le cas du challenge, la commande est ls
sans paramètre sera bien effectué donc l’injection fonctionnera.
Flag
Je vais utiliser le séparateur &&
puis injecter ma commande pour afficher le flag contenu dans le fichier flag.txt :
