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 :
// Les caractere possible a utliser dans le form...
$caractere_point = "abcdefghijklmnopqrstuvwxyz.";
$caractere_domaine = "abcdefghijklmnopqrstuvwxyz0123456789-_";
// Verification si les buffer "demande" est vide...
if (!$domaine) {
$vartmp = true;
}
if (!$point) {
$vartmp = true;
}
if ($vartmp) {
print" Erreur : Le nom de domaine $domaine$point n'est pas valide.
";
}
else {
$lower = strtolower($domaine);
for($d=0; $dErreur : Caractere non reconnu pour le domaine.
";
}
else {
// Verification caractere par caractere
$lower = strtolower($point);
for($d=0; $dErreur : Caractere non reconnu pour le point.
";
}
else {
system("whois $domaine$point");
}
}
}
?>
4) CONCLUSION
=============
J'ai ecris ce texte uniquement pour les languages via page web, mais ce
bug existe aussi sur les languages en C/C++, PERL, XALAN,....
Attention aussi le bug peut etre encore plus puissant quand le server web
est lancer en root !
Alors faite attention quand vous programmer :-)
5) SYSTEME
==========
Linux
xBSD
6) CREDITS
==========
Descript
Lionel