Audits PHP
Faire le point sur son code<script>alert(‘XSS’)</s
Bordeaux, France, 6 juillet 2010
Agenda


Faire un audit PHP
Etudier le code PHP
S’organiser pour améliorer la qualité du code
Intervenant

 Damien Seguy
 Eleveur d’éléPHPants
 Expert LAMP chez Alter Way
 damien.seguy@alterway.fr
No,
we won’t
take
question
3 types


Audit de sécurité
Audit de performances
Audit de qualité de code
Audit de code PHP

Entrevue avec les développeurs : 1 jour
Analyse boîte noire             : 1 jour
Analyse à code ouvert ...
Entrevue des développeurs

              Qui : se présenter
              Quoi : que fait cette
              application?...
Que rechercher?
Ce qui est dit
  Trop précis, trop général
Ce qui n’est pas dit
  Les omissions
Ne pas hésiter à faire rép...
Analyse boîte noire
 Test depuis l’extérieur
 Inclus l’application dans son ensemble
 Inclus l’environnement : moteurs de ...
Code ouvert


Quels sont les points d’entrée?
Sont-ils accessibles? Protégés?
  Comment exploiter ce problème?
Que rechercher?
  Injections
    PHP
    SQL
    HTML
    system
    HTTP
Soyez concentrés

             Il est facile de perdre
             l’objectif de vue
             Il est tentant de tout ...
Injections PHP
Injections PHP
  include, require et *_once
  back ticks ` `
  eval(‘’)
  assert(), preg_replace_callback, ...
Recherche eval désespérément
  Deux approches :
  grep
    Rapide, universel, facile
    853 occurrences
  Tokenizer PHP
 ...
