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

30.12.2017 15:43
Ya vimos la inyección de código evaluado dinámicamente y la inyección estática de código. Antes de seguir adelante, sin embargo, queremos insistir en que el uso de "eval()" no es el único punto posible de de inyección de código evaluado dinámicamente. Vimos, por ejemplo, que PHP permite diferentes formas de creación dinámica de funciones y que ese era otro punto posible de inyección.
 
El objetivo de esta serie de artículos sobre vulnerabilidades web es mostrar que hay más que un puñado de ellas y que incluso las más comunes pueden ser explotadas de formas a veces muy poco conocidas. No es nuestra intención enseñar a atacar, por eso a menudo nos reservamos algunos ejemplos de explotación poco convencionales.
 
En lo que a la inyección de código evaluado dinámicamente concierne, en general se cree que la única función que puede traer problemas es "eval()". No es así, damos otro ejemplo más que no agota ni remotamente todas las posibilidades.
 
La función de opción "assert()" verifica si la aserción es FALSE:
 
assert('is_numeric(a)');
 
En el caso de arriba el parámetro "a" siempre debería ser un número.
 
Si el parámetro es proporcionado como una cadena será evaluado como código PHP. Entonces el siguiente código, no frecuente pero posible, es vulnerable: 
 
<?php
$foobar = $_GET['code'];
assert($foobar);
?>
 
La siguiente es una de las inyecciones posibles:
 
https://127.0.0.1/inyecciones_codigo/assert/ejemplo.php?code=phpinfo()
 
Quien sólo quiere ilustrarse un poco sobre el tema podrá ignorar estos casos pero quienes se dediquen a programar, a verificar el código de forma estática o dinámica y quienes realicen pruebas de penetración deberían ser conscientes de estas posibilidades, por raras que sean. Los piratas informáticos suelen ser ingeniosos, creativos y perseverantes y no es que los estemos alabando.