Dì che c'era una pagina web accessibile al pubblico con il seguente codice PHP:
<?php
class NotInteresting
{
public function noExploits() {
echo "Whatever.";
}
}
$unsafe = unserialize($_GET['data']);
$unsafe->noExploits();
?>
Il codice si aspetta che il parametro data
URL contenga un'istanza serializzata di NotInteresting
, ma ovviamente il parametro data
può essere modificato. Quando unserialize()
viene utilizzato sui dati forniti dall'utente, spesso conduce a PHP Object Injection .
Tuttavia, tutti gli esempi di PHP Object Injection che ho visto finora ( 1 , 2 , 3 ) sono stati pericolosi per uno dei due motivi:
- C'erano alcune classi sfruttabili con metodi pericolosi (che dovevano essere chiamati internamente) che venivano sfruttati per eseguire codice arbitrario, spesso il caso di un CMS.
- La versione di PHP era vecchia o obsoleta e le vulnerabilità nel codice PHP sono state sfruttate.
Dato che la versione di PHP è attuale - cioè non esistono vulnerabilità note nella funzione unserialize()
- e che non ci sono classi personalizzate definite (solo quelle predefinite - Exception
, stdClass
ecc.), è possibile sfruttare il codice sopra riportato per un attacco riuscito su un'installazione PHP predefinita?
Ulteriori informazioni:
Per quanto ne so, ci sono solo quattro metodi magici sfruttabili quando si costruisce una classe arbitraria da una chiamata unserialize()
: __call()
, __wakeup()
, __destruct()
e __toString()
:
- __ wakeup () viene chiamato quando un oggetto non è serializzato.
- __ call () viene chiamato quando si invocano metodi inaccessibili (o inesistenti).
- __ destruct () viene sempre chiamato dopo che non vi sono più riferimenti all'oggetto.
- __ toString () viene chiamato quando un oggetto viene trattato come una stringa.
Quindi ho scritto uno script PHP per generare rapidamente un elenco delle classi che contengono questi metodi "interessanti": Vedi qui per un pastebin . Alcuni di questi sembrano molto 'interessanti':
- Le classi XML (potrebbero portare a XXE )
- Le classi
Phar
Tuttavia non sono ancora in grado di costruire un attacco solo con questi: avrò bisogno di qualcuno con più esperienza per valutare.