Tokenizer
<?php print ("hello $world! "); ?>
  [1] => Array
      (                   [6] => Array
          [0] => 266   ...
Evals

◦ eval('$retour=$GLOBALS["'.$matches[1].'"];')
  ◦ Variable variables
◦ eval($contenu_thjipk);
◦ eval($contents_ess...
Evals

◦ eval('$retour=$GLOBALS["'.$matches[1].'"];')
  ◦ Variable variables
◦ eval($contenu_thjipk);
◦ eval($contents_ess...
Evals

◦ eval('$retour=$GLOBALS["'.$matches[1].'"];')
  ◦ Variable variables
◦ eval($contenu_thjipk);
◦ eval($contents_ess...
Evals

◦ eval('$retour=$GLOBALS["'.$matches[1].'"];')
  ◦ Variable variables
◦ eval($contenu_thjipk);
◦ eval($contents_ess...
Evals

◦ eval('$retour=$GLOBALS["'.$matches[1].'"];')
  ◦ Variable variables
◦ eval($contenu_thjipk);
◦ eval($contents_ess...
Vérifier le code

 Erreur en une ligne
   Parfois, une seule ligne est suffisante
 Parfois, non
   Il faut prendre en compte...
Audit statistiques


 Extraire un type d’information
 Relire la liste hors de contexte
 Sert de point d’entrée pour plus d...
Variables
 6883 variables différentes
 Toutes les variables possibles en une lettre
 32 chars : $cache_maxsize_UTF8StringT...
Rapport

Résumé exécutif
  3 paragraphes, simples à lire
Résumé des problèmes rencontrés
Details et explications
Annexes
Rapport
     Indice         Qualité   Correctif

Variables courtes   Basse     Compliqué

Trop de méthodes    Moyen      M...
Détails
 Titre
 Exemple dans le code, explication
 Suggestion de corrections
   Limitations
 Liste des occurrences
   Ou u...
Travail d’équipe

 L’audit intervient toujours après le codage
   Une fois
   Si nécessaire
   Régulièrement
   Continueme...
Mantras PHP


Listez vos mantra
Choisissez les 5 règles les plus importantes
Imprimez-le, faites les réciter
Audits croisés

 Faîtes des binômes
   Chaque développeur doit relire le code de l’autre
   À la lumière des mantras
 Proc...
Audits collaboratifs

 Groogle (http://groogle.sourceforge.net)
 Review Board (http://www.review-board.org/)
 Rietveld htt...
Audit communautaire?

Mantra, audits croisés : drive-by auditing
  Capter les remarques dès que possible
Ouvert à tous?
  ...
Questions?
damien.seguy@alterway.fr
Prochain SlideShare
Chargement dans…5
×

Audits php

1 661 vues

Publié le

Session sur les audits PHP, donnée dans le cadre des RMLL 2010.

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 661
Sur SlideShare
0
Issues des intégrations
0
Intégrations
8
Actions
Partages
0
Téléchargements
25
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive































  • Audits php

    1. 1. Audits PHP Faire le point sur son code<script>alert(‘XSS’)</s Bordeaux, France, 6 juillet 2010
    2. 2. Agenda Faire un audit PHP Etudier le code PHP S’organiser pour améliorer la qualité du code
    3. 3. Intervenant Damien Seguy Eleveur d’éléPHPants Expert LAMP chez Alter Way damien.seguy@alterway.fr
    4. 4. No, we won’t take question
    5. 5. 3 types Audit de sécurité Audit de performances Audit de qualité de code
    6. 6. Audit de code PHP Entrevue avec les développeurs : 1 jour Analyse boîte noire : 1 jour Analyse à code ouvert : 2 jours Rapport et revue : 1 jour
    7. 7. Entrevue des développeurs Qui : se présenter Quoi : que fait cette application? Comment : comment est organisé le code?
    8. 8. Que rechercher? Ce qui est dit Trop précis, trop général Ce qui n’est pas dit Les omissions Ne pas hésiter à faire répéter Reposer la question sous une autre forme
    9. 9. Analyse boîte noire Test depuis l’extérieur Inclus l’application dans son ensemble Inclus l’environnement : moteurs de recherche, Résultats spectaculaires AUTOMATISEZ! Outils : skipfish, rats, nikto, Wapiti, PHP
    10. 10. Code ouvert Quels sont les points d’entrée? Sont-ils accessibles? Protégés? Comment exploiter ce problème?
    11. 11. Que rechercher? Injections PHP SQL HTML system HTTP
    12. 12. Soyez concentrés Il est facile de perdre l’objectif de vue Il est tentant de tout auditer Tout n’est pas bon à rapporter
    13. 13. Injections PHP Injections PHP include, require et *_once back ticks ` ` eval(‘’) assert(), preg_replace_callback, preg_replace + /e __autoload, loadLibrary, loadModule...
    14. 14. Recherche eval désespérément Deux approches : grep Rapide, universel, facile 853 occurrences Tokenizer PHP Sémantique, précis 37 occurrences Expressions rationnelles...?
    15. 15. Tokenizer <?php print ("hello $world! "); ?> [1] => Array ( [6] => Array [0] => 266 ( [1] => print [0] => 309 [2] => 1 [1] => $world ) [2] => 1 ) [2] => Array ( [7] => Array [0] => 370 ( [1] => [0] => 314 [2] => 1 [1] => ! ) [2] => 1 ) [3] => ( [4] => " [8] => " [5] => Array [9] => ) ( [10] => ; [0] => 314 [1] => Array [1] => hello ( [2] => 1 [0] => Token PHP ) [1] => code PHP [2] => Ligne du script ) [2] => "
    16. 16. Evals ◦ eval('$retour=$GLOBALS["'.$matches[1].'"];') ◦ Variable variables ◦ eval($contenu_thjipk); ◦ eval($contents_essai); ◦ Le contenu est lu dans une variable, puis exécuté : un include? ◦ eval('$hexdtime = "'.$hexdtime.'";') ◦ Un moyen détourné pour transformer une chaîne en entier ◦ eval('$retour2.= '.var_dump($recept->erreur).';') ◦ Ceci est complètement inutile....
    17. 17. Evals ◦ eval('$retour=$GLOBALS["'.$matches[1].'"];') ◦ Variable variables ◦ eval($contenu_thjipk); ◦ eval($contents_essai); ◦ Le contenu est lu dans une variable, puis exécuté : un include? ◦ eval('$hexdtime = "'.$hexdtime.'";') ◦ Un moyen détourné pour transformer une chaîne en entier ◦ eval('$retour2.= '.var_dump($recept->erreur).';') ◦ Ceci est complètement inutile....
    18. 18. Evals ◦ eval('$retour=$GLOBALS["'.$matches[1].'"];') ◦ Variable variables ◦ eval($contenu_thjipk); ◦ eval($contents_essai); ◦ Le contenu est lu dans une variable, puis exécuté : un include? ◦ eval('$hexdtime = "'.$hexdtime.'";') ◦ Un moyen détourné pour transformer une chaîne en entier ◦ eval('$retour2.= '.var_dump($recept->erreur).';') ◦ Ceci est complètement inutile....
    19. 19. Evals ◦ eval('$retour=$GLOBALS["'.$matches[1].'"];') ◦ Variable variables ◦ eval($contenu_thjipk); ◦ eval($contents_essai); ◦ Le contenu est lu dans une variable, puis exécuté : un include? ◦ eval('$hexdtime = "'.$hexdtime.'";') ◦ Un moyen détourné pour transformer une chaîne en entier ◦ eval('$retour2.= '.var_dump($recept->erreur).';') ◦ Ceci est complètement inutile....
    20. 20. Evals ◦ eval('$retour=$GLOBALS["'.$matches[1].'"];') ◦ Variable variables ◦ eval($contenu_thjipk); ◦ eval($contents_essai); ◦ Le contenu est lu dans une variable, puis exécuté : un include? ◦ eval('$hexdtime = "'.$hexdtime.'";') ◦ Un moyen détourné pour transformer une chaîne en entier ◦ eval('$retour2.= '.var_dump($recept->erreur).';') ◦ Ceci est complètement inutile....
    21. 21. Vérifier le code Erreur en une ligne Parfois, une seule ligne est suffisante Parfois, non Il faut prendre en compte le contexte Lire le code à l’envers
    22. 22. Audit statistiques Extraire un type d’information Relire la liste hors de contexte Sert de point d’entrée pour plus de questions
    23. 23. Variables 6883 variables différentes Toutes les variables possibles en une lettre 32 chars : $cache_maxsize_UTF8StringToArray Plus utilisée : $i (2586 fois) $_1904, $samedi, $dummy, $sss, 19 $unknowns 711 variables utilisées une seule fois
    24. 24. Rapport Résumé exécutif 3 paragraphes, simples à lire Résumé des problèmes rencontrés Details et explications Annexes
    25. 25. Rapport Indice Qualité Correctif Variables courtes Basse Compliqué Trop de méthodes Moyen Moyen Trop de Fort Simple dépendances Inclusions Basse Simple
    26. 26. Détails Titre Exemple dans le code, explication Suggestion de corrections Limitations Liste des occurrences Ou un moyen de les trouver
    27. 27. Travail d’équipe L’audit intervient toujours après le codage Une fois Si nécessaire Régulièrement Continuement
    28. 28. Mantras PHP Listez vos mantra Choisissez les 5 règles les plus importantes Imprimez-le, faites les réciter
    29. 29. Audits croisés Faîtes des binômes Chaque développeur doit relire le code de l’autre À la lumière des mantras Processus très léger, agile Capable de passer
    30. 30. Audits collaboratifs Groogle (http://groogle.sourceforge.net) Review Board (http://www.review-board.org/) Rietveld http://codereview.appspot.com/ SmartBear (http://www.smartbear.com/)
    31. 31. Audit communautaire? Mantra, audits croisés : drive-by auditing Capter les remarques dès que possible Ouvert à tous? Open Source
    32. 32. Questions? damien.seguy@alterway.fr

    ×