PHP et sécurité. - Olivier Le Cadet

Transcription

PHP et sécurité. - Olivier Le Cadet
SRC2
Web avancé. Sécurité.
2008/2009
PHP et sécurité.
Ecrire un programme ”peu sécurisé”
Il est déjà écrit et présent sur ecampus : récupérer le fichier appelé EssaiSecurite.php. Ce programme demande
à un utilisateur de s’identifier, en vérifiant login et password dans une base de données. Un utilisateur identifié peut
ensuite choisir de voter ou non pour ce site. Si un utilisateur vote, son login est ajouté dans un ficher vote.txt.
1. Récupérez ce fichier et mettez-le dans un sous-répertoire de public_html.
2. Adaptez-le pour qu’il fonctionne : créer deux utilisateurs dans votre base de données qui auront le droit de se
connecter.
3. Testez-le.
Nous allons désormais attaquer ce programme pour en exploiter les (nombreuses !) faiblesses : faire voter un utilisateur à son insu, se loguer sans avoir de mot de passe, etc... Le programme est basique, donc les attaques seront
basiques également, mais permettent de comprendre le principe des différentes failles...
Injection SQL
1. Testez le formulaire d’identification : est-ce que cela fonctionne lorsque vous rentrez un bon login mais un mauvais
mot de passe ?
2. Mettez un login existant dans votre base de données et mettez comme mot de passe : ’ OR ’1=1
3. Que se passe-t-il ?
4. Utilisez mysql_real_escape_string() pour vous protéger de cette attaque. Vous pouvez faire afficher $password
avec puis sans mysql_real_escape_string() pour constater la différence.
Attaque XSS
1. Déloguez vous, puis reloguez vous en mettant comme login :
<script>document.title=’this site sucks’;</script> et ce que vous voulez comme mot de passe.
2. Que s’est-il passé ?
3. pour contrer cette attaque, utilisez la fonction htmlentities()
4. Notez que de la même façon, javascript donne accès aux cookies (document.cookies) et à tous les éléments du
DOM...
Attaque CSRF
1. Créez une page AttaqueCSRF.php contenant une image dont l’attribut SRC vaut
http://venus/~VotreLogin/VotreRepertoire/EssaiSecurite.php?choix=1
2. Dans un onglet, ouvrez EssaiSecurite.php, identifiez vous, et ne votez pas. Sans fermer votre session, allez visiter
la page AttaqueCSRF.php. Allez voir le fichier vote.txt. Que s’est-il passé ?
3. Parade : rajoutez dans le formulaire un champ caché dont vous vous servez, comme vu dans le cours, pour vérifier
que les réponses fournies proviennent bien du formulaire naturel et non d’une autre page (utilisez time()).
Register globals
1. Créez à la racine de votre dossier public_html un fichier .htaccess (commencez, sous windows, par l’appeler
a.htaccess avant de le renommer depuis votre éditeur de texte) avec dedans la phrase : php_flag register_globals on
(Veillez à changer le on en off avant la fin du TD !). Ceci vous autorise l’utilisation de register_globals ($admin
sera équivalent ) $\_GET[’admin’]).
2. vous pouvez vérifier qu’il est bien activé avec ini_get(’register_globals’)
3. déconnectez vous de EssaiSecurite.php. Ensuite rentrez l’adresse
http://venus/~VotreLogin/VotreRepertoire/EssaiSecurite.php?login=1.
4. Que s’est-il passé ? Désactivez register_globals.
SRC2
Web avancé. Sécurité.
2008/2009
Faille RFI
1. Mettez les deux premières lignes du script, avant le session_start(), dans un autre fichier (conf.php par
exemple) qui devra être inclus via l’URL : mettez donc à leur place $page=$_GET[’page’]; include($page.".php");
et appelez http://venus/<login>/.../EssaiSecurite.php?page=nomFichier (sans l’extension .php) pour inclure ces deux lignes.
2. Créez un autre fichier hack.php et forcez votre programme à l’exécuter en appelant
http://venus/<login>/.../EssaiSecurite.php?page=hack. Selon la configuration du serveur, vous pouvez
mettre page=unFichierDistant...
3. Protection : faites une white list : définissez un tableau de noms qui contient les noms des fichiers qui ont le
droit d’être inclus. Vérifiez que le fichier que vous voulez inclure a bien son nom dans ce tableau.
Fixation de session
1. Suivez l’adresse : http://venus/<login>/.../EssaiSecurite.php?PHPSESSID=1234, puis connectez vous.
2. Ouvrez un autre navigateur et tapez http://venus/<login>/.../EssaiSecurite.php?PHPSESSID=1234,
3. Voyez vous le risque ? Pour parer cela changez les deux lignes avant le session_start() vous pouvez aussi
regénerer une session après identification en utilisant session_regenerate_id().