Questo utilizzo di PHP eval () è sfruttabile?

7

Durante una revisione del codice, ho trovato qualcosa di simile a questo:

function foo() {

        $a = "a";
        $expression = '$_GET["$a"]';

        return eval('return ('.$expression.');');
}

$a = foo();
echo $a;

Non importa le assurdità, l'esempio è semplificato e, a causa di cattive decisioni di progettazione, il cliente ha "veramente" bisogno dell'istruzione "return repal".

La mia ipotesi sarebbe no, perché $expression non è $_GET["$a"] , ma una stringa che rappresenta il nome della variabile, quindi l'argomento a eval() è equivalente a una "stringa di ritorno".

Ma secondo il manuale PHP:

You should never use parentheses around your return variable when returning by reference, as this will not work. You can only return variables by reference, not the result of a statement. If you use return ($a); then you're not returning a variable, but the result of the expression ($a) (which is, of course, the value of $a).

C'è un modo in cui questo potrebbe essere sfruttato?

    
posta Not Now 01.04.2018 - 04:56
fonte

1 risposta

6

Poiché si fa semplicemente eco a una variabile GET, questa vulnerabilità è XSS. Ma questo non ha nulla a che fare con il tuo uso di eval che prendo è l'obiettivo principale della domanda. Diamo un'occhiata a questo.

Se sostituisci eval(...) con echo ... , noterai che indipendentemente da ciò che passi, l'output sarà questo:

return ($_GET["$a"]);

Questo perché utilizzi ' e non " , quindi $expression non finisce per conteggiare il valore della variabile GET. Quindi non c'è nulla controllato dall'utente nell'espressione che stai valutando - Fondamentalmente è solo una costante. Non è pericoloso (dato che la costante stessa non contiene codice pericoloso), ma non è neanche esattamente utile. Potresti anche eliminare il eval .

Ma comunque ... Sarei nervoso se fossi responsabile di questo codice. Di certo sembra traballante e usa solo eval , non importa perché è un'enorme bandiera rossa. Inoltre, chissà cosa potrei aver perso in questa risposta.

    
risposta data 01.04.2018 - 09:23
fonte

Leggi altre domande sui tag