La funzione eval () di PHP è vulnerabile all'iniezione di codice quando si esegue una stringa creata da un array?

6

Sto cercando di saperne di più sullo sfruttamento di eval () di PHP e mi sono imbattuto in questo scenario:

<?php

$test = array();
$test[0] = "command0 ";
$test[1] = $_GET["cmd1"];
$test[2] = "command2 ";
$test[3] = "command3 ";

$params = "";
for ($i = 0; $i < count($test); $i++) {
        $params .= "\$test[$i]";
}

echo $params;
echo "<br>";

$cmd = "echo \"" . $params . "\";";
echo $cmd;
echo "<br>";

eval($cmd);
?>

Ho provato a iniettare diverse combinazioni di virgolette e barre rovesciate nel parametro $ _GET ma non ho avuto fortuna a rompere la stringa $ cmd.

Al di là del bug XSS, questo frammento di codice è vulnerabile? Questo può essere sfruttato per l'iniezione di codice PHP?

    
posta Robleh 10.01.2018 - 04:16
fonte

2 risposte

5

No, questo non è vulnerabile all'iniezione di codice PHP.

La stringa passata a eval() non è semplicemente controllata dall'utente. Non esiste alcun percorso dalla sorgente $_GET["cmd1"] al sink eval() :

  • L'argomento su eval() è $cmd .
  • $cmd è assemblato da una stringa fissa e $params .
  • $params è accumulato da una stringa fissa e $i .
  • $i è una variabile di iterazione che dipende dalla lunghezza (fissa) dell'array $text .

Detto questo, passare un array generato tramite eval non è certamente di buon livello e ovviamente non stai disinfettando l'output che rende il codice vulnerabile a XSS.

    
risposta data 10.01.2018 - 04:49
fonte
1

Il codice che stai valutando qui è in realtà completamente risolto, quindi l'iniezione del codice PHP non è possibile qui.

Il codice che ottiene eval ed è sempre:

echo "$test[0]$test[1]$test[2]$test[3]";

Fa riferimento a tali variabili come dati stringa, che è sicuro (tranne che contro XSS).

    
risposta data 10.01.2018 - 04:49
fonte

Leggi altre domande sui tag