VULNERABILIDADES DE APLICACIONES WEB: INYECCIÓN DE CÓDIGO PHP EVALUADO DINÁMICAMENTE

29.12.2017 08:56
Si bien la inyección de código evaluado dinámicamente no es exclusiva del lenguaje PHP, usaremos el mismo para explicarla y ejemplificarla. En otro artículo sobre el tema veremos una vulnerabilidad asociada a la presente, la INYECCIÓN ESTÁTICA DE CÓDIGO.
 
Damos un ejemplo de inyección de código evaluado dinámicamente:
 
<?php
$string = $_GET['nombre']; 
eval ( "echo ". $string .";" );
?>
 
Si se ingresa como dato un nombre de usuario el mismo será impreso en pantalla. Si en cambio en la barra de direcciones del navegador escribimos lo siguiente: 
 
https://127.0.0.1/inyeccion_de_codigo/vulnerable.php?nombre=phpinfo();
 
encontraremos un cúmulo de información que convendría que permaneciera sin descubrir.
 
La función "eval()" evalúa una cadena como código de PHP, en este caso la cadena (en realidad función de opción) "phpinfo()" que muestra información sobre la configuración de PHP y una gran cantidad de información sobre el servidor, el sistema operativo y otros.
 
Tal como lo expresa el propio manual de PHP "el constructor de lenguaje eval() es muy peligroso porque permite la ejecución de código de PHP arbitrario. Su uso está totalmente desaconsejado. Si se ha verificado cuidadosamente que no existe otra opción que usar este constructor, se ha de poner especial atención en no pasar ninguna información proporcionada por el usuario a esta función sin haberla validado apropiadamente con anterioridad."
 
 
Pero el uso de "eval()" no es el único punto posible de este tipo de inyección de código. Daremos otro ejemplo que no agota ni remotamente todas las posibilidades. PHP permite diferentes formas de creación dinámica de funciones, una de ellas es ésta:
 
<?php
$f_dinamica = $_GET['f_dinamica'];
$argumento = $_GET['argumento'];
$f_dinamica($argumento);
?>
 
Bastará con tipear en el navegador la siguiente URL
 
https://127.0.0.1/injecciones-codigo/fucion-dinamica.php?f_dinamica=system&argumento=comando
 
donde comando puede ser cualquier comando como ls (o dir). La inyección de código se habrá convertido en una Inyección de Comandos, una vulnerabilidad extremadamente peligrosa.