web-dev-qa-db-fra.com

La fonction eval () de PHP est-elle vulnérable à l'injection de code lors de l'exécution d'une chaîne construite à partir d'un tableau?

J'essaie d'en savoir plus sur l'exploitation PHP eval () et je suis tombé sur ce scénario:

<?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);
?>

J'ai essayé d'injecter plusieurs combinaisons de guillemets doubles et de barres obliques inverses dans le paramètre $ _GET, mais je n'ai eu aucune chance de sortir de la chaîne $ cmd.

Au-delà du bogue XSS, cet extrait de code est-il vulnérable? Peut-on en abuser pour PHP injection de code?

7
Robleh

Non, ceci n'est pas vulnérable à l'injection de code PHP.

La chaîne passée à eval() n'est tout simplement pas contrôlée par l'utilisateur. Il n'y a pas de chemin entre la source $_GET["cmd1"] Et le récepteur eval():

  • L'argument de eval() est $cmd.
  • $cmd Est assemblé à partir d'une chaîne fixe et $params.
  • $params Est accumulé à partir d'une chaîne fixe et $i.
  • $i Est une variable d'itération qui dépend de la longueur (fixe) du tableau $text.

Cela dit, passer un tableau généré via eval n'est certainement pas un bon style et vous n'êtes évidemment pas en train de nettoyer la sortie, ce qui rend le code vulnérable à XSS.

5
Arminius

Le code que vous évaluez ici est en fait complètement corrigé, donc PHP n'est pas possible ici.

Le code qui obtient evaled est toujours:

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

Il fait référence à ces variables en tant que données de chaîne, ce qui est sûr (sauf contre XSS).

1
Alexander O'Mara