¿La función eval () de PHP es vulnerable a la inyección de código cuando se ejecuta una cadena creada desde una matriz?

6

Estoy tratando de aprender más sobre la explotación de PHP eval () y me encontré con este escenario:

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

He intentado inyectar varias combinaciones de comillas dobles y barras invertidas en el parámetro $ _GET, pero no he tenido la oportunidad de romper la cadena $ cmd.

Más allá del error XSS, ¿es este fragmento de código vulnerable? ¿Se puede abusar de esto para la inyección de código PHP?

    
pregunta Robleh 10.01.2018 - 04:16
fuente

2 respuestas

5

No, esto no es vulnerable a la inyección de código PHP.

La cadena pasada a eval() simplemente no es controlada por el usuario. No hay ruta desde el origen $_GET["cmd1"] al receptor eval() :

  • El argumento para eval() es $cmd .
  • $cmd se ensambla a partir de una cadena fija y $params .
  • $params se acumula a partir de una cadena fija y $i .
  • $i es una variable de iteración que depende de la longitud (fija) de la matriz $text .

Dicho esto, pasar una matriz generada a través de eval no es un buen estilo y, obviamente, no estás limpiando la salida, lo que hace que el código sea vulnerable a XSS.

    
respondido por el Arminius 10.01.2018 - 04:49
fuente
1

El código que está evaluando aquí en realidad está completamente arreglado, por lo que aquí no es posible la inyección de código PHP.

El código que obtiene eval ed es siempre:

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

Hace referencia a esas variables como datos de cadena, que son seguros (excepto contra XSS).

    
respondido por el Alexander O'Mara 10.01.2018 - 04:49
fuente

Lea otras preguntas en las etiquetas