php code audit - oscon 2009

82
PHP code audits OSCON 2009 San José, CA, USA July 21th 2009 1 vendredi 13 novembre 2009

Upload: philippe-gamache

Post on 18-Nov-2014

3.516 views

Category:

Technology


0 download

DESCRIPTION

In this laboratory, we will carry out a safety audit of an Open Source web application. The technical objective is to provide a complete report and treat all phases of investigative work: black box analysis, open source analysis, identifying vulnerabilities (XSS, injections, disclosure, etc.), recommendations for strengthening, and prioritization of tasks. All skills will be tested in this complex exercise. We will work on a real application: (The name of the application will come later). The laboratory will end with the handing over of the report to the authors of the application so they can have an outside view on the safety of the application.

TRANSCRIPT

Page 1: PHP Code Audit - OSCON 2009

PHP code auditsOSCON 2009

San José, CA, USA

July 21th 2009

1vendredi 13 novembre 2009

Page 2: PHP Code Audit - OSCON 2009

Agenda

Workshop presentation

Black box audit

Source code audit

2vendredi 13 novembre 2009

Page 3: PHP Code Audit - OSCON 2009

Who speaks?

Philippe Gamache

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

[email protected]

@SecureSymfony

3vendredi 13 novembre 2009

Page 4: PHP Code Audit - OSCON 2009

Who speaks?

Damien Seguy

Alter Way Consulting : Open sources expert services

Father of the Elephpant

Calendar maker

[email protected]

4vendredi 13 novembre 2009

Page 5: PHP Code Audit - OSCON 2009

Security Book

New 2009 edition

Comprehensive review of security system for MySQL, PHP, etc.

Published in French

Planning translation

5vendredi 13 novembre 2009

Page 6: PHP Code Audit - OSCON 2009

The applicationhttp://www.cligraphcrm.com/

6vendredi 13 novembre 2009

Page 7: PHP Code Audit - OSCON 2009

Full audit synopsis

Identification of the audit goals

Interview with the dev teams

Black box testing

Open Code audit

Report

7vendredi 13 novembre 2009

Page 8: PHP Code Audit - OSCON 2009

Yes,we take questions

8vendredi 13 novembre 2009

Page 9: PHP Code Audit - OSCON 2009

Black box testing

9

9vendredi 13 novembre 2009

Page 10: PHP Code Audit - OSCON 2009

Black box testing

What is black box testing?

Finding information

What can I do with this application?

Where are the most popular entry points?

10

10vendredi 13 novembre 2009

Page 11: PHP Code Audit - OSCON 2009

Black box testing

Look for vulnerabilities

Use different tools and technics

Automatic scanners By handFuzzing toolsScenarios

How do I use to my advantage?

11

11vendredi 13 novembre 2009

Page 12: PHP Code Audit - OSCON 2009

Black box testing

Strike

Attacking a vulnerability with a specific purpose

12

12vendredi 13 novembre 2009

Page 13: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Features

13

13vendredi 13 novembre 2009

Page 14: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Technology

14

14vendredi 13 novembre 2009

Page 15: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Technology

15

15vendredi 13 novembre 2009

Page 16: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Technology

16

16vendredi 13 novembre 2009

Page 17: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Technology

17

17vendredi 13 novembre 2009

Page 18: PHP Code Audit - OSCON 2009

Find Information

Look at the application web site

Technology

18

18vendredi 13 novembre 2009

Page 19: PHP Code Audit - OSCON 2009

Where did I hear about this?

19vendredi 13 novembre 2009

Page 20: PHP Code Audit - OSCON 2009

Find vulnerabilities

We look in Common Vulnerabilities and Exposures

Also in bugtrack, xssed.com, etc...

We could have look in Google, Bing, etc...

No published vulnerabilities for cliGraph

20

20vendredi 13 novembre 2009

Page 21: PHP Code Audit - OSCON 2009

Find Information

HTTP headers

