2012-09-28 9 views
11

Espero que alguien pueda responderme esto, ya que he tenido bastante curiosidad por hacerlo hace bastante tiempo, aunque no he podido obtener una respuesta. Sin embargo, estoy seguro de que alguien aquí podrá hacerlo ya que hay personas muy inteligentes aquí.

Ahora, a la pregunta. Usaré una vulnerabilidad de ejecución remota de comandos como ejemplo.

<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?> 

Para explotar este el atacante simplemente entrada {${phpinfo()}} por ejemplo. Mis preguntas son las siguientes:

  1. ¿Cuáles son los apoyos {} y por qué no se vea como una variable ?
  2. ¿Tiene un nombre de algún tipo? No creo que sea una función variable ya que son diferentes, ¿no?

¡Gracias!

+1

Oh, las llaves no son parte de la lista hasta ahora: [Referencia - ¿Qué significa este símbolo en PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol -mean-in-php) – hakre

Respuesta

8

Esta es Complex (curly) syntax.

funciones, las llamadas a métodos estáticos, las variables de clase, y la clase constantes de interior {} $ de trabajo a partir de PHP 5. Sin embargo, el valor al que se accederá será interpretado como el nombre de una variable en el ámbito en el que se define la cadena . El uso de llaves simples ({}) no funcionará para acceder a los valores de retorno de funciones o métodos o los valores de las constantes de clase o variables de clase estáticas.

Así, para una variable simple, sencillo {} va a funcionar, como "{$foo}", pero phpinfo() es una función, cuando se necesita para llamarlo, se necesitan dos {}, que tu ejemplo "{${phpinfo()}}", la cual llamará phpinfo() función.

Y esta es la razón por la modificador e es desalentado, por ejemplo, las imágenes de esta

{${eval($_GET['php_code'])}}, lo que da al atacante la posibilidad de ejecutar código PHP arbitrario y, como tal, le da un acceso casi completa a tu servidor.

En su lugar, para evitar esto, use preg_replace_callback().

Cuestiones relacionadas