È PHP exploit unserialize () senza alcun metodo 'interessante'?

8

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:

  1. 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.
  2. 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.

    
posta Tryth 06.01.2015 - 11:53
fonte

2 risposte

2

La sfruttabilità della deserializzazione degli oggetti PHP dipende esclusivamente dalle classi disponibili (classi standard e classi personalizzate), dai loro metodi e comportamenti e dal fatto che sia possibile attivare uno di questi metodi sfruttabili.

Si noti che i metodi sfruttabili potrebbero non essere così banali. Potrebbe essere necessario creare strutture di oggetti complesse utilizzando più oggetti nidificati per attivare un determinato comportamento. Il numero di metodi sfruttabili o il loro comportamento possono anche cambiare nel tempo. Quindi, anche se potresti non essere in grado di sfruttarlo oggi, qualcuno potrebbe essere in grado di farlo.

    
risposta data 06.01.2015 - 13:01
fonte
1

OK, perché questo sia sicuro per una particolare configurazione, dovresti essere assolutamente sicuro che non ci siano classi con un comportamento sfruttabile. Dato che questo probabilmente include vari moduli (accesso DB, qualunque cosa) e il loro comportamento potrebbe includere "metodi magici" come getter o __wakeup() , questa è una cosa difficile da sapere completamente.

Dovresti anche pensare ai tuoi colleghi sviluppatori / manutentori (incluso te in futuro). In primo luogo, potrebbero non ricordare che dovrebbero scrivere ogni classe tenendo presente questo vincolo di sicurezza (che sembra facile da dimenticare). In secondo luogo, il codice sembra non sicuro, e non ha senso che le persone vengano continuamente investite per spiegare attentamente come hai sterilizzato ogni altra parte del sistema per far funzionare questa particolare cosa.

Un piano migliore sarebbe quello di serializzare su / da qualcosa come JSON - che non è solo più sicuro, ma rende la tua API compatibile anche con altre lingue.

    
risposta data 06.01.2015 - 12:25
fonte

Leggi altre domande sui tag