SlideShare une entreprise Scribd logo
1  sur  32
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           : 2 jours
Rapport et revue                : 1 jour
Entrevue des développeurs

              Qui : se présenter
              Quoi : que fait cette
              application?
              Comment : comment est
              organisé le code?
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
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
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 auditer
             Tout n’est pas bon à
             rapporter
Injections PHP
Injections PHP
  include, require et *_once
  back ticks ` `
  eval(‘’)
  assert(), preg_replace_callback, preg_replace + /e
  __autoload, loadLibrary, loadModule...
Recherche eval désespérément
  Deux approches :
  grep
    Rapide, universel, facile
    853 occurrences
  Tokenizer PHP
    Sémantique, précis
    37 occurrences
  Expressions rationnelles...?
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] => "
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....
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....
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....
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....
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....
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
Audit statistiques


 Extraire un type d’information
 Relire la liste hors de contexte
 Sert de point d’entrée pour plus de questions
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
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      Moyen
    Trop de
                     Fort      Simple
  dépendances
   Inclusions       Basse      Simple
Détails
 Titre
 Exemple dans le code, explication
 Suggestion de corrections
   Limitations
 Liste des occurrences
   Ou un moyen de les trouver
Travail d’équipe

 L’audit intervient toujours après le codage
   Une fois
   Si nécessaire
   Régulièrement
   Continuement
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
 Processus très léger, agile
 Capable de passer
