2012-09-28 3 views
11

Spero che qualcuno possa rispondere a questa domanda perché sono stato abbastanza curioso da un po 'di tempo, ma non sono riuscito a ottenere una risposta. Tuttavia, sono sicuro che qualcuno qui sarà in grado di vedere come ci sono alcune persone molto intelligenti qui.

Ora, alla domanda. Utilizzerò come esempio una vulnerabilità di esecuzione di Remote Command Execution.

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

Per sfruttare questa l'attaccante avrebbe semplicemente inserire {${phpinfo()}} per esempio. Le mie domande sono le seguenti:

  1. Quali sono le parentesi graffe {} e perché fa apparire come una variabile ?
  2. Ha un nome di qualche tipo? Non credo che sia una funzione variabile dal momento che sono diversi, no?

Grazie!

+1

Oh, le parentesi graffe non fanno parte dell'elenco finora: [Riferimento: cosa significa questo simbolo in PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol php -mean-in-) – hakre

risposta

8

Questo è Complex (curly) syntax.

funzioni, chiamate di metodo, variabili di classe statiche, e la classe costanti di all'interno di lavoro {$} dal PHP 5. Tuttavia, il valore accessibile sarà interpretato come il nome di una variabile nell'ambito in cui è definita la stringa . L'utilizzo di singole parentesi graffe ({}) non funzionerà per l'accesso a i valori di ritorno di funzioni o metodi o i valori delle costanti di classe o variabili di classe statiche.

Così, per una variabile semplice, singolo {} funzionerà, come "{$foo}", ma phpinfo() è una funzione, quando è necessario chiamare, avete bisogno di due {}, che il vostro esempio "{${phpinfo()}}", che chiamerà phpinfo() funzione.

e questo è il motivo per cui il modificatore e è scoraggiati, ad esempio, l'imaging questo

{${eval($_GET['php_code'])}}, che dà l'attaccante la possibilità di eseguire codice PHP arbitrario e come tale gli dà l'accesso quasi completo al tuo server.

Per evitare questo, utilizzare invece preg_replace_callback().