Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

29
Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO

Transcript of Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Page 1: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Programmation CGI

Common Gateway Interface

Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO

Page 2: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

Principe Général

Traitement des informations

Sécurité et CGI

Page 3: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

Section I Principe Général des CGI

Page 4: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Intérêt des CGI Modification dynamique de page web (page non statique)

Norme CGIInterface entre une application et un serveur (donnée -> HTML)Script CGI : programme exécutable avec des droits : r-xr-xr-xExécuté par le serveur (Web) dans un répertoire spécifiqueTransparent pour les utilisateursProgrammé en différents langages (Perl, C/C++, Shell Unix, ...)

Description Générale

Page 5: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Exemple en Perlscriptcgi.pl : exécution automatique

#!/usr/bin/perlprint "Content-type:text/html\n\n"; # sortie de type text/htmlprint <<EOF; # ligne libre obligatoire (\n\n)<HTML><HEAD><TITLE>Script CGI</TITLE></HEAD><BODY BGCOLOR=\"#FFFFFF\"><BR><BR><BR><BR><CENTER>

<H1> Salut &agrave; tous<p>voici le r&eacute;sultat d’un script CGI </H1> </CENTER>

</BODY></HTML>EOF

Page 6: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

#include <stdio.h>

main(){printf ("Content-type:text/html\n\n"); printf("<HTML><HEAD><TITLE>Script CGI</TITLE></HEAD>\n"); printf("<BODY BGCOLOR=\"#FFFFFF\">\n"); printf("<BR><BR><BR><BR>\n"); printf("<CENTER><H1>\n");

printf("Salut &agrave; tous<p>voici le r&eacute;sultat d’un script CGI\n"); printf("</H1></CENTER>\n"); printf("</BODY>\n"); printf("</HTML>\n"); }

Exemple en Cscriptcgi : doit être compilé

Page 7: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

ExempleAppel des CGI : http://www.nomdomaine.com/cgi-bin/scriptcgi.pl

http://www.nomdomaine.com/cgi-bin/scriptcgi

Page 8: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Utilisation des CGI :

Traitement de formulaire Webmails, chatInterrogation de BDDCompteurs, Livre d ’Or,...

Description Générale

Page 9: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Utilisateur Serveur CGI

Requête URL

Traitement des données

Charge leformulaire

Complète puis validation

Réception des données

Interaction Formulaire et CGI

Page 10: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

Section II Traitement des Informations

Page 11: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Appel des CGI

Lien<A HREF=“/cgi-bin/monscript.cgi“> appel CGI </A>

Image <IMG SRC=“/cgi-bin/compteur.cgi“>

SSI (Server Side Includes)<!--#exec cgi= “/cgi-bin/compteur.cgi“--><!--#include virtual= “/cgi-bin/monscript.cgi“-->

Formulaires <FORM ACTION=“/cgi-bin/monscript.cgi“ METHOD= “get“>

Page 12: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les Formulaires HTML

Page 13: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les Formulaires HTML

Page 14: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les méthodes POST et GET

Méthode GET Réception des données : Variable d’environnement QUERY_STRING Pas de données trop importantes ni trop confidentielles Arguments passés dans l’URL (1024 caractères maximum)

Méthode POST Données transmises via l’entrée standard (STDIN) Taille des données dans la variable CONTENT_LENGTH

Dans les 2 cas Données transmises au format URL-encoded (les espaces sont remplacés par des +, les ~ par %7E … ) Nécessité d’une « moulinette » pour retrouver les bons caractères

Page 15: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Le CGI en C

Page 16: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Exécution avec la méthode GET

Page 17: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Exécution avec la méthode POST

Page 18: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Remarques

Les bibliothèques On peut utiliser des bibliothèques existantes pour faciliter le traitement exemple en C : avec la bibliothèque cgi-util

char name[1024];cgiinit();getentry(name, “Name“);

Les variables d’environnement QUERY_STRING, REQUEST_METHOD, CONTENT_LENGTH