curl, wget, Firefox

Rex Swain's HTTP Viewer

21

HTTP/1.x 200 OKDate: Mon, 20 Jul 2009 17:29:25 GMTServer: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11 mod_ssl/2.2.3 OpenSSL/0.9.8cX-Powered-By: PHP/5.2.0-8+etch11Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Length: 586Content-Type: text/html; charset=UTF-8X-Cache: MISS from ColossusConnection: close

21vendredi 13 novembre 2009

Page 22: PHP Code Audit - OSCON 2009

Typical files

Usual directories

includes, include, inc, com,

classes, lib, library

admin, adm, administrator,

tmp, TMP, ext, var

data, db, conf, config

uploads, install,

22

22vendredi 13 novembre 2009

Page 23: PHP Code Audit - OSCON 2009

Typical files

.phps, .inc, .class,

xml, ini, yaml, cfg

Apache Alias : /icons/

robots.txt

23vendredi 13 novembre 2009

Page 24: PHP Code Audit - OSCON 2009

Security dilema

robots.txt

24

User-agent: *Disallow: /administrator/Disallow: /cache/Disallow: /components/Disallow: /images/Disallow: /includes/Disallow: /installation/Disallow: /language/Disallow: /libraries/Disallow: /media/Disallow: /modules/Disallow: /plugins/Disallow: /templates/Disallow: /tmp/Disallow: /xmlrpc/

24vendredi 13 novembre 2009

Page 25: PHP Code Audit - OSCON 2009

External testing

Get the list of the scripts (find .)

Turn that into URLs

Fetch them directly on the web site

Study what’s coming back

Maybe you gonna need to install it yourself

25vendredi 13 novembre 2009

Page 26: PHP Code Audit - OSCON 2009

Typical files

https

404 and 5xx pages

Blank page

Bad code without error posting

26

26vendredi 13 novembre 2009

Page 27: PHP Code Audit - OSCON 2009

Automatic scannersNikto http://www.cirt.net/

27

27vendredi 13 novembre 2009

Page 28: PHP Code Audit - OSCON 2009

Find vulnerabilities

What to look for ?

XSS

CSRF

Injections

Files overwrite

28

28vendredi 13 novembre 2009

Page 29: PHP Code Audit - OSCON 2009

Automatic scanners

Web Application Attack and Audit Framework (W3AF)http://w3af.sourceforge.net/

29

29vendredi 13 novembre 2009

Page 30: PHP Code Audit - OSCON 2009

Manual tools

Firefox

Access Me

Firebug

SQL Inject Me

Web Developer

XSS Me Data

30

30vendredi 13 novembre 2009

Page 31: PHP Code Audit - OSCON 2009

Manual tools

Arrays

c[]=1

Surplus variables

debug=1, task=view

Missing variables

31

31vendredi 13 novembre 2009

Page 33: PHP Code Audit - OSCON 2009

Manual tools

32

action/facture_fiche.php?exp_typedoc=facture&exp_id=2009N000196&exp_formdoc=pdf

action/facture_fiche.php?exp_typedoc=facture&exp_id=2009

N000196&exp_formdoc=fiche

32vendredi 13 novembre 2009

Page 34: PHP Code Audit - OSCON 2009

Manual tools

32

action/facture_fiche.php?exp_typedoc=facture&exp_id=2009N000196&exp_formdoc=pdf

action/facture_fiche.php?exp_typedoc=facture&exp_id=2009

N000196&exp_formdoc=fiche

Fatal error: Cannot redeclare fct_redimension_img() (previously declared in /var/www/crm_demo/fonctions/fonction_img.php:68) in /var/www/crm_demo/fonctions/fonction_img.php on line 134

32vendredi 13 novembre 2009

Page 35: PHP Code Audit - OSCON 2009

Fuzzing

Test by random value

Stress forms

Database

All characters from \0 to \x255

All Unicode characters

