¿Cuánto puede hacer / obtener un atacante en PHP con la ejecución de una función?

4

Estoy recopilando ideas para ilustrar un caso que he visto una vez, donde un atacante básicamente podría llegar a una situación simplificada de la siguiente manera (no es broma):

<?php
    $fcall = $_GET['fcall'];
    $fcall();
?>

phpinfo() es el primero en comenzar.

    
pregunta Anders 25.05.2016 - 06:42
fuente

2 respuestas

2

Uso de funciones PHP incorporadas

Con solo estas dos líneas, creo que es poco probable que puedas hacer mucho más que phpinfo, porque no parece posible pasar argumentos a la función, lo que reduce considerablemente tus opciones.

Parece que hay cierta confusión en los comentarios y otras respuestas, así que, para dejarlo claro: los valores de $_GET se tratan como cadenas, no como código PHP. Esto significa que ninguna de las opciones proporcionadas (funciones anónimas, ejecución de código arbitrario, usar "echo hello"->system , usar exec('rm -r /') ) funcionará.

Ni siquiera puedes filtrar otra información además de phpinfo, por ejemplo, get_current_user, ya que el resultado de la llamada no se repite.

Puede haber algunos casos oscuros de esquina que pueden considerarse vulnerabilidades. Por ejemplo, con ciertas configuraciones SSRF / DOS a través de ingres_connect puede ser posible (aunque extravagante).

Utilizando el código que lo rodea

Aparte de la fuga de phpinfo, eso significaría que necesitas explotar el código circundante. Algunas posibilidades podrían ser:

  • DOS a través de una función de llamada muy costosa
  • Omisión de autenticación
  • omisión del filtro
  • ...

Básicamente, el código le da control sobre el flujo de control de la aplicación, y eso es lo que necesita explotar.

Esto tampoco se limita a las funciones que solo se incluyen. Desde la versión 5.4.0, también puede llamar a los métodos de cualquier clase incluida:

fcall[]=MyClass&fcall[]=myFunction

Pero, de nuevo, no puede crear nuevos objetos a través de este código:

$_GET['fcall'] = array(new MyClass, "myFunction");
$fcall = $_GET['fcall'];
$fcall();

El problema es el mismo que antes: $_GET se trata como una cadena, por lo que no funciona tan pronto como el valor se pasa al servidor en lugar de codificado.

    
respondido por el tim 25.05.2016 - 11:36
fuente
0

La respuesta correcta es; realmente depende de tu código base .

Esto permitiría todo tipo de fallas lógicas. Aunque espero que no estés escribiendo aplicaciones bancarias en php, imagínate si lo hicieras y un atacante podría llamar repetidamente a approveLoan() o una función similar.

¿Qué pasaría si el atacante pudiera llamar a validateAdmin() para establecer un indicador de administrador en la sesión?

O llame a algo como imageConvert() que llama inseguramente a exec(convert $_POST['filename']....) pero no se puede explotar debido a la validación de entrada en upload.php.

La evaluación de los datos proporcionados por el usuario utilizando eval() o directamente en una función es generalmente una mala práctica de seguridad.

    
respondido por el wireghoul 30.05.2016 - 04:27
fuente

Lea otras preguntas en las etiquetas