HTTP_REFERER : URL de la source REMOTE_ADDR : IP du client HTTP_USER_AGENT : Signature du navigateur …

Page 19: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

Section III Sécurité et CGI

Page 20: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les Dangers des CGI

Risques de « plantage » du serveur

Appel en boucle d’un CGI en vue de faire monter la charge système ou envoi d’une trop grande quantité de données.

Risques d’intrusion

Exécution d’une commande non voulue sur le serveur permettant de détruire le système ou de voler des fichiers confidentiels (/etc/password)

Page 21: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les Risques de Plantage

Attaques de type DOS ( Denial Of Service )

Le pirate cherche à rendre inactif le système, à le faire « crasher » en occupant toutes les ressources mémoire ou CPU du serveur.

Problème de BUFFER OVERFLOW

La taille des données envoyées est supérieure à celle de la variable utilisée dans le script pour les stocker.

Page 22: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Les Risques de Vol d’informations

Un script CGI mal écrit peut permettre à une personne malveillante d’accéder à certains fichiers sensibles.

Le pirate peut récupérer les mots de passe utilisateurs par le biais du fichier /etc/passwd, il y a perte de confidentialité.

Le cracker peut modifier le code de manière à pouvoir exécuter d’autres commandes.

Page 23: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Stratégie et Solutions de Sécurité

Une des principales stratégie à adopter peut se résumer en une brève maxime:

Ne faites jamais confiance aux données fournies par l’utilisateur.

Les problèmes de sécurité surviennent lorsque des suppositions sont faîtes sur les données et sur les utilisateurs qui ne font jamais ce qui est attendu, de façon volontaire ou involontaire.

Pour sécuriser un script CGI, il faut faire preuve de créativité en imaginant tous les cas possibles.

Page 24: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Réduire les Risques de Plantage

Il faut vérifier la validité des informations reçues du client.

Origine des données

Il faut s’assurer grâce à la variable d’environnement HTTP_REFERER que la requête vient bien du site web et non d ’une autre adresse.

Cohérence des données

Il faut vérifier la taille des entrées avant tout traitement ce qui permettra de refuser le traitement si la taille excède celle attendue.

Page 25: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Réduire les Risques d’Intrusion

Au niveau du programme CGI

L’utilisateur et le groupe auxquels de programme CGI appartient doivent avoir des droits limités.

ex : utilisateur nobody

Le programme CGI ne doit pas être accessible en écriture, afin d’empêcher un éventuel pirate de lui ajouter du code, ce qui reviendrais à lui laisser un accès au shell du serveur.

droits : 555 (r-x r-x r-x)

…soit lecture et exécution pour tous, écriture impossible

Page 26: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Réduire les Risques d’Intrusion

Au niveau du répertoire

Le répertoire dans lequel sont stockés les CGI (cgi-bin) ne doit pas être accessible en écriture par n’importe qui afin d’empêcher qu’un pirate n’ajoute un script malveillant sur le serveur.

Au niveau des fichiers de données

Les fichiers de données dans lesquels le CGI peut écrire ne doivent être accessible en écriture que par le propriétaire du CGI .

droits 644 (rw- r- - r- -) …soit lecture et écriture pour le propriétaire et lecture seule pour les autres

Page 27: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

Remarques

Importance du langage de programmation

Les CGI compilés (langages C,C++…) sont plus sûrs car l’accès aux sources est plus compliqué, voir impossible.

Les CGI interprétés (langage Perl, scripts shell …) sont plus vulnérables, et consomment plus de ressources.

Un serveur Web n’est pas un serveur d’applications

Les CGI ne doivent pas réaliser directement des traitements lourds. Il faut déléguer ces tâches au serveur d’applications afin de préserver les ressources du serveur Web.

Page 28: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

En Conclusion …

Page 29: Programmation CGI Common Gateway Interface Julien FAURE - Fabien FONTVIEILLE - Nicolas HERRERO.

La Programmation CGI

Un outil puissant, mais complexe

Des risques non négligeables

Les alternatives : ASP, PHP, JSP…