note 13225 deleted from security by jimw

From: Date: Wed, 31 Oct 2001 01:15:18 +0000
Subject: note 13225 deleted from security by jimw
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-19658@lists.php.net to get a copy of this message
Vulnerabilité "Escape shell" 1) INTRO Escape shell : sortie sur un shell. Beaucoup de programmeur CGI, PHP,... oublie certaine regle de securité importante. En l'occurence là, c'est l'escape shell. Ce bug est, je sais pas nouveau mais encore courament vue. C'est pour ca que j'ecris ce texte. 2) FONCTIONNEMENT Utilisation de caractere speciaux dans une variable qui est utiliser ensuite dans une commande shell (souvent system). Imaginons qu'une page formulaire doit envoyer une variable a un script php qui doit lui meme reprendre la variable pour l'executer par une commande system() EX 1 : pour un "whois" Je veux verifier un nom de domaine via ma page web. je vais donc utiliser <? system("whois $lenomdomaine"); ?> $lenomdomaine est une variable envoyer par un formulaire La il y a un bug dans ce code, car il n'y pas de filtre de caracteres dans la variable $lenomdemaine.C'est a dire que si je reprend la variable et que au lieu de mettre "microsoft.com", je mette "yahoo.com;ps%20ax" j'aurais fait une liste de processe de la machine :-), je peut tres bien mettre '/bin/sh', 'halt', 'reboot', 'rm -rf /',.... 3) SOLUTION Comme je l'ais dit il faut filtrer les caracteres dans le buffer et autorisé uniquement : "azertyuiopqsdfghjklmwxcvbn1234567890." Je vous propose un solution en PHP : Utiliser la fonction filtre($buffer, 0); pour utiliser les caractere par default. function filtre($demande_filtre, $suite_caractere) { if ($suite_caractere == false) { $caractere = "abcdefghijklmnopqrstuvwxyz0123456789."; } else { $caractere = $suite_caractere; } $lower = strtolower($demande_filtre); for($d=0; $d<strlen($lower); $d++) { $strmichael = substr($lower, $d, 1); $tmp_verif = strstr($caractere, $strmichael); if ($tmp_verif != "") { $varverif = true; } else { $varverif = false; $d = strlen($lower); } } if (!$varverif) { return(false); } else { return(true); } } 4) CONCLUSIONJ'ai ecris ce texte uniquement pour les languages via page web, mais cebug existe aussi sur les languages en C/C++, PERL, XALAN,....Attention aussi le bug peut etre encore plus puissant quand le server webest lancer en root !Alors faite attention quand vous programmer :-) 5) SYSTEME Linux xBSD 6) CREDITS Descript <descript@subakt.fr>

« previous php.notes (#19658) next »