SÉCURITÉ
PHP ET MYSQL   Paris, France, 4 juin 2012
         1
MENU DU JOUR


Comment vérifier la sécurité de son application

  Vérification du site en production

  Analyse à code ouvert

  Rédaction d’un rapport d’audit



                               2
AYE’ CAPTAIN


Damien Seguy

  damien.seguy@gmail.com

Expert LAMP

Directeur Technique @ bysoft China




                               3
QUESTIONS?
   Réponses?
REFERENTIELS
SÉCURITÉ
OWASP

HIPAA

PCI card industry

Sarbanes-Oxley

Basel II

JSOX
OWASP

Cod   Nom                                      Site Code
e
A1    Injection                                      X
A2    Cross-Site Scripting (XSS)                X    X
A3    Broken Authentication and Session         X
A4    Insecure Direct
      Management Object References              X
A5    Cross-Site Request Forgery (CSRF)         X    X
A6    Security Misconfiguration                  X
A7    Insecure Cryptographic Storage                 X
A8    Failure to Restrict URL Access            X
A9    Insufficient Transport Layer Protection    X
A10   Unvalidated Redirects and Forwards             X
VOCABULAIRE
Découverte

   En apprendre plus sur l’application

Vulnérabilité

   Une faille qui permet de perturber le système

Attaque

   Une vulnérabilité avec un objectif


                              7
MANTRA



Valider les données en entrée

Nettoyer les données

Ne rien laisser trainer sur le site
VALIDER LES DONNÉES



Vérifiez les variables entrantes

Vérifiez les URL entrantes aussi!

Vérifiez les fichiers
https://www.shacombank.com.hk/ibanking/dse/html/customer/zh_TW/
   INError.jsp?errCode=2163&encoding=zh_TW&errMode=AE%22;}
