Sta usando JSON davvero abbastanza per correggere l'inserimento di oggetti PHP?

1

Quindi stavo solo leggendo sul sito OWASP su PHP Object Injection . Secondo il loro sito, la soluzione suggerita è di non usare serialze e unserialize ma di usare json_encode e json_decode .

Tuttavia, dopo aver fatto alcuni test in un periodo di tempo limitato, ho scoperto che non è affatto così. Ad esempio ( nell'esempio di Codepad funzionante ):

<?php 
function e($method, $args) {
    return $method($args); 
}

var_dump(call_user_func_array("e", array((string)array_shift(json_decode("[\"system\"]")), "ls" )));

?>

Quindi, le mie domande sono:

  1. Sei d'accordo con me che non è questo il caso, e ci dovrebbe essere più di una soluzione suggerita piuttosto che usare solo json_* funzioni?

  2. In realtà ho ragione a ritenere che ciò che ho fatto sia corretto?

posta DarkMantis 15.07.2014 - 17:30
fonte

3 risposte

5

Diversamente da unserialize , se si esegue json_decode da solo, non sarà in grado di istanziare qualsiasi tipo di variabile diverso da quelli semplici (es. array, string, int, float, ecc.), quindi è abbastanza sicuro eseguirlo con dati di input dell'utente.

Il problema nel codice è con la funzione e . Se i parametri che gli vengono trasmessi provengono da una fonte non attendibile come l'input dell'utente, alcuni utenti malintenzionati potrebbero semplicemente passare il nome di una funzione potenzialmente pericolosa presente nel codice, quindi e lo eseguirà e potrebbe danneggiare la tua applicazione. Non dovresti mai permettere che questo accada.

    
risposta data 16.07.2014 - 13:54
fonte
2

Sono l'autore della pagina OWASP su PHP Object Injection. Come già detto da Guilherme Sehn, json_decode non consentirà la deserializzazione degli oggetti e il codice snippet che hai pubblicato contiene una vulnerabilità che non riguarda PHP Object Injection. Quindi, penso sia corretto affermare che l'uso delle funzioni JSON è sufficiente per prevenire attacchi di iniezione di oggetti. Questo dovrebbe essere anche il motivo per cui qualche tempo dopo aver creato la pagina OWASP i ragazzi di PHP hanno aggiunto una nota sulla pagina di riferimento unserialize : link

    
risposta data 17.07.2014 - 14:54
fonte
1

Correzione per cosa?

Gli oggetti serializzati potrebbero essere utili, ma dovresti solo mai e poi mai unserialze() user-input ; questo fallirà e ci sarà un ragazzo più intelligente che troverà questa vulnerabilità.

La pagina OWASP è sbagliata IMHO. Jt dovrebbe solo emettere un grande avvertimento rosso: Non utilizzare unserialize sui dati utente!

O mi sbaglio qui?

    
risposta data 16.07.2014 - 08:58
fonte

Leggi altre domande sui tag