Archives Wild Code School
Cybersecurity

[Séc. Web] [Inj.] Injection de commande

Quête 12 sur 13 · 1 image archivée

image

Introduction

L'injection de ligne de commande permet à quelqu'un d'exécuter des commandes système non approuvées sur un serveur Web (pas uniquement un serveur Web). Avec un serveur mal sécurisé, cela donnerait à un attaquant un contrôle complet sur un système.

🤓 Objectifs

✅ Comprendre comment fonctionne un code PHP. ✅ Comprendre comment fonctionne l'injection de commande dans un serveur Web.

👉 Mettre en place la vulnérabilité dans notre propre serveur

  • Prenons l'exemple d'un script PHP qui permet à un utilisateur d'envoyer des requêtes ICMP (ping) sur un serveur Web avec comme argument $_GET['ip'].
php
<pre>
<?php system('ping -c1 ' . $_GET['ip']); ?>
</pre>
  • Nous allons créer un nouveau fichier dans le dossier /var/www/html dans notre machine Linux. Nous le nommons command.php. Nous allons ensuite démarrer le service apache2 avec la commande service apache2 start.
bash
┌──(root💀oldprogrammer)-[/var/www/html]
└─# ls                                                                                                                                                             130 ⨯
command.php  index.html  index.nginx-debian.html
                                                                                                                                                                         
┌──(root💀oldprogrammer)-[/var/www/html]
└─# cat command.php 
<pre>
<?php system('ping -c1 ' . $_GET['ip']); ?>
</pre>
                                                                                                                                                                         
┌──(root💀oldprogrammer)-[/var/www/html]
└─#

👉 Exploiter la vulnérabilité

Si nous décidons par exemple de contacter la page /command.php depuis notre localhost, logiquement il n'y aura strictement rien (ce qui est normal, car un argument est attendu). Maintenant, nous décidons de lui passer le paramètre ip avec comme valeur l'adresse de loopback (127.0.0.1) par exemple. Il va nous afficher à la sortie la commande ping.

image

On peut donc supposer que le serveur à envoyé une requête de type :

bash
$ ping -c1 127.0.0.1

Si maintenant, nous mettons un point virgule (le point virgule sert à délimiter les commandes entre elles) pour quitter cette commande et exécuter une nouvelle... Imaginons que dans notre serveur Web, nous décidons de lui envoyer une commande de type :

bash
http://localhost/command.php?ip=127.0.0.1;ls

On suppose alors que le serveur va envoyer une requête de type :

bash
ping -c1 127.0.0.1;ls

Donc, il exécutera la commande ping ET la commande ls, et de là, on peut exécuter n'importe quelle commande dans le serveur en lui passant des arguments.

image

👉 Sécurisation

On peut utiliser la fonction escapeshellarg(); pour sécuriser notre paramètre.

  • escapeshellcmd(); mettra un seul caractère anti-slash devant chaque méta caractère du shell comme ;$<>.. Pour y échapper. Cette fonction est normalement utilisée pour garantir qu'une seule commande shell est exécutée et qu'il n'est pas possible d'ajouter d'autres commandes shell.
php
<pre>
<?php system('ping -c1 ' . escapeshellcmd($_GET['ip'])); ?>
</pre>
  • Voici une ressource ci-dessous qui permet de mieux comprendre l'injection de commande et faire des choses beaucoup plus poussées.
↗
Command injection and exploit
book.hacktricks.xyz

💪 Challenge

analysis

  • En cliquant sur ce lien, tu seras redirigé vers la plateforme WildHack pour réaliser ce challenge. ⚠️ (Nécessite un accès au VPN)
  • Essaye de lire le fichier .passwd en exploitant la faille d'injection de commande.
  • Fais une capture d'écran de la lecture du fichier .passwd en montrant également la commande injectée.
  • Copie-colle tes captures dans un Gist. Partage ton lien public dans la partie solution de cette quête.

Critère de validation :

  • Réussir à lire le fichier .passwd en injectant la commande.