Audits collaboratifs

 Groogle (http://groogle.sourceforge.net)
 Review Board (http://www.review-board.org/)
 Rietveld http://codereview.appspot.com/
 SmartBear (http://www.smartbear.com/)
Audit communautaire?

Mantra, audits croisés : drive-by auditing
  Capter les remarques dès que possible
Ouvert à tous?
  Open Source
Questions?
damien.seguy@alterway.fr

Contenu connexe

Tendances

Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applicationsDamien Seguy
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1Régis Lutter
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partiekadzaki
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentationjulien pauli
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partiekadzaki
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
PHP5 - POO
PHP5 - POOPHP5 - POO
PHP5 - POOmazenovi
 

Tendances (16)

Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applications
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Ruby STAR
Ruby STARRuby STAR
Ruby STAR
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
22410 b 04
22410 b 0422410 b 04
22410 b 04
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partie
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Php cours
Php coursPhp cours
Php cours
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partie
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
PHP5 - POO
PHP5 - POOPHP5 - POO
PHP5 - POO
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 

En vedette

Melanie jara cervigón
Melanie jara cervigónMelanie jara cervigón
Melanie jara cervigónMelanie Jara
 
Feria de lectura escuela mata de los indios 1
Feria de lectura escuela mata de los indios 1Feria de lectura escuela mata de los indios 1
Feria de lectura escuela mata de los indios 1luisamoronta
 
03 continuous delivery
03 continuous delivery03 continuous delivery
03 continuous deliveryOlivier Locard
 
Ley 143 de_1994
Ley 143 de_1994Ley 143 de_1994
Ley 143 de_1994nopodo
 
Anaïs Nin biographie
Anaïs Nin biographieAnaïs Nin biographie
Anaïs Nin biographieCody Mims
 
Como se sube, descarga y comparte documentos a Slidedhare
Como se sube, descarga y comparte documentos a SlidedhareComo se sube, descarga y comparte documentos a Slidedhare
Como se sube, descarga y comparte documentos a Slidedharepablor003
 
Lady informe ia
Lady informe iaLady informe ia
Lady informe ialadyespino
 
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...ANEPMA
 
Bilan de Mandature 2011-2016
Bilan de Mandature 2011-2016Bilan de Mandature 2011-2016
Bilan de Mandature 2011-2016CCI Ardèche
 
Maria clara isabela alzate
Maria clara isabela alzateMaria clara isabela alzate
Maria clara isabela alzate13isa14maria
 
Mon entreprise et les comparateurs - avril 2011
Mon entreprise et les comparateurs - avril 2011Mon entreprise et les comparateurs - avril 2011
Mon entreprise et les comparateurs - avril 2011L'Atelier BNP Paribas
 

En vedette (20)

Melanie jara cervigón
Melanie jara cervigónMelanie jara cervigón
Melanie jara cervigón
 
Marte
MarteMarte
Marte
 
Trabajo lupiz
Trabajo lupizTrabajo lupiz
Trabajo lupiz
 
presentacion
presentacionpresentacion
presentacion
 
Herissons2
Herissons2Herissons2
Herissons2
 
Feria de lectura escuela mata de los indios 1
Feria de lectura escuela mata de los indios 1Feria de lectura escuela mata de los indios 1
Feria de lectura escuela mata de los indios 1
 
03 continuous delivery
03 continuous delivery03 continuous delivery
03 continuous delivery
 
Ley 143 de_1994
Ley 143 de_1994Ley 143 de_1994
Ley 143 de_1994
 
Anaïs Nin biographie
Anaïs Nin biographieAnaïs Nin biographie
Anaïs Nin biographie
 
Como se sube, descarga y comparte documentos a Slidedhare
Como se sube, descarga y comparte documentos a SlidedhareComo se sube, descarga y comparte documentos a Slidedhare
Como se sube, descarga y comparte documentos a Slidedhare
 
Lady informe ia
Lady informe iaLady informe ia
Lady informe ia
 
Las tic
Las ticLas tic
Las tic
 
La Rochere Emotions 2015
La Rochere Emotions 2015La Rochere Emotions 2015
La Rochere Emotions 2015
 
RED DE COMPUTADORES
RED DE COMPUTADORES RED DE COMPUTADORES
RED DE COMPUTADORES
 
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...
Conferencia Inaugural “Nuevos objetivos propuestos por la Comisión Europea en...
 
Bilan de Mandature 2011-2016
Bilan de Mandature 2011-2016Bilan de Mandature 2011-2016
Bilan de Mandature 2011-2016
 
C. c. t. uaa aciuaa 2014-2015
C. c. t.  uaa aciuaa 2014-2015C. c. t.  uaa aciuaa 2014-2015
C. c. t. uaa aciuaa 2014-2015
 
Maria clara isabela alzate
Maria clara isabela alzateMaria clara isabela alzate
Maria clara isabela alzate
 
My poker agenda
My poker agendaMy poker agenda
My poker agenda
 
Mon entreprise et les comparateurs - avril 2011
Mon entreprise et les comparateurs - avril 2011Mon entreprise et les comparateurs - avril 2011
Mon entreprise et les comparateurs - avril 2011
 

Similaire à Audits php

Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web5pidou
 
Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Damien Seguy
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear phpDamien Seguy
 
Librairies Java qui changent la vie
Librairies Java qui changent la vieLibrairies Java qui changent la vie
Librairies Java qui changent la viecluelessjoe
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.netZakaria SMAHI
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en goAbdoul Kader Sarambe
 
Presentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration PuppetPresentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration PuppetAurélie Henriot
 
Test unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeTest unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeHadrien Blanc
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP EL JAOUARI Ahmed
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations GreendroidGDG Nantes
 

Similaire à Audits php (20)

Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear php
 
Librairies Java qui changent la vie
Librairies Java qui changent la vieLibrairies Java qui changent la vie
Librairies Java qui changent la vie
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.net
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Présentation Puppet
Présentation PuppetPrésentation Puppet
Présentation Puppet
 
Presentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration PuppetPresentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration Puppet
 
Test unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeTest unitaires - refactoring - clean code
Test unitaires - refactoring - clean code
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
 
2
22
2
 
Drools et les moteurs de règles
Drools et les moteurs de règlesDrools et les moteurs de règles
Drools et les moteurs de règles
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations Greendroid
 
De legacy à symfony
De legacy à symfonyDe legacy à symfony
De legacy à symfony
 

Plus de Damien Seguy

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leedsDamien Seguy
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationDamien Seguy
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limogesDamien Seguy
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Damien Seguy
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confooDamien Seguy
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Damien Seguy
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbiaDamien Seguy
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic trapsDamien Seguy
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappesDamien Seguy
 
Code review workshop
Code review workshopCode review workshop
Code review workshopDamien Seguy
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018Damien Seguy
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018Damien Seguy
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3Damien Seguy
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)Damien Seguy
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018Damien Seguy
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy peopleDamien Seguy
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonightDamien Seguy
 
Machine learning in php las vegas
Machine learning in php   las vegasMachine learning in php   las vegas
Machine learning in php las vegasDamien Seguy
 
Review unknown code with static analysis Zend con 2017
Review unknown code with static analysis  Zend con 2017Review unknown code with static analysis  Zend con 2017
Review unknown code with static analysis Zend con 2017Damien Seguy
 
Review unknown code with static analysis
Review unknown code with static analysisReview unknown code with static analysis
Review unknown code with static analysisDamien Seguy
 

Plus de Damien Seguy (20)

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leeds
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisation
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limoges
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confoo
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbia
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic traps
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappes
 
Code review workshop
Code review workshopCode review workshop
Code review workshop
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy people
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonight
 
Machine learning in php las vegas
Machine learning in php   las vegasMachine learning in php   las vegas
Machine learning in php las vegas
 
Review unknown code with static analysis Zend con 2017
Review unknown code with static analysis  Zend con 2017Review unknown code with static analysis  Zend con 2017
Review unknown code with static analysis Zend con 2017
 
Review unknown code with static analysis
Review unknown code with static analysisReview unknown code with static analysis
Review unknown code with static analysis
 

Audits php

  • 1. Audits PHP Faire le point sur son code<script>alert(‘XSS’)</s Bordeaux, France, 6 juillet 2010
  • 2. Agenda Faire un audit PHP Etudier le code PHP S’organiser pour améliorer la qualité du code
  • 3. Intervenant Damien Seguy Eleveur d’éléPHPants Expert LAMP chez Alter Way damien.seguy@alterway.fr
  • 5. 3 types Audit de sécurité Audit de performances Audit de qualité de code
  • 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. Entrevue des développeurs Qui : se présenter Quoi : que fait cette application? Comment : comment est organisé le code?
  • 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. 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. Code ouvert Quels sont les points d’entrée? Sont-ils accessibles? Protégés? Comment exploiter ce problème?
  • 11. Que rechercher? Injections PHP SQL HTML system HTTP
  • 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. Injections PHP Injections PHP include, require et *_once back ticks ` ` eval(‘’) assert(), preg_replace_callback, preg_replace + /e __autoload, loadLibrary, loadModule...
  • 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. 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. 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. 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. 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. 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. 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. 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. Audit statistiques Extraire un type d’information Relire la liste hors de contexte Sert de point d’entrée pour plus de questions
  • 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. Rapport Résumé exécutif 3 paragraphes, simples à lire Résumé des problèmes rencontrés Details et explications Annexes
  • 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. Détails Titre Exemple dans le code, explication Suggestion de corrections Limitations Liste des occurrences Ou un moyen de les trouver
  • 27. Travail d’équipe L’audit intervient toujours après le codage Une fois Si nécessaire Régulièrement Continuement
  • 28. Mantras PHP Listez vos mantra Choisissez les 5 règles les plus importantes Imprimez-le, faites les réciter
  • 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. 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. Audit communautaire? Mantra, audits croisés : drive-by auditing Capter les remarques dès que possible Ouvert à tous? Open Source

Notes de l'éditeur