The numbers 1, 0, -1, 0.99, extreme, infinite

33

33vendredi 13 novembre 2009

Page 36: PHP Code Audit - OSCON 2009

Fuzzing

Strings

Long

Short

Dictionaries of values

of vulnerabilities

GET, POST, COOKIE

34

34vendredi 13 novembre 2009

Page 37: PHP Code Audit - OSCON 2009

Fuzzing

Wfuzzhttp://www.edge-security.com/wfuzz.php

WebSlayerhttp://www.edge-security.com/webslayer.php

35

35vendredi 13 novembre 2009

Page 38: PHP Code Audit - OSCON 2009

Exemple Fuzzing

36vendredi 13 novembre 2009

Page 39: PHP Code Audit - OSCON 2009

Scenarios

More realistic tests

fragile

Automate your tests

Complete with fuzzing

Use proxy servers

37

37vendredi 13 novembre 2009

Page 41: PHP Code Audit - OSCON 2009

Simplify your life

Samurai Web Testing Frameworkhttp://samurai.inguardians.com/

39vendredi 13 novembre 2009

Page 42: PHP Code Audit - OSCON 2009

Conclusion

Black box

Easy to set up

Take into account the context of the application

Often spectacular

Generally shallow

40vendredi 13 novembre 2009

Page 43: PHP Code Audit - OSCON 2009

Open code audit

41vendredi 13 novembre 2009

Page 44: PHP Code Audit - OSCON 2009

Code audits

Look into the PHP code

Search for hidden problems

Usually less spectacular than black box

42vendredi 13 novembre 2009

Page 45: PHP Code Audit - OSCON 2009

From the interview

Check if dev teams knows that to secure

Have it explains their approach

Check what they say

Check what they don’t say

43vendredi 13 novembre 2009

Page 46: PHP Code Audit - OSCON 2009

The shy version

We know there are security problems

but we have no time to secure them

this app has been written years ago

we can’t keep up with the threats

44vendredi 13 novembre 2009

Page 47: PHP Code Audit - OSCON 2009

The strong version

We have secured the application

We use SSL, and webwasher and crypto

All content is validated and filtered

We don’t do any dynamical include

Our frameworks doesn’t allow this

45vendredi 13 novembre 2009

Page 48: PHP Code Audit - OSCON 2009

Approach

What to search for?

What are the entry points?

How can they be exploited

Or protected ?

46vendredi 13 novembre 2009

Page 49: PHP Code Audit - OSCON 2009

What to search for?

Injections

PHP

SQL

HTML

system

47vendredi 13 novembre 2009

Page 50: PHP Code Audit - OSCON 2009

Keep focused

Easy to loose focus

Tempting to audit everything

48vendredi 13 novembre 2009

Page 51: PHP Code Audit - OSCON 2009

PHP injections

PHP injections

dynamical inclusion

include, require and *_once

back ticks

eval

49vendredi 13 novembre 2009

Page 52: PHP Code Audit - OSCON 2009

Eval

Easy to look for

grep

Fast, available, convenient

853 occurences

Tokenizer

Semantic, accurate

37 occurrences

50vendredi 13 novembre 2009

Page 53: PHP Code Audit - OSCON 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! "); ?>

51vendredi 13 novembre 2009

Page 54: PHP Code Audit - OSCON 2009

Evals

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

◦ eval($contenu_thjipk);◦ eval($contents_essai);◦ Content is read into variable, then executed : an include?

◦ eval('$hexdtime = "'.$hexdtime.'";')◦ Long way to cast a string into a string

◦ eval('$retour2.= '.var_dump($recept->erreur).';')◦ This doesn’t even work

52vendredi 13 novembre 2009

Page 55: PHP Code Audit - OSCON 2009

Assessing the code

One liners

One line of code is sufficiently to be bad

Even though

you must follow the code

In reverse

53vendredi 13 novembre 2009

Page 56: PHP Code Audit - OSCON 2009

Inclusion

◦ require("../params_frm.php")◦ require(fct_lien_page_custom(TYPE_DOMAINE."/".TYPE_DOC."_custom.php","abs"))

◦ require(fct_lien_page_custom("params_footer.php","abs"))◦ Pretty secure inclusions

◦ But 96 variables used in includes◦ include(fct_lien_page_custom("action/facture_".$format.".php","abs"))◦ $format, anyone?

◦ require_once("etat_simple_".$choix_page."_trt.php")◦ $choix_page, anyone ?

54vendredi 13 novembre 2009

Page 57: PHP Code Audit - OSCON 2009

$format ? <?php require("../params_trt.php");

$format=htmlentities($_REQUEST['exp_formdoc']);if(empty($_REQUEST['exp_affiche'])) $affichage=0;  else $affichage=$_REQUEST['exp_affiche'];if(empty($_REQUEST['exp_stockdoc'])) $stockage=0;  else $stockage=$_REQUEST['exp_stockdoc'];$cde_id=$_REQUEST['exp_id'];$type_doc=$_REQUEST['exp_typedoc'];

require(fct_lien_page_custom("fonctions/fonction_img.php","abs"));

include(fct_lien_page_custom("action/facture_".$format.".php","abs"));?>

55vendredi 13 novembre 2009

Page 58: PHP Code Audit - OSCON 2009

$choix_format ?   switch($choix) {    case 0 : $choix_page="tabl";    break;    case 1 : $choix_page="histo1";  if ($gfx_sens_graph=="1") $gfx_margegauche_dft="90";    break;    case 2 : $choix_page="histo2";  if ($gfx_sens_graph=="1") $gfx_margegauche_dft="90";    break;    case 3 : $choix_page="histo3";  if ($gfx_sens_graph=="1") $gfx_margegauche_dft="90";    break;    case 4 : $choix_page="histo4";  if ($gfx_sens_graph=="1") $gfx_margegauche_dft="90";    break;    case 5 : $choix_page="histo5";  if ($gfx_sens_graph=="1") $gfx_margegauche_dft="90";    break; }

   ###...Way below    require_once("etat_simple_".$choix_page."_trt.php");

56vendredi 13 novembre 2009

Page 59: PHP Code Audit - OSCON 2009

Statistical audit

Extract one type of information

Review it out of context

Use this as a starting point for more questions

57vendredi 13 novembre 2009

Page 60: PHP Code Audit - OSCON 2009

Comments

//echo "<div><a class=\"texte1\" style=...

#echo "<pre>";

Left overs

#print_r($_REQUEST);

Main code is not cleaned of debug?

// hack for mozilla sunbird's extra = signs

Look for swearing, TODO, hack

58vendredi 13 novembre 2009

Page 61: PHP Code Audit - OSCON 2009

Variables

6883 different variables names

All one possible one letter variable

32 chars : $cache_maxsize_UTF8StringToArray

Most used : $i (2586 times)

$_1904, $samedi, $dummy, $sss, 19 $unknowns

711 variables used only once in the codes

59vendredi 13 novembre 2009

Page 62: PHP Code Audit - OSCON 2009

Other ideas

name of functions

name of classes

name of constants

literal

strings, numbers

Condition (if, while)

60vendredi 13 novembre 2009

Page 63: PHP Code Audit - OSCON 2009

register_globals strikes back

61vendredi 13 novembre 2009

Page 64: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

61vendredi 13 novembre 2009

Page 65: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

extract

61vendredi 13 novembre 2009

Page 66: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

extract

import_request_var

61vendredi 13 novembre 2009

Page 67: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

extract

import_request_var

$GLOBALS

61vendredi 13 novembre 2009

Page 68: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

extract

import_request_var

$GLOBALS

parse_str

61vendredi 13 novembre 2009

Page 69: PHP Code Audit - OSCON 2009

register_globals strikes back

Foreach and $$

extract

import_request_var

$GLOBALS

parse_str

register_globals (ini_get(‘register_globals’))

61vendredi 13 novembre 2009

Page 70: PHP Code Audit - OSCON 2009

Found!

◦ ./install/identification.php◦ extract($_POST)  : 1◦ Injection by $_POST

◦ ./eggcrm/fonctions/fonctions_gen.php◦ $GLOBALS[$k] = $chaine[$k]◦ $GLOBALS[$this->mode] [$k] = $chaine[$k]

◦ In the fct_urldecode, the values are stripslashed, and then injected in the $GLOBALS, resulting in variable creation

62vendredi 13 novembre 2009

Page 71: PHP Code Audit - OSCON 2009

SQL injections

Point of entry

mysql_query

mysqli_real_escape_string

SQL query :

string with SELECT, UPDATE, ...

63vendredi 13 novembre 2009

Page 72: PHP Code Audit - OSCON 2009

Found!◦ 'UPDATE param_suivi SET      param_suivi_nom="'.str_replace($transf_sp,$transf_fr,$_POST["suivi_nom"])  : 1◦ Direct injection via POST

◦ WHERE campagne_nom LIKE '%".addslashes($_REQUEST['rech_nom']) ◦ Injection from $_REQUEST

◦ "UPDATE even_spl SET even_spl_fait='".$even_fait."',even_spl_modification='".$date_du_jour."'    WHERE even_spl_id='".$even_id."' AND even_spl_affaire_id='".$even_aff_id."'";  : 1

◦ "INSERT INTO ".$type_doc."_suivi    (".$type_doc."_suivi_param_suivi_id, ".$type_doc."_suivi_".$type_doc."_id, ".$type_doc."_suivi_canal_id,    ".$type_doc."_suivi_action, ".$type_doc."_suivi_commentaire, ".$type_doc."_suivi_creation)    VALUES ('".$id_suivi."', '".$id_doc."', '".$id_canal."', '".$suivi_date."', '".addslashes($suivi_commentaire)

64vendredi 13 novembre 2009

Page 73: PHP Code Audit - OSCON 2009

And also

Header injection

Look for header()

XSS

look for Echo, or concatenation with tags

Etc...

65vendredi 13 novembre 2009

Page 74: PHP Code Audit - OSCON 2009

Report

Vulnerability Critical Load

register_globals High High

Injections High Medium

SQL injection Medium High

headers Low Low

66vendredi 13 novembre 2009

Page 75: PHP Code Audit - OSCON 2009

Team organization

67vendredi 13 novembre 2009

Page 76: PHP Code Audit - OSCON 2009

Team Work

Continuous audit?

Once

When necessary

Regularly

Continuously

68vendredi 13 novembre 2009

Page 77: PHP Code Audit - OSCON 2009

PHP Mantra

List your mantra

The five most important rules you agree upon

Have them printed and visible to everyone

69vendredi 13 novembre 2009

Page 78: PHP Code Audit - OSCON 2009

Cross audit

Group developers by two

Have each one review the code of the other

Based on the mantra

Light weight process

Doesn’t have to be in the same project

70vendredi 13 novembre 2009

Page 79: PHP Code Audit - OSCON 2009

PHP audit tools

Groogle (http://groogle.sourceforge.net)

Review Board (http://www.review-board.org/)

Rietveld http://codereview.appspot.com/

SmartBear (http://www.smartbear.com/)

71vendredi 13 novembre 2009

Page 80: PHP Code Audit - OSCON 2009

Community step up

Mantra, cross audits

go beyond services and departements

Open this outside ?

External review?

New way of coding ?

72vendredi 13 novembre 2009

Page 81: PHP Code Audit - OSCON 2009

Thank you!Philippe Gamache : [email protected] Seguy : [email protected]

73vendredi 13 novembre 2009

Page 82: PHP Code Audit - OSCON 2009

74vendredi 13 novembre 2009