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?
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()
:
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.
Le code que vous évaluez ici est en fait complètement corrigé, donc PHP n'est pas possible ici.
Le code qui obtient eval
ed 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).