¿Se puede explotar este uso de PHP eval ()?

7

Durante una revisión de código, he encontrado algo similar a esto:

function foo() {

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

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

$a = foo();
echo $a;

No importa el disparate, el ejemplo está simplificado y, debido a las malas decisiones de diseño, el cliente "realmente" necesita la instrucción "devuelva eval".

Mi conjetura sería no, porque $expression no es $_GET["$a"] , sino una cadena que representa el nombre de la variable, por lo que el argumento de eval() es equivalente a una "cadena de retorno".

Pero de acuerdo con el manual de PHP:

  

Nunca debe usar paréntesis alrededor de su variable de retorno cuando devuelva por referencia, ya que esto no funcionará. Solo puede devolver variables por referencia, no el resultado de una declaración. Si usa return ($a); , entonces no está devolviendo una variable, sino el resultado de la expresión ($a) (que es, por supuesto, el valor de $a ).

¿Hay alguna forma de explotar esto?

    
pregunta Not Now 01.04.2018 - 04:56
fuente

1 respuesta

6

Como acaba de repetir una variable GET, esto es vulnerable a XSS. Pero eso no tiene nada que ver con su uso de eval , lo que tomo es el enfoque principal de la pregunta. Así que echemos un vistazo a eso.

Si reemplaza eval(...) con echo ... , notará que no importa lo que pase, la salida será esta:

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

Esto se debe a que utiliza ' y no " , por lo que $expression no termina conatine el valor de la variable GET. Por lo tanto, no hay nada controlado por el usuario en la expresión que está evaluando; básicamente es una constante. Eso no es peligroso (dado que la constante en sí misma no contiene código peligroso), pero tampoco es exactamente útil. También deberías soltar el eval .

Pero aún así ... estaría nervioso si fuera responsable de este código. Seguro que se ve inestable, y solo usando eval no importa por qué es una gran bandera roja. Además, quién sabe lo que podría haberme perdido en esta respuesta.

    
respondido por el Anders 01.04.2018 - 09:23
fuente

Lea otras preguntas en las etiquetas