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.