31
Auditing PHP applications Audit des applications en PHP 1 vendredi 13 novembre 2009

Audit de code PHP - PHP Code Audit - HackFest.ca 2009

Embed Size (px)

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.

Citation preview

Page 2: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

Who speak? Qui parle?Philippe Gamache

Parler Haut, Interagir Librement : Web development, security audit, training

[email protected]

@SecureSymfony

Philippe Gamache

Parler Haut, Interagir Librement : Développement Web, audit de sécurité, formations

[email protected]

@SecureSymfony

2vendredi 13 novembre 2009

Page 3: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 4: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 5: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 6: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 7: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 8: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 9: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 10: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 11: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 12: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 13: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 14: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 15: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 16: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 17: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 18: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

What to search for?Que rechercher?

Injections

PHP

SQL

HTML/JavaScript

system

Injections

PHP

SQL

HTML/JavaScript

système

18vendredi 13 novembre 2009

Page 19: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 20: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 21: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 22: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

Input EntréesHTML Forms:

form

input

$_GET

$_POST

$_REQUEST

Formulaire HTML:

form

input

$_GET

$_POST

$_REQUEST

22vendredi 13 novembre 2009

Page 23: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 24: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 25: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

Output SortiesClient:

echo

print

<?=

die

print_r

var_dump

Client:

echo

print

<?=

die

print_r

var_dump

25vendredi 13 novembre 2009

Page 26: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 27: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

Output SortiesSystem:

exec()

passthru()

system()

Système:

exec()

passthru()

system()

27vendredi 13 novembre 2009

Page 28: Audit de code PHP - PHP Code Audit - HackFest.ca 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

Page 30: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

30vendredi 13 novembre 2009

Page 31: Audit de code PHP - PHP Code Audit - HackFest.ca 2009

31vendredi 13 novembre 2009