audit de code php - php code audit - hackfest.ca 2009
DESCRIPTION
This presentation is biligual (french/english). Durant un audit sécurité d'une application web, il y a plusieurs phases au travail d'enquête : interview, recensement des vulnérabilités (XSS, injections, dévoilement, etc.) par avec des tests d'intrusion, analyse du code, suivi d'un rapport expliquant les problèmes, des recommandations de renforcement et priorisation des tâches. Toutes ces étapes sont importantes, mais certaines sont plus connues que les autres. Dans cette présentation, nous apprendrons les étapes et les outils pour faire un audit du code d'une application Web. Les techniques présentés peuvent être utilisés en plusieurs langages de programmation, mais plusieurs outils seront axé sur le langage de programmation PHP.TRANSCRIPT
Auditing PHP applications
Audit des applications en
PHP
1vendredi 13 novembre 2009
Who speak? Qui parle?Philippe Gamache
Parler Haut, Interagir Librement : Web development, security audit, training
@SecureSymfony
Philippe Gamache
Parler Haut, Interagir Librement : Développement Web, audit de sécurité, formations
@SecureSymfony
2vendredi 13 novembre 2009
Security bookLivre de sécurité
New 2009 editionComprehensive review of security system for MySQL, PHP, etc. Published in French
Planning translation
Nouvelle édition 2009Bilan complet de la sécurité : système, MySQL, PHP, etc.Édité chez EyrollesDédicaces sur demande
3vendredi 13 novembre 2009
Agenda Ordre du jourWorkshop presentation
Black box audit
Source code audit
Présentation de l’atelier
Audit boîte noire
Audit à code ouvert
4vendredi 13 novembre 2009
Why? Pourquoi?Confidence does not exclude control™
To validate external work To validate internal workRound-upFor an external perspective As often as possible
La confiance n'exclut pas le contrôle™
Pour valider un travail externePour valider un travail internePour faire le point Pour avoir un regard externe Aussi souvent que possible
5vendredi 13 novembre 2009
Full audit synopsis Synopsis d’un audit
Identification of the audit goals
Interview with the development teams
Black box testing
Open Code audit
Report
Identification des objectifs d'audit
Entretien avec les équipes de développement
Test boîte noire
Audit de code
6vendredi 13 novembre 2009
Identification of the audit goals Identification des objectifs d’audit
Audit scope
Security
Performance
Code quality
Étendue de l'audit
Sécurité
Performance
Qualité du code
7vendredi 13 novembre 2009
Interview with the development teamsEntretien avec les équipes de développement
Check if development teams knows what to secureHave the design explained firstHave them explains their approach
Check what they sayCheck what they don’t say
Vérifiez si l’équipe de développement sait ce qu’il faut sécurisé Demandez d’expliquer la conceptionDemandez d’expliquer leur approche
Vérifiez ce qu'ils disent Vérifiez ce qu'ils ne disent pas
8vendredi 13 novembre 2009
The shy versionLa version timide
We know there are security problems
but we have no time to secure themthis app has been written years agowe can’t keep up with the threats
Nous savons qu’il y a des problèmes de sécurité :
mais nous n'avons pas le temps de les sécuriser ce logiciel a été écrit il y a quelques années nous ne pouvons pas suivre les menaces
9vendredi 13 novembre 2009
The strong versionLa version forte
We have secured the application
We use SSL and cryptoAll content is validated and filteredWe don’t do any dynamical includeOur frameworks doesn’t allow this
Nous avons sécurisé l'application
Nous utilisons le protocole SSL et la cryptographie Tout le contenu est validé et filtré Nous ne faisons aucune inclusion dynamique Nos cadres d’applications sont sécurisées
10vendredi 13 novembre 2009
Black box testingTest boîte noire
Easy to set up
Take into account the context of the application
Often spectacular
Generally shallow
Facile de mise en place
Prendre en compte le contexte de la demande
Souvent spectaculaires
Généralement peu profondes
11vendredi 13 novembre 2009
Black box testingTest boîte noire
Finding informations Look for vulnerabilities
Automatic scannersBy handFuzzingScenarios
Strikes
Recherche d’informations Rechercher les vulnérabilités
Scanneurs automatiques À la main Fuzzing Scénarios
Attaquer
12vendredi 13 novembre 2009
Black box testingTest boîte noire
Usual directories Répertoires habituels
includes, include, inc, com, classes, lib, libraryadmin, adm, administrator, administrateur tmp, TMP, ext, vardata, db, conf, config , configurationuploads, install
13vendredi 13 novembre 2009
Black box testingTest boîte noire
Typical files
.phps, .inc, .class
xml, ini, yaml, cfg
.tar, .gz, .zip, .rar,
.bz2
Apache Alias : /icons/
robots.txt
Fichiers typiques
.phps, .inc, .class
xml, ini, yaml, cfg
.tar, .gz, .zip, .rar,
.bz2
Apache Alias : /icons/
robots.txt
14vendredi 13 novembre 2009
Open Code auditAudit de code
Look into the PHP codeSearch for hidden problemsUsually less spectacular than black boxEasy to loose focusTempting to audit everything
Rechercher dans le code PHP Rechercher les problèmes cachés Habituellement, moins spectaculaire que les tests boîte noireFacile de perdre sa concentrationTentant de tout vérifier
15vendredi 13 novembre 2009
Approch ApprocheWhat to search for? What are the entry points? What are the exit points?Open-mindedness and discoveryHow can they be exploited
Or protected ?
Que rechercher? Quels sont les points d'entrée? Quels sont les points de sortie? Ouverture d’esprit et découverteComment peuvent-ils être exploités
Ou protégés?
16vendredi 13 novembre 2009
Assessing the codeÉvaluer le code
One liners One line of code is sufficiently to be bad
Even thoughyou must follow the code
forward (for input) in reverse (for output)
En une ligneUne ligne de code est suffisamment pour être mauvais
Malgré tous vous devez suivre le code
vers l’avant (entrées)sens inverse (sorties)
<?php $action = $_POST['action']; $query_string = "action=$action"; $link = "index.php?$query_string"; ?> <a href="<?php echo $link; ?>"> Click Here </a>
17vendredi 13 novembre 2009
What to search for?Que rechercher?
Injections
PHP
SQL
HTML/JavaScript
system
Injections
PHP
SQL
HTML/JavaScript
système
18vendredi 13 novembre 2009
Tools OutilsYour eyes
Text editors
grep
Fast, available, convenient
Tokenizer
Semantic, accurate
Vos yeux
Éditeurs de texte
grep
Rapide, disponible, pratique
Tokenizer
Sémantique, précis
19vendredi 13 novembre 2009
Tokenizer [1] => Array ( [0] => 266 [1] => print [2] => 1 )
[2] => Array ( [0] => 370 [1] => [2] => 1 )
[3] => ( [4] => " [5] => Array ( [0] => 314 [1] => hello [2] => 1 )
[6] => Array ( [0] => 309 [1] => $world [2] => 1 )
[7] => Array ( [0] => 314 [1] => ! [2] => 1 )
[8] => " [9] => ) [10] => ;
[1] => Array ( [0] => PHP token [1] => PHP code [2] => Script line ) [2] => "
<?php print ("hello $world!"); ?>
20vendredi 13 novembre 2009
PHP injectionsInjections PHP
dynamical inclusion
include, require and *_once
back ticks (`)
eval
Inclusions dynamiques d'inclusion
include, require and *_once
`
eval
21vendredi 13 novembre 2009
Input EntréesHTML Forms:
form
input
$_GET
$_POST
$_REQUEST
Formulaire HTML:
form
input
$_GET
$_POST
$_REQUEST
22vendredi 13 novembre 2009
Input EntréesDatabases:
mysql_query()
SELECT
HTTP Headers:
$_COOKIE
$_SERVER
Bases de données:
mysql_query()
SELECT
Entête HTTP:
$_COOKIE
$_SERVER
23vendredi 13 novembre 2009
Input Entréesregister_globals strikes back
Foreach and $$extractimport_request_var $GLOBALSparse_str(ini_get(‘register_globals’))
register_globals contre-attaque
Foreach and $$extractimport_request_var $GLOBALSparse_str(ini_get(‘register_globals’))
24vendredi 13 novembre 2009
Output SortiesClient:
echo
<?=
die
print_r
var_dump
Client:
echo
<?=
die
print_r
var_dump
25vendredi 13 novembre 2009
Output SortiesDatabases:
mysql_query()
mysqli_multi_query
update, delete, insert
Headers
header()
Bases de données:
mysql_query()
mysqli_multi_query
update, delete, insert
En-têtes
header()
26vendredi 13 novembre 2009
Output SortiesSystem:
exec()
passthru()
system()
Système:
exec()
passthru()
system()
27vendredi 13 novembre 2009
Gotchas PiègesTrust of HTTP Headers:
Referer
Trust of $_SERVER:
$_SERVER['PHP_SELF']
Trust of Client-Side Restrictions:
maxlength
Confiance des en-têtes HTTP :
Referer Confiance de $_SERVER :
$_SERVER['PHP_SELF']
Confiance des restrictions clients:
maxlength
28vendredi 13 novembre 2009
Questions?
http://www.ph-il.ca
http://www.ph-il.ca/en/conferences
http://www.ph-il.ca/fr/conferences
29vendredi 13 novembre 2009
30vendredi 13 novembre 2009
31vendredi 13 novembre 2009