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().