document.write%28%22%3Ciframe%20src=%27http://xssed.com%27%3E
        %22%29;%20function%20test%28%29{var%20a=%22
VÉRIFIEZ LES URLS
VÉRIFIEZ LES URLS
PROTÉGÉ PAR
 BROWSER?
1. <?php
2.
3. $url = "http://www.grosbill.com/4-xxxx"_-144413-
   tv_video-lecteur_dvd_de_salon";
4.
5. $html = file_get_contents($url);
6.
7. print $html;
8. ?> document.write('              <iframe src="http://
   www.facebook.com/plugins/like.php?href=http://
     www.grosbill.com/4-xxxx"_-144413-tv_video-
  lecteur_dvd_de_salon&amp;send=true&amp;layout=b
                        utton_....
INJECTION PAR GIF

Prenez une image GIF, ajoutez phpinfo()

Envoyez la sur le site

Si tous les fichiers sont traités par PHP...
NETTOYER LES DONNÉES


 On a une injection quand une valeur parvient à une autre
 technologie que PHP, et y fait autre chose que ce qui est attendu.

 Toutes les injections ont la même origine :
NETTOYER LES DONNÉES


 On a une injection quand une valeur parvient à une autre
 technologie que PHP, et y fait autre chose que ce qui est attendu.

 Toutes les injections ont la même origine :



                               .
NETTOYER LES DONNÉES


 On a une injection quand une valeur parvient à une autre
 technologie que PHP, et y fait autre chose que ce qui est attendu.

 Toutes les injections ont la même origine :



                               .
CARACTERES
SPÉCIAUX

HTML : ", ', <, >, &

URL : %, /

Query : &, ?, =

SQL : /, #, ", '

et encore Shell, XML, LDAP, Path, PDF, Javascript, header HTTP,
cookies, domaines,...
METHODES DE
PROTECTION

HTML : htmlentities, htmlspecialchars

URL : rawurlencode

Query : urlencode

SQL : requêtes préparées, mysql_real_escape_string..

et encore Shell, XML, LDAP, Path, PDF, Javascript, header HTTP,
cookies, ...
BONNE PRATIQUE

Systématisez les protections avec le framework

  Framework généralistes

  Classe maison

Assurez un nettoyage minimal au retour des données

  Qui d’autre manipule la base de données?
APPROCHE D’AUDIT



Identifiez les données entrantes

Notion de variables corrompues (tainted variables) : on se méfie des
variables tant qu’elles n’ont pas été validée
TRACABILITÉ

 $_CLEAN

public function nameAction() {
   $request = $this->getRequest();
   $validator = new Zend_Validate_Alnum();
   $_CLEAN['username'] = $validator->isValid(
                           $request->getParam('username'));
}

 les variables locales ne sont créées qu’apres validation
public function nameAction() {
   $request = $request->query;
   $validator = $this->get('validator');
   $username = $validator->validate($request->get('username'))
}
RETRO-TRACABILITÉ

En Zend Framework, surveillez les Db:factory

En Symfony, les appels à getCurrentConnection()

mysql_query, pg_query.




Puis, remontez à l’origine du code
STÉGANOGRAPHIE


L’art de cacher les choses à
la vue de tous

Trouvez la tour l’une des
tours les plus hautes du
monde dans l’image
suivante
STÉGANOGRAPHIE


L’art de cacher les choses à
la vue de tous

Trouvez la tour l’une des
tours les plus hautes du
monde dans l’image
suivante
STÉGANOGRAPHIE


L’art de cacher les choses à
la vue de tous

Trouvez la tour l’une des
tours les plus hautes du
monde dans l’image
suivante
ROBOTS.TXT




http://www.pcf.fr/robots.txt
ROBOTS.TXT

Empoisonnez les données

  Ne mettez pas seulement les dossiers à protéger

  Mettez des dossiers qui n’existent pas

  Notez les IP qui s’y connectent

Vérifiez en ligne les URLs de votre site
MÊME EN ASP
MÊME EN ASP
AFFICHAGES D’ERREURS
BONNES PRATIQUES

Masquez les informations sur votre systeme

  expose_php = off, ServerSignature Off

Ayez un dossier hors Web Root

  Listez votre racine Web

Faites la chasse aux debug :

  echo, print, print_r, var_dump, krumo
RAPPORT D’AUDIT

Consignez vos audits

  Un rapport, un wiki, un log ou blog

  Notez les réussites et les points à améliorer

Automatisez ce qui est important

  Integration continue, cron, scripts manuels...

  Faites le reste a la main, a budgeter
STRUCTURE


Résumé exécutif

  3 paragraphes, simples à lire

Liste des vérifications réalisées et résultats (OK, KO)

Détails et explications sur chaque point à améliorer
RÉSUMÉ

Point sécurité     Impact      Probabilité   Correctif


      XSS          Important      Forte       Lourd

Zone privée sans
                    Moyen       Toujours      Faible
      SSL

   Fichiers
                   Important     Faible       Faible
  découverts

   URLs mal
                     Fort        Faible       Moyen
   protégées
DÉTAILS

Titre

Exemple dans le code, explications théoriques

Suggestion de correction

  Mentionner les limitations de la correction

Liste des occurrences

  Ou le moyen de les trouver
MERCI!

damien.seguy@gmail.com

http://www.slideshare.net/dseguy
A L’ABORDAGE

Epitech securite-2012.key

  • 1.
    SÉCURITÉ PHP ET MYSQL Paris, France, 4 juin 2012 1
  • 2.
    MENU DU JOUR Commentvérifier la sécurité de son application Vérification du site en production Analyse à code ouvert Rédaction d’un rapport d’audit 2
  • 3.
    AYE’ CAPTAIN Damien Seguy damien.seguy@gmail.com Expert LAMP Directeur Technique @ bysoft China 3
  • 4.
    QUESTIONS? Réponses?
  • 5.
  • 6.
    OWASP Cod Nom Site Code e A1 Injection X A2 Cross-Site Scripting (XSS) X X A3 Broken Authentication and Session X A4 Insecure Direct Management Object References X A5 Cross-Site Request Forgery (CSRF) X X A6 Security Misconfiguration X A7 Insecure Cryptographic Storage X A8 Failure to Restrict URL Access X A9 Insufficient Transport Layer Protection X A10 Unvalidated Redirects and Forwards X
  • 7.
    VOCABULAIRE Découverte En apprendre plus sur l’application Vulnérabilité Une faille qui permet de perturber le système Attaque Une vulnérabilité avec un objectif 7
  • 8.
    MANTRA Valider les donnéesen entrée Nettoyer les données Ne rien laisser trainer sur le site
  • 9.
    VALIDER LES DONNÉES Vérifiezles variables entrantes Vérifiez les URL entrantes aussi! Vérifiez les fichiers
  • 12.
    https://www.shacombank.com.hk/ibanking/dse/html/customer/zh_TW/ INError.jsp?errCode=2163&encoding=zh_TW&errMode=AE%22;} document.write%28%22%3Ciframe%20src=%27http://xssed.com%27%3E %22%29;%20function%20test%28%29{var%20a=%22
  • 13.
  • 14.
  • 15.
    PROTÉGÉ PAR BROWSER? 1.<?php 2. 3. $url = "http://www.grosbill.com/4-xxxx"_-144413- tv_video-lecteur_dvd_de_salon"; 4. 5. $html = file_get_contents($url); 6. 7. print $html; 8. ?> document.write(' <iframe src="http:// www.facebook.com/plugins/like.php?href=http:// www.grosbill.com/4-xxxx"_-144413-tv_video- lecteur_dvd_de_salon&amp;send=true&amp;layout=b utton_....
  • 16.
    INJECTION PAR GIF Prenezune image GIF, ajoutez phpinfo() Envoyez la sur le site Si tous les fichiers sont traités par PHP...
  • 17.
    NETTOYER LES DONNÉES On a une injection quand une valeur parvient à une autre technologie que PHP, et y fait autre chose que ce qui est attendu. Toutes les injections ont la même origine :
  • 18.
    NETTOYER LES DONNÉES On a une injection quand une valeur parvient à une autre technologie que PHP, et y fait autre chose que ce qui est attendu. Toutes les injections ont la même origine : .
  • 19.
    NETTOYER LES DONNÉES On a une injection quand une valeur parvient à une autre technologie que PHP, et y fait autre chose que ce qui est attendu. Toutes les injections ont la même origine : .
  • 20.
    CARACTERES SPÉCIAUX HTML : ",', <, >, & URL : %, / Query : &, ?, = SQL : /, #, ", ' et encore Shell, XML, LDAP, Path, PDF, Javascript, header HTTP, cookies, domaines,...
  • 21.
    METHODES DE PROTECTION HTML :htmlentities, htmlspecialchars URL : rawurlencode Query : urlencode SQL : requêtes préparées, mysql_real_escape_string.. et encore Shell, XML, LDAP, Path, PDF, Javascript, header HTTP, cookies, ...
  • 22.
    BONNE PRATIQUE Systématisez lesprotections avec le framework Framework généralistes Classe maison Assurez un nettoyage minimal au retour des données Qui d’autre manipule la base de données?
  • 23.
    APPROCHE D’AUDIT Identifiez lesdonnées entrantes Notion de variables corrompues (tainted variables) : on se méfie des variables tant qu’elles n’ont pas été validée
  • 24.
    TRACABILITÉ $_CLEAN public functionnameAction() { $request = $this->getRequest(); $validator = new Zend_Validate_Alnum();  $_CLEAN['username'] = $validator->isValid( $request->getParam('username')); } les variables locales ne sont créées qu’apres validation public function nameAction() { $request = $request->query; $validator = $this->get('validator');  $username = $validator->validate($request->get('username')) }
  • 25.
    RETRO-TRACABILITÉ En Zend Framework,surveillez les Db:factory En Symfony, les appels à getCurrentConnection() mysql_query, pg_query. Puis, remontez à l’origine du code
  • 26.
    STÉGANOGRAPHIE L’art de cacherles choses à la vue de tous Trouvez la tour l’une des tours les plus hautes du monde dans l’image suivante
  • 27.
    STÉGANOGRAPHIE L’art de cacherles choses à la vue de tous Trouvez la tour l’une des tours les plus hautes du monde dans l’image suivante
  • 28.
    STÉGANOGRAPHIE L’art de cacherles choses à la vue de tous Trouvez la tour l’une des tours les plus hautes du monde dans l’image suivante
  • 38.
  • 40.
    ROBOTS.TXT Empoisonnez les données Ne mettez pas seulement les dossiers à protéger Mettez des dossiers qui n’existent pas Notez les IP qui s’y connectent Vérifiez en ligne les URLs de votre site
  • 41.
  • 42.
  • 43.
  • 44.
    BONNES PRATIQUES Masquez lesinformations sur votre systeme expose_php = off, ServerSignature Off Ayez un dossier hors Web Root Listez votre racine Web Faites la chasse aux debug : echo, print, print_r, var_dump, krumo
  • 45.
    RAPPORT D’AUDIT Consignez vosaudits Un rapport, un wiki, un log ou blog Notez les réussites et les points à améliorer Automatisez ce qui est important Integration continue, cron, scripts manuels... Faites le reste a la main, a budgeter
  • 46.
    STRUCTURE Résumé exécutif 3 paragraphes, simples à lire Liste des vérifications réalisées et résultats (OK, KO) Détails et explications sur chaque point à améliorer
  • 47.
    RÉSUMÉ Point sécurité Impact Probabilité Correctif XSS Important Forte Lourd Zone privée sans Moyen Toujours Faible SSL Fichiers Important Faible Faible découverts URLs mal Fort Faible Moyen protégées
  • 48.
    DÉTAILS Titre Exemple dans lecode, explications théoriques Suggestion de correction Mentionner les limitations de la correction Liste des occurrences Ou le moyen de les trouver
  • 49.
  • 50.