-= Les trous de securites des CGI (d'apres Phrack 49, vol.7 fichier 8) =-
Cette chose va parler des CGI (Common Gateway Interface), de ses relations
vers le oueb et le net, et surtout d'un point au niveau des vulnerabilites
exposees quand par leurs usage. La plate forme en question est UNIX, et les
exemples en PERL.
Introduction
=-=-=-=-=-=-
Les CGI sont une norme d'"interface" qui permet la communication entre des
clients et serveurs d'information qui comprennent le protocole HTTP
(Hyper-Text Transfer Protocol). TCP/IP est le protocole de communication
utilise par le script cgi et le serveur durant la communication, qui par
defaut est sur le port 80, mais qui peut etre specifie sur n'importe quel
port (de preference non priviligie :>)
Les scripts CGI peuvent paraitre relativement simples du cote du client. Un
tel script peut etre utiliser pour formater un document HTML (Hyper-Text
Markup Language), creer un document HTML, creer de maniere dynamique une
image. CGI stoque ses informations dans des variables d'environnement
systeme qui peuvent etre accedees a travers les scripts CGI. Les scripts CGI
peuvent accepter des arguments sur la ligne de commande.
Les scripts CGI peuvent etre ecrits en compilant des langages de
programmation, ou langages interpretes tels que AppleScript, TCL, PERL, ou
shell script Unix, dont les derniers permettent de modifier facilement les
sources, et qui souvent est plus rapide a developper que des programmes
compiles.
Les methodes disponibles pour un programme CGI est definit dans les
specifications du protocole HHTP 1.0. Les 3 methodes sont le "GET", le
"POST" et le "PUT". GET recupere les informations du client vers le serveur,
POST demande au serveur d'accepter les infos qui sont passees depuis le
serveur vers le client, et le PUT demande au serveur d'accepter les
informations depuis le client (en bref..)
Vulnerabilites
=-=-=-=-=-=-=-
Les vulnerabilites causes par l'utilisation des scripts CGI (arf et le phf?
:) ) ne sont pour la plupart du temps des trous des CGI eux memes, ni du
serveur HTTP, mais CGI simplement permet l'access a ces vulnerabilites. Il y
a d'autres moyens pour exploiter une vulnerabilite sur une box. Par
exemple, des mauvaises permissions de fichiers peuvent etre exploitees en
utilisant FTP ou Telnet. CGI permet simplement plus d'opportunites pour
exploiter celles ci...
Les specifications de CGI permettent eventuellement de lire des fichiers,
recuperer un access shell, et conrompre le systeme de fichiers sur les
machines qui servent de serveur et leurs machines ratachees. La
signification de permettre l'access inclut : exploiter des commandes par le
script.
D'apres les specifications HTTP 1.0, les donnees qui passent par un script
CGI doivent etre encodees pour qu'il marche sur n'importe quel type de
materiel et de plate forme logicielle. Les donnees qui passent par un script
CGI en utilisant la methode GET sont ajoutee a la fin de l'URL (Universal
Resource Locator). Les donnees sont accedees par le script CGI dans une
variable d'environnement appellee QUERY_STRING. Les donnees sont de la
forme variable=valeur, avec certaines valeurs (les caracteres non
alphanumeriques) qui doivent etre "echapees", ce qui signifie que l'on
prend leurs valeurs encodees en deux caracteres hexadecimaux. Le caractere
qui informe de cet encodage est % dans l'URL (%20 pour espace). C'est la
responsabilite des scripts CGI d'echapper ou d'enlever les caracteres dans
des donnees qui lui sont donnees. Les caracteres tels que "<" ou ">", les
delimiteurs pour les tags HTML, sont courament enlevees en utilisant une
simple operation de recherche et remplacage, comme par exemple :
----------------8<------------------------------------------------------------
# Traitement des valeurs entrees
{$NAME, $VALUE) = split(/=/, $_); # separer l'entree sous la forme
# variable=valeur
$VALUE =~ s/\+/ /g; # Remplacer "+" par " "
$VALUE =~ s/%([0-9|A-F]{2})/pack(C,hex,{$1}}/eg; # Remplacer les caracteres
# %xx par leurs valeurs ASCII
# Virer les caracteres a echapper
$VALUE =~ s/([;<>\*\|'&\$!#\(\)\[\]\{\}:"])/\\$1/g;# Enlever les caracteres
# non voulus
$MYDATA[$NAME} = $VALUE; # Assigner la valeur a son tableau associe
----------------8<------------------------------------------------------------
Cet exemple enleve les caracteres speciaux tels que le caractere de
semi-colonne, qui est interprete par le shell par un separateur de
commandes. L'inclusion d'une semi-colonne dans les donnees d'entree permet
la possibilite d'ajouter une commande additionnelle dans la ligne de
commande.
L'exemple suivant est incomplet puisqu'il n'adressse pas la possibilite d'un
caractere "nouvelle ligne" (%0a), qui peut etre utilise pour executer des
commandes autres que celles voulues par le script. Il est possible d'ajouter
un champ a une URL pour executer des fonctions hors du script. Par exemple,
l'URL suivante demande une copie de /etc/passwd depuis la machine serveur :
http://www.odci.gov/cgi-bin/query?%0a/bin/cat%20/etc/passwd
Les caracteres "%0a" et "%20" sont respectivement un retour a la ligne et un
espace en ASCII.
L'interface finale du programme CGI est un document HTML appele formulaire.
Les formulaires incluent le tag HTML . Chaque tag a un nom de
variable associe avec lui. Les scripts CGI actuels filtrent souvent le
contenu du champ . Mais si le script ne filtre pas les caracteres
speciaux, alors une situation similaire a la precedente existe. Les scripts
CGI Interpretes qui manquent a louper les donnees de vont passer les
donnees directement a l'interpreteur.
Un autre tag HTML quiest parfois vu dans les formulaires est le tag