[RT] PHP - Injection de commande (10 pts)

Ce challenge permet de comprendre l'importance de vérifier les entrées utilisateurs en php.

·

2 min read

Partie 1 Énumération:

Notre point de départ est cette page web

image.png

Cette page, nommé "Ping Service" nous offre une entrée user avec comme valeur par défaut 127.0.0.1 Je vais donc tester avec cette adresse ip.

image.png

Partie 2 Exploitation :

Nous avons donc ici une page en php qui va retourner le resultat de la commande bash "ping $[ip]" avec ip qui est donné dans le champ d'entrée. Pour mieux expliquer ceci je vais donc injecter la chaine suivante 127.0.0.1;ls

image.png

Remarque : ici le résultat peut sembler être le même mais si on regarde a la fin du résultat, "index.php" a été rajouter. Ça veux donc dire qu'il y a bien un shell qui fait la commande coté serveur.

Partie 2 Énumération du dossier

Je vais ici en decouvrir plus sur le server qui heberge le site. J'éffectue la commande suivante : ;pwd;whoami;ls -al

image.png

Petit récapitulatif : nous somme dans le dossier "/challenge/web-serveur/ch54", nous somme l'utilisateur "web-serveur-ch54"

Si on regarde plus attentivement le résultat de la commande ls -al, on se rend compte qu'il y a un fichier nommé ".passwd" allons regarder dedans.

image.png

Et tada on trouve notre flag : S3rv1ceP1n9Sup3rS3cure

Petit plus

Si on regarde dans le dossier, il y a le fichier index.html. Imaginons que je veuille le recupérer. Si je fait comme commande cat index.html voici ce qu'il se passe

image.png le code que l'on veux afficher est interpreté. Il est donc impossible d'avoir le contenu du fichier de cette manière.

Solution

Si nous voulons extraire le code php sans qu'il soit interprété, il faut l’offusqué. Je vais donc l'extraire en base 64. Commande : ;cat index.php | base64

image.png

maintenant que j'ai le code en base64 il me suffi juste de le decoder

voici donc le code de la page

<html>
<head>
<title>Ping Service</title>
</head>
<body>
<form method="POST" action="index.php">
        <input type="text" name="ip" placeholder="127.0.0.1">
        <input type="submit">
</form>
<pre>
<?php 
$flag = "".file_get_contents(".passwd")."";
if(isset($_POST["ip"]) && !empty($_POST["ip"])){
        $response = shell_exec("timeout 5 bash -c 'ping -c 3 ".$_POST["ip"]."'");
        echo $response;
}
?>
</pre>
</body>
</html>

Did you find this article valuable?

Support Akasaru0 by becoming a sponsor. Any amount is appreciated!