SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
PHP Object Injection Demystified
Security Summit
Milano, 17 Marzo 2015
$ whoami
• Egidio Romano (aka EgiX)
• Web Application Security Addicted
• Security Consultant @ Minded Security
• In passato Security Specialist @ Secunia
• https://it.linkedin.com/in/romanoegidio
Agenda
• PHP Object Injection: cenni storici
• Serializzazione in PHP: serialize e unserialize
• Programmazione Object-Oriented in PHP
• Tecnica POP (Property-Oriented Programming)
• Analisi di un caso reale
• Demo
Attacchi di Code Injection
• Buffer Overflow (Morris worm, 1988)
• SQL Injection (Jeff Forristal, 1998)
• Cross-Site Scripting (David Ross, 1999)
• Dynamic Evaluation Vulnerabilities in PHP
applications (Steven Christey, 2006)
• PHP Object Injection (Stefan Esser, 2009)
PHP Object Injection
• Nuova classe di vulnerabilità presentata da
Stefan Esser alla conferenza Power Of
Community (POC) tenutasi a Seoul nel 2009:
‘’Shocking News in PHP Exploitation’’
• Rivisitata sempre da Stefan Esser durante la
conferenza BlackHat USA 2010: ‘’Utilizing
Code Reuse/ROP in PHP Application Exploits’’
PHP Object Injection
CVEs:
• 2009-4137: Piwik <= 0.4.5
• 2012-0694: SugarCRM <= 6.3.1
• 2013-1453: Joomla <= 3.0.2
• 2013-4338: WordPress <= 3.6
• 2014-1860: Contao CMS <= 3.2.4
• 2015-2171: Slim Framework <= 2.5.0
• ………
Everything you need to know
Everything you need to know
Serializzazione in PHP
Autoloading delle classi
Metodi magici
Serializzazione in PHP: serialize
Variabile PHP
Rappresentazione
della variabile sotto
forma di stringa
serialize()
<?php
class Esempio
{
public $boolean = true;
public $string = "Stringa";
public $array = array(100, 200);
}
$myObject = new Esempio();
print serialize($myObject);
Output:
O:7:"Esempio":3:{s:7:"boolean";b:1;s:6:"string";s:7
:"Stringa";s:5:"array";a:2:{i:0;i:100;i:1;i:200;}}
Serializzazione in PHP: unserialize
Rappresentazione
della variabile sotto
forma di stringa
Variabile PHP
unserialize()
<?php
$mySerializedObject =
'O:7:"Esempio":3:{s:7:"boolean";b:1;s:6:"string";s:7
:"Stringa";s:5:"array";a:2:{i:0;i:100;i:1;i:200;}}';
$myObject = unserialize($mySerializedObject);
var_dump($myObject);
Output:
object(Esempio)#1 (3) { ["boolean"]=> bool(true)
["string"]=> string(7) "Stringa" ["array"]=>
array(2) { [0]=> int(100) [1]=> int(200) } }
OOP in PHP: autoloading
Funzione magica __autoload:
• Introdotta a partire da PHP 5.
• Chiamata automaticamente quando il codice referenzia
una classe che non è stata ancora caricata, dando
quindi un’ultima possibilità a run-time di caricarne la
definizione prima di generare un errore.
• Considerata obsoleta, poiché con PHP 5.1.2 è stata
introdotta la funzione spl_autoload_register che
permette di registrare autoloader multipli.
OOP in PHP: autoloading
• Sono sintatticamente riconoscibili dal
doppio underscore iniziale.
• Invocati automaticamente dal motore PHP
al verificarsi di un evento che riguarda una
classe od un’istanza della stessa.
OOP in PHP: metodi magici
OOP in PHP: metodi magici
Nome del metodo Invocato quando viene…
__construct creata una nuova istanza della classe
__destruct distrutta un’istanza
__call richiamato un metodo inaccessibile
__toString un’istanza viene usata come una stringa
__sleep richiamata la funzione ‘’serialize’’ con un’istanza
__wakeup ricostruita un’istanza con la funzione ‘’unserialize’’
Unserialize + User Input =
http://php.net/manual/en/function.unserialize.php
Esempio di applicazione vulnerabile
file: index.php
<?php
function __autoload($class_name)
{
$filename = $class_name . ".php";
if (file_exists($filename)) {
require $filename;
}
}
/* ... */
$user_data = unserialize($_GET['data']);
Esempio di applicazione vulnerabile
file: MyTemplate.php
<?php
class MyTemplate
{
public $template_data;
function __construct() {
/* ... */
}
function __wakeup() {
if (isset($this->template_data)) {
eval($this->template_data);
}
}
}
Attack Flow: Step 1
• L’attaccante crea una nuova istanza della
classe ‘’MyTemplate’’ la cui proprietà
‘’template_data’’ contenga del codice
PHP a sua scelta.
• Tale istanza verrà passata alla funzione
‘’serialize’’ al fine di ottenerne una
rappresentazione sotto forma di stringa.
Attack Flow: Step 1
Attack Flow: Step 2
• La stringa serializzata ottenuta verrà inviata
all’applicazione vulnerabile attraverso il
parametro GET ‘’data’’.
• Quando l’applicazione effettuerà la
deserializzazione del parametro ricevuto in
input una nuova istanza della classe
‘’MyTemplate’’ verrà creata e il suo metodo
__wakeup verrà invocato automaticamente
eseguendo il codice PHP scelto dell’attaccante.
Attack Flow: Step 2
• Nel mondo reale non è molto comune trovare
un’applicazione con metodi magici che permettano di
eseguire un qualche tipo di attacco in modo diretto.
• Tuttavia non è poi così raro trovare situazioni in cui un
oggetto invochi metodi di altri oggetti memorizzati
all’interno delle sue proprietà.
• Se ciò accade all’interno di un metodo magico, allora è
possibile costruire una ‘’POP chain’’, ovvero una catena di
oggetti interconnessi attraverso le loro proprietà il cui scopo
a redirezionare il flusso di esecuzione verso un pezzo di
codice utile per l’attaccante.
POP: Property-Oriented Programming
POP: Property-Oriented Programming
Property
Oriented
Programming
(POP)
Return To Libc
ROP
Code Reuse
Si tratta di una tecnica di exploitation che prevede il riutilizzo di
codice già esistente. Invece di inserire codice arbitrario, il flusso
di esecuzione dell’applicazione viene dirottato verso pezzi di
codice che vengono eseguiti in un ordine scelto dall’attaccante.
La tecnica POP può essere
dunque vista come una
forma di riutilizzo del
codice, analogamente alla
tecnica ROP utilizzata per
sfruttare vulnerabilità di
memory corruption.
Una classe può essere utilizzata per
iniziare una POP chain se implementa
un metodo magico ‘’interessante’’:
• Di solito __wakeup() o __destruct()
• Ma anche altri metodi magici:
o __toString()
o __call()
o __get()
o __set()
POP Chain: inizio della catena
class POP_Start
{
private $prop;
function __construct()
{
/* ... */
}
function __destruct()
{
$this->prop->methodA();
}
}
Una classe può essere interessante per
costruire una POP chain se essa traferisce il
flusso di esecuzione verso un oggetto
memorizzato in una delle sue proprietà:
• Invocando un metodo su una delle
proprietà dell’oggetto.
• Effettuando una conversione in stringa di
una proprietà (scatenando il metodo
__toString() del relativo oggetto).
• Invocando un altro metodo magico di un
oggetto memorizzato in una delle
proprietà.
POP Chain: dirottamento del flusso di esecuzione
class POP_Transfer
{
private $prop;
function __construct()
{
/* ... */
}
function methodA()
{
$this->prop->methodB();
}
}
La fine della catena richiede
una classe che implementi un
metodo che esegua operazioni
interessanti dalla prospettiva
di un attaccante (un sink):
• Operazioni sui file
• Accesso al database
• Inserimento dinamico di
codice
• …
POP Chain: fine della catena
class POP_End
{
function __construct()
{
/* ... */
}
function methodB()
{
$fp = fopen($this->file, 'w');
fwrite($fp, $this->data);
fclose($fp);
}
}
Esempio di applicazione vulnerabile
file: index.php
<?php
function __autoload($class_name)
{
$filename = $class_name . ".php";
if (file_exists($filename)) {
require $filename;
}
}
/* ... */
$user_data = unserialize($_GET['data']);
Esempio di applicazione vulnerabile
file: MyObject.php
<?php
class MyObject
{
public $obj;
/* ... */
function __destruct()
{
if (isset($this->obj)) {
print $this->obj->getValue();
}
}
}
Esempio di applicazione vulnerabile
file: SqlRow.php
<?php
class SqlRow
{
public $_table;
function getValue($id)
{
$sql = "SELECT * FROM {$this->_table} WHERE id = ".(int)$id;
$result = mysql_query($sql, $DBFactory::getConnection());
$row = mysql_fetch_assoc($result);
return $row['value'];
}
}
Attack Flow: Step 1
• L’attaccante crea una nuova istanza della classe
‘’MyObject’’ ed assegna alla proprietà ‘’obj’’
una nuova istanza delle classe ‘’SqlRow’’.
• Tale istanza conterrà del codice SQL arbitrario
all’interno della sua proprietà ‘’_table’’.
• Infine, la catena ottenuta verrà passata alla
funzione ‘’serialize’’ al fine di ottenerne una
rappresentazione sotto forma di stringa.
Attack Flow: Step 1
Attack Flow: Step 2
• La stringa serializzata ottenuta verrà inviata all’applicazione
vulnerabile attraverso il parametro GET ‘’data’’.
• Quando l’applicazione effettuerà la deserializzazione del parametro
ricevuto in input una nuova istanza della classe ‘MyObject’’ verrà
creata e il suo metodo __destruct verrà invocato automaticamente.
• All’interno di tale metodo verrà invocato il metodo ‘’getValue’’
dell’oggetto memorizzato all’interno delle proprietà ‘’obj’’, in questo
caso un oggetto di tipo ‘’SqlRow’’.
• Quando tale metodo verrà eseguito, l’attaccante sarà in grado di
portare a termine una attacco di SQL Injection, poiché è possibile
alterare la query eseguita attraverso la proprietà ‘’_table’’.
Attack Flow: Step 2
Analisi di un caso reale: CVE-2013-1453
PHP Object Injection in Joomla!
CVE-2013-1453
plugins/system/highlight/highlight.php in Joomla! 3.0.x through
3.0.2 and 2.5.x through 2.5.8 allows attackers to unserialize
arbitrary PHP objects to obtain sensitive information, delete
arbitrary directories, conduct SQL injection attacks, and possibly
have other impacts via the highlight parameter. Note: it was
originally reported that this issue only allowed attackers to
obtain sensitive information, but later analysis demonstrated
that other attacks exist.
http://cve.mitre.org/cgi-bin/cvename.cgi?name=2013-1453
CVE-2013-1453
La vulnerabilità è situata all’interno del plugin di sistema
‘’highlighter’’, presente nel core di Joomla! ed abilitatato di
default. Il codice vulnerabile viene eseguito per ogni richiesta
ricevuta e non necessita alcuna autenticazione.
Se nella richiesta è presente un parametro di nome ‘’highlight’’
codificato in base64, allora il suo valore verrà passato alla
funzione unserialize() dopo essere stato decodificato:
// Get the terms to highlight from the request.
$terms = $input->request->get('highlight', null, 'base64');
$terms = $terms ? unserialize(base64_decode($terms)) : null;
How to exploit this?
• Dopo una prima analisi non sono state individuate classi all’interno
del core di Joomla! che implementano metodi magici sfruttabili per
eseguire un qualche tipo di attacco in modo diretto.
• Tuttavia c’è una classe che potrebbe essere sfruttata per iniziare
una POP chain, poiché invoca un metodo su una delle sue proprietà.
• Si tratta della classe plgSystemDebug. Nel suo metodo distruttore
viene infatti invocato il metodo ‘’get’’ dell’oggetto memorizzato
all’interno della proprietà ‘’params’’:
// If the user is not allowed to view the output then end here
$filterGroups = (array) $this->params->get('filter_groups', null);
Building the POP Chain(s)
• La proprietà ‘’params’’ può essere settata da un attaccante in
modo arbitrario all’interno della sua POP chain, di conseguenza
è possibile dirottare il flusso di esecuzione verso il metodo ‘’get’’
di una classe a sua scelta.
• All’interno del core di Joomla! è possibile sfruttare i metodi
‘’get’’ di due classi differenti:
 il primo permette all'attaccante di eseguire attacchi SQL Injection;
 il secondo permette di trasferire il flusso di esecuzione verso un altro
oggetto, il quale a sua volta può essere sfruttato per eseguire attacchi
Denial of Service (DoS) poiché permette di cancellare ricorsivamente
un’intera directory scelta dall’attaccante.
POP Chain: SQL Injection
Il metodo ‘’get’’ della classe JCategories permette di eseguire
attacchi SQL Injection, poiché esso invocherà il suo metodo
‘’_load’’, all’interno del quale viene eseguita una query SQL
interpolata con la proprietà ‘’_statefield’’ dell’oggetto:
if ($this->_options['published'] == 1)
{
$query->leftJoin(
$db->quoteName($this->_table) . ' AS i ON i.' . $db-
>quoteName($this->_field) . ' = c.id AND i.' . $this->_statefield .
' = 1'
);
}
POP Chain: Denial of Service
Il metodo ‘’get’’ della classe JInput permette di trasferire il flusso di
esecuzione verso un altro oggetto, poiché invoca il metodo ‘’clean’’
dell’oggetto memorizzato all’interno della proprietà ‘’filter’’:
public function get($name, $default = null, $filter = 'cmd')
{
if (isset($this->data[$name]))
{
return $this->filter->clean($this->data[$name], $filter);
}
Settando la proprietà ‘’filter’’ a un oggetto di tipo JCacheStorageFile,
il flusso di esecuzione verrà dirottato verso il suo metodo ‘’clean’’, che
a sua volta invoca il metodo ‘’_deleteFolder’’.
Demo

Mais conteúdo relacionado

Mais procurados (10)

Javascript
JavascriptJavascript
Javascript
 
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
 
iContract
iContractiContract
iContract
 
Introduzione a Python
Introduzione a PythonIntroduzione a Python
Introduzione a Python
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
iOS_Course_6
iOS_Course_6iOS_Course_6
iOS_Course_6
 
Corso c++
Corso c++Corso c++
Corso c++
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 

Semelhante a PHP Object Injection

BackBox Linux: Simulazione di un Penetration Test
BackBox Linux: Simulazione di un Penetration TestBackBox Linux: Simulazione di un Penetration Test
BackBox Linux: Simulazione di un Penetration TestAndrea Draghetti
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationAndrea Della Corte
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitMaurizio Delmonte
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Italian deft 7 manual 90
Italian deft 7 manual 90Italian deft 7 manual 90
Italian deft 7 manual 90mstrom62
 
Asp.net gestione della_memoria
Asp.net gestione della_memoriaAsp.net gestione della_memoria
Asp.net gestione della_memoriaCrismer La Pignola
 
Autenticazione delle api con jwt e symfony (Italian)
Autenticazione delle api con jwt e symfony (Italian)Autenticazione delle api con jwt e symfony (Italian)
Autenticazione delle api con jwt e symfony (Italian)Marco Albarelli
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLAndrea Della Corte
 
BackBox Linux: Simulazione di un Penetration Test e CTF
BackBox Linux: Simulazione di un Penetration Test e CTFBackBox Linux: Simulazione di un Penetration Test e CTF
BackBox Linux: Simulazione di un Penetration Test e CTFAndrea Draghetti
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseFelice Pescatore
 
NHibernate in Action (Parte 2)
NHibernate in Action (Parte 2)NHibernate in Action (Parte 2)
NHibernate in Action (Parte 2)DotNetMarche
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
 
Programma il futuro : una scelta Open Source
Programma il futuro : una scelta Open SourceProgramma il futuro : una scelta Open Source
Programma il futuro : una scelta Open SourceNaLUG
 
Twcrashcourse
TwcrashcourseTwcrashcourse
Twcrashcourserik0
 

Semelhante a PHP Object Injection (20)

BackBox Linux: Simulazione di un Penetration Test
BackBox Linux: Simulazione di un Penetration TestBackBox Linux: Simulazione di un Penetration Test
BackBox Linux: Simulazione di un Penetration Test
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
[Objective-C] - Introduzione
[Objective-C] - Introduzione[Objective-C] - Introduzione
[Objective-C] - Introduzione
 
Italian deft 7 manual 90
Italian deft 7 manual 90Italian deft 7 manual 90
Italian deft 7 manual 90
 
Alla ricerca del malware perduto: progettazione e realizzazione di una Virtua...
Alla ricerca del malware perduto: progettazione e realizzazione di una Virtua...Alla ricerca del malware perduto: progettazione e realizzazione di una Virtua...
Alla ricerca del malware perduto: progettazione e realizzazione di una Virtua...
 
Asp.net gestione della_memoria
Asp.net gestione della_memoriaAsp.net gestione della_memoria
Asp.net gestione della_memoria
 
Autenticazione delle api con jwt e symfony (Italian)
Autenticazione delle api con jwt e symfony (Italian)Autenticazione delle api con jwt e symfony (Italian)
Autenticazione delle api con jwt e symfony (Italian)
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
 
BackBox Linux: Simulazione di un Penetration Test e CTF
BackBox Linux: Simulazione di un Penetration Test e CTFBackBox Linux: Simulazione di un Penetration Test e CTF
BackBox Linux: Simulazione di un Penetration Test e CTF
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
Codemotion workshop
Codemotion workshopCodemotion workshop
Codemotion workshop
 
NHibernate in Action (Parte 2)
NHibernate in Action (Parte 2)NHibernate in Action (Parte 2)
NHibernate in Action (Parte 2)
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
 
Programma il futuro : una scelta Open Source
Programma il futuro : una scelta Open SourceProgramma il futuro : una scelta Open Source
Programma il futuro : una scelta Open Source
 
Twcrashcourse
TwcrashcourseTwcrashcourse
Twcrashcourse
 
Repository pattern
Repository patternRepository pattern
Repository pattern
 

Mais de Minded Security

Ieee S&P 2020 - Software Security: from Research to Industry.
Ieee S&P 2020 - Software Security: from Research to Industry.Ieee S&P 2020 - Software Security: from Research to Industry.
Ieee S&P 2020 - Software Security: from Research to Industry.Minded Security
 
Matteo Meucci - Security Summit 12th March 2019
Matteo Meucci - Security Summit 12th March 2019Matteo Meucci - Security Summit 12th March 2019
Matteo Meucci - Security Summit 12th March 2019Minded Security
 
Microservices Security: dos and don'ts
Microservices Security: dos and don'tsMicroservices Security: dos and don'ts
Microservices Security: dos and don'tsMinded Security
 
Js deobfuscation with JStillery - bsides-roma 2018
Js deobfuscation with JStillery - bsides-roma 2018Js deobfuscation with JStillery - bsides-roma 2018
Js deobfuscation with JStillery - bsides-roma 2018Minded Security
 
Matteo Meucci Isaca Venice - 2017
Matteo Meucci  Isaca Venice - 2017Matteo Meucci  Isaca Venice - 2017
Matteo Meucci Isaca Venice - 2017Minded Security
 
BlueClosure Pitch - Cybertech Europe 2017
BlueClosure Pitch - Cybertech Europe 2017BlueClosure Pitch - Cybertech Europe 2017
BlueClosure Pitch - Cybertech Europe 2017Minded Security
 
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...Minded Security
 
Matteo meucci Software Security - Napoli 10112016
Matteo meucci   Software Security - Napoli 10112016Matteo meucci   Software Security - Napoli 10112016
Matteo meucci Software Security - Napoli 10112016Minded Security
 
Matteo Meucci Software Security in practice - Aiea torino - 30-10-2015
Matteo Meucci   Software Security in practice - Aiea torino - 30-10-2015Matteo Meucci   Software Security in practice - Aiea torino - 30-10-2015
Matteo Meucci Software Security in practice - Aiea torino - 30-10-2015Minded Security
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS DeobfuscationMinded Security
 
Sandboxing JS and HTML. A lession Learned
Sandboxing JS and HTML. A lession LearnedSandboxing JS and HTML. A lession Learned
Sandboxing JS and HTML. A lession LearnedMinded Security
 
Concrete5 Sendmail RCE Advisory
Concrete5 Sendmail RCE AdvisoryConcrete5 Sendmail RCE Advisory
Concrete5 Sendmail RCE AdvisoryMinded Security
 
Concrete5 Multiple Reflected XSS Advisory
Concrete5 Multiple Reflected XSS AdvisoryConcrete5 Multiple Reflected XSS Advisory
Concrete5 Multiple Reflected XSS AdvisoryMinded Security
 

Mais de Minded Security (15)

Ieee S&P 2020 - Software Security: from Research to Industry.
Ieee S&P 2020 - Software Security: from Research to Industry.Ieee S&P 2020 - Software Security: from Research to Industry.
Ieee S&P 2020 - Software Security: from Research to Industry.
 
Matteo Meucci - Security Summit 12th March 2019
Matteo Meucci - Security Summit 12th March 2019Matteo Meucci - Security Summit 12th March 2019
Matteo Meucci - Security Summit 12th March 2019
 
Microservices Security: dos and don'ts
Microservices Security: dos and don'tsMicroservices Security: dos and don'ts
Microservices Security: dos and don'ts
 
Live hacking Demo
Live hacking DemoLive hacking Demo
Live hacking Demo
 
Js deobfuscation with JStillery - bsides-roma 2018
Js deobfuscation with JStillery - bsides-roma 2018Js deobfuscation with JStillery - bsides-roma 2018
Js deobfuscation with JStillery - bsides-roma 2018
 
Matteo Meucci Isaca Venice - 2017
Matteo Meucci  Isaca Venice - 2017Matteo Meucci  Isaca Venice - 2017
Matteo Meucci Isaca Venice - 2017
 
BlueClosure Pitch - Cybertech Europe 2017
BlueClosure Pitch - Cybertech Europe 2017BlueClosure Pitch - Cybertech Europe 2017
BlueClosure Pitch - Cybertech Europe 2017
 
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...
Minded Security - Fabrizio Bugli - (3rd) party like nobody's watching...
 
Matteo meucci Software Security - Napoli 10112016
Matteo meucci   Software Security - Napoli 10112016Matteo meucci   Software Security - Napoli 10112016
Matteo meucci Software Security - Napoli 10112016
 
Matteo Meucci Software Security in practice - Aiea torino - 30-10-2015
Matteo Meucci   Software Security in practice - Aiea torino - 30-10-2015Matteo Meucci   Software Security in practice - Aiea torino - 30-10-2015
Matteo Meucci Software Security in practice - Aiea torino - 30-10-2015
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS Deobfuscation
 
Sandboxing JS and HTML. A lession Learned
Sandboxing JS and HTML. A lession LearnedSandboxing JS and HTML. A lession Learned
Sandboxing JS and HTML. A lession Learned
 
Concrete5 Sendmail RCE Advisory
Concrete5 Sendmail RCE AdvisoryConcrete5 Sendmail RCE Advisory
Concrete5 Sendmail RCE Advisory
 
Concrete5 Multiple Reflected XSS Advisory
Concrete5 Multiple Reflected XSS AdvisoryConcrete5 Multiple Reflected XSS Advisory
Concrete5 Multiple Reflected XSS Advisory
 
iOS Masque Attack
iOS Masque AttackiOS Masque Attack
iOS Masque Attack
 

Último

Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniGiornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleGiornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideServizi a rete
 

Último (7)

Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniGiornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleGiornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
 

PHP Object Injection

  • 1. PHP Object Injection Demystified Security Summit Milano, 17 Marzo 2015
  • 2. $ whoami • Egidio Romano (aka EgiX) • Web Application Security Addicted • Security Consultant @ Minded Security • In passato Security Specialist @ Secunia • https://it.linkedin.com/in/romanoegidio
  • 3. Agenda • PHP Object Injection: cenni storici • Serializzazione in PHP: serialize e unserialize • Programmazione Object-Oriented in PHP • Tecnica POP (Property-Oriented Programming) • Analisi di un caso reale • Demo
  • 4. Attacchi di Code Injection • Buffer Overflow (Morris worm, 1988) • SQL Injection (Jeff Forristal, 1998) • Cross-Site Scripting (David Ross, 1999) • Dynamic Evaluation Vulnerabilities in PHP applications (Steven Christey, 2006) • PHP Object Injection (Stefan Esser, 2009)
  • 5. PHP Object Injection • Nuova classe di vulnerabilità presentata da Stefan Esser alla conferenza Power Of Community (POC) tenutasi a Seoul nel 2009: ‘’Shocking News in PHP Exploitation’’ • Rivisitata sempre da Stefan Esser durante la conferenza BlackHat USA 2010: ‘’Utilizing Code Reuse/ROP in PHP Application Exploits’’
  • 6. PHP Object Injection CVEs: • 2009-4137: Piwik <= 0.4.5 • 2012-0694: SugarCRM <= 6.3.1 • 2013-1453: Joomla <= 3.0.2 • 2013-4338: WordPress <= 3.6 • 2014-1860: Contao CMS <= 3.2.4 • 2015-2171: Slim Framework <= 2.5.0 • ………
  • 8. Everything you need to know Serializzazione in PHP Autoloading delle classi Metodi magici
  • 9. Serializzazione in PHP: serialize Variabile PHP Rappresentazione della variabile sotto forma di stringa serialize() <?php class Esempio { public $boolean = true; public $string = "Stringa"; public $array = array(100, 200); } $myObject = new Esempio(); print serialize($myObject); Output: O:7:"Esempio":3:{s:7:"boolean";b:1;s:6:"string";s:7 :"Stringa";s:5:"array";a:2:{i:0;i:100;i:1;i:200;}}
  • 10. Serializzazione in PHP: unserialize Rappresentazione della variabile sotto forma di stringa Variabile PHP unserialize() <?php $mySerializedObject = 'O:7:"Esempio":3:{s:7:"boolean";b:1;s:6:"string";s:7 :"Stringa";s:5:"array";a:2:{i:0;i:100;i:1;i:200;}}'; $myObject = unserialize($mySerializedObject); var_dump($myObject); Output: object(Esempio)#1 (3) { ["boolean"]=> bool(true) ["string"]=> string(7) "Stringa" ["array"]=> array(2) { [0]=> int(100) [1]=> int(200) } }
  • 11. OOP in PHP: autoloading Funzione magica __autoload: • Introdotta a partire da PHP 5. • Chiamata automaticamente quando il codice referenzia una classe che non è stata ancora caricata, dando quindi un’ultima possibilità a run-time di caricarne la definizione prima di generare un errore. • Considerata obsoleta, poiché con PHP 5.1.2 è stata introdotta la funzione spl_autoload_register che permette di registrare autoloader multipli.
  • 12. OOP in PHP: autoloading
  • 13. • Sono sintatticamente riconoscibili dal doppio underscore iniziale. • Invocati automaticamente dal motore PHP al verificarsi di un evento che riguarda una classe od un’istanza della stessa. OOP in PHP: metodi magici
  • 14. OOP in PHP: metodi magici Nome del metodo Invocato quando viene… __construct creata una nuova istanza della classe __destruct distrutta un’istanza __call richiamato un metodo inaccessibile __toString un’istanza viene usata come una stringa __sleep richiamata la funzione ‘’serialize’’ con un’istanza __wakeup ricostruita un’istanza con la funzione ‘’unserialize’’
  • 15. Unserialize + User Input = http://php.net/manual/en/function.unserialize.php
  • 16. Esempio di applicazione vulnerabile file: index.php <?php function __autoload($class_name) { $filename = $class_name . ".php"; if (file_exists($filename)) { require $filename; } } /* ... */ $user_data = unserialize($_GET['data']);
  • 17. Esempio di applicazione vulnerabile file: MyTemplate.php <?php class MyTemplate { public $template_data; function __construct() { /* ... */ } function __wakeup() { if (isset($this->template_data)) { eval($this->template_data); } } }
  • 18. Attack Flow: Step 1 • L’attaccante crea una nuova istanza della classe ‘’MyTemplate’’ la cui proprietà ‘’template_data’’ contenga del codice PHP a sua scelta. • Tale istanza verrà passata alla funzione ‘’serialize’’ al fine di ottenerne una rappresentazione sotto forma di stringa.
  • 20. Attack Flow: Step 2 • La stringa serializzata ottenuta verrà inviata all’applicazione vulnerabile attraverso il parametro GET ‘’data’’. • Quando l’applicazione effettuerà la deserializzazione del parametro ricevuto in input una nuova istanza della classe ‘’MyTemplate’’ verrà creata e il suo metodo __wakeup verrà invocato automaticamente eseguendo il codice PHP scelto dell’attaccante.
  • 22. • Nel mondo reale non è molto comune trovare un’applicazione con metodi magici che permettano di eseguire un qualche tipo di attacco in modo diretto. • Tuttavia non è poi così raro trovare situazioni in cui un oggetto invochi metodi di altri oggetti memorizzati all’interno delle sue proprietà. • Se ciò accade all’interno di un metodo magico, allora è possibile costruire una ‘’POP chain’’, ovvero una catena di oggetti interconnessi attraverso le loro proprietà il cui scopo a redirezionare il flusso di esecuzione verso un pezzo di codice utile per l’attaccante. POP: Property-Oriented Programming
  • 23. POP: Property-Oriented Programming Property Oriented Programming (POP) Return To Libc ROP Code Reuse Si tratta di una tecnica di exploitation che prevede il riutilizzo di codice già esistente. Invece di inserire codice arbitrario, il flusso di esecuzione dell’applicazione viene dirottato verso pezzi di codice che vengono eseguiti in un ordine scelto dall’attaccante. La tecnica POP può essere dunque vista come una forma di riutilizzo del codice, analogamente alla tecnica ROP utilizzata per sfruttare vulnerabilità di memory corruption.
  • 24. Una classe può essere utilizzata per iniziare una POP chain se implementa un metodo magico ‘’interessante’’: • Di solito __wakeup() o __destruct() • Ma anche altri metodi magici: o __toString() o __call() o __get() o __set() POP Chain: inizio della catena class POP_Start { private $prop; function __construct() { /* ... */ } function __destruct() { $this->prop->methodA(); } }
  • 25. Una classe può essere interessante per costruire una POP chain se essa traferisce il flusso di esecuzione verso un oggetto memorizzato in una delle sue proprietà: • Invocando un metodo su una delle proprietà dell’oggetto. • Effettuando una conversione in stringa di una proprietà (scatenando il metodo __toString() del relativo oggetto). • Invocando un altro metodo magico di un oggetto memorizzato in una delle proprietà. POP Chain: dirottamento del flusso di esecuzione class POP_Transfer { private $prop; function __construct() { /* ... */ } function methodA() { $this->prop->methodB(); } }
  • 26. La fine della catena richiede una classe che implementi un metodo che esegua operazioni interessanti dalla prospettiva di un attaccante (un sink): • Operazioni sui file • Accesso al database • Inserimento dinamico di codice • … POP Chain: fine della catena class POP_End { function __construct() { /* ... */ } function methodB() { $fp = fopen($this->file, 'w'); fwrite($fp, $this->data); fclose($fp); } }
  • 27. Esempio di applicazione vulnerabile file: index.php <?php function __autoload($class_name) { $filename = $class_name . ".php"; if (file_exists($filename)) { require $filename; } } /* ... */ $user_data = unserialize($_GET['data']);
  • 28. Esempio di applicazione vulnerabile file: MyObject.php <?php class MyObject { public $obj; /* ... */ function __destruct() { if (isset($this->obj)) { print $this->obj->getValue(); } } }
  • 29. Esempio di applicazione vulnerabile file: SqlRow.php <?php class SqlRow { public $_table; function getValue($id) { $sql = "SELECT * FROM {$this->_table} WHERE id = ".(int)$id; $result = mysql_query($sql, $DBFactory::getConnection()); $row = mysql_fetch_assoc($result); return $row['value']; } }
  • 30. Attack Flow: Step 1 • L’attaccante crea una nuova istanza della classe ‘’MyObject’’ ed assegna alla proprietà ‘’obj’’ una nuova istanza delle classe ‘’SqlRow’’. • Tale istanza conterrà del codice SQL arbitrario all’interno della sua proprietà ‘’_table’’. • Infine, la catena ottenuta verrà passata alla funzione ‘’serialize’’ al fine di ottenerne una rappresentazione sotto forma di stringa.
  • 32. Attack Flow: Step 2 • La stringa serializzata ottenuta verrà inviata all’applicazione vulnerabile attraverso il parametro GET ‘’data’’. • Quando l’applicazione effettuerà la deserializzazione del parametro ricevuto in input una nuova istanza della classe ‘MyObject’’ verrà creata e il suo metodo __destruct verrà invocato automaticamente. • All’interno di tale metodo verrà invocato il metodo ‘’getValue’’ dell’oggetto memorizzato all’interno delle proprietà ‘’obj’’, in questo caso un oggetto di tipo ‘’SqlRow’’. • Quando tale metodo verrà eseguito, l’attaccante sarà in grado di portare a termine una attacco di SQL Injection, poiché è possibile alterare la query eseguita attraverso la proprietà ‘’_table’’.
  • 34. Analisi di un caso reale: CVE-2013-1453 PHP Object Injection in Joomla!
  • 35. CVE-2013-1453 plugins/system/highlight/highlight.php in Joomla! 3.0.x through 3.0.2 and 2.5.x through 2.5.8 allows attackers to unserialize arbitrary PHP objects to obtain sensitive information, delete arbitrary directories, conduct SQL injection attacks, and possibly have other impacts via the highlight parameter. Note: it was originally reported that this issue only allowed attackers to obtain sensitive information, but later analysis demonstrated that other attacks exist. http://cve.mitre.org/cgi-bin/cvename.cgi?name=2013-1453
  • 36. CVE-2013-1453 La vulnerabilità è situata all’interno del plugin di sistema ‘’highlighter’’, presente nel core di Joomla! ed abilitatato di default. Il codice vulnerabile viene eseguito per ogni richiesta ricevuta e non necessita alcuna autenticazione. Se nella richiesta è presente un parametro di nome ‘’highlight’’ codificato in base64, allora il suo valore verrà passato alla funzione unserialize() dopo essere stato decodificato: // Get the terms to highlight from the request. $terms = $input->request->get('highlight', null, 'base64'); $terms = $terms ? unserialize(base64_decode($terms)) : null;
  • 37. How to exploit this? • Dopo una prima analisi non sono state individuate classi all’interno del core di Joomla! che implementano metodi magici sfruttabili per eseguire un qualche tipo di attacco in modo diretto. • Tuttavia c’è una classe che potrebbe essere sfruttata per iniziare una POP chain, poiché invoca un metodo su una delle sue proprietà. • Si tratta della classe plgSystemDebug. Nel suo metodo distruttore viene infatti invocato il metodo ‘’get’’ dell’oggetto memorizzato all’interno della proprietà ‘’params’’: // If the user is not allowed to view the output then end here $filterGroups = (array) $this->params->get('filter_groups', null);
  • 38. Building the POP Chain(s) • La proprietà ‘’params’’ può essere settata da un attaccante in modo arbitrario all’interno della sua POP chain, di conseguenza è possibile dirottare il flusso di esecuzione verso il metodo ‘’get’’ di una classe a sua scelta. • All’interno del core di Joomla! è possibile sfruttare i metodi ‘’get’’ di due classi differenti:  il primo permette all'attaccante di eseguire attacchi SQL Injection;  il secondo permette di trasferire il flusso di esecuzione verso un altro oggetto, il quale a sua volta può essere sfruttato per eseguire attacchi Denial of Service (DoS) poiché permette di cancellare ricorsivamente un’intera directory scelta dall’attaccante.
  • 39. POP Chain: SQL Injection Il metodo ‘’get’’ della classe JCategories permette di eseguire attacchi SQL Injection, poiché esso invocherà il suo metodo ‘’_load’’, all’interno del quale viene eseguita una query SQL interpolata con la proprietà ‘’_statefield’’ dell’oggetto: if ($this->_options['published'] == 1) { $query->leftJoin( $db->quoteName($this->_table) . ' AS i ON i.' . $db- >quoteName($this->_field) . ' = c.id AND i.' . $this->_statefield . ' = 1' ); }
  • 40. POP Chain: Denial of Service Il metodo ‘’get’’ della classe JInput permette di trasferire il flusso di esecuzione verso un altro oggetto, poiché invoca il metodo ‘’clean’’ dell’oggetto memorizzato all’interno della proprietà ‘’filter’’: public function get($name, $default = null, $filter = 'cmd') { if (isset($this->data[$name])) { return $this->filter->clean($this->data[$name], $filter); } Settando la proprietà ‘’filter’’ a un oggetto di tipo JCacheStorageFile, il flusso di esecuzione verrà dirottato verso il suo metodo ‘’clean’’, che a sua volta invoca il metodo ‘’_deleteFolder’’.
  • 41. Demo