2012-09-28 8 views
11

Ich hoffe jemand kann das für mich beantworten, da ich schon ziemlich lange neugierig bin, aber anscheinend keine Antwort bekommen konnte. Ich bin mir aber sicher, dass hier jemand in der Lage sein wird, da es hier sehr intelligente Leute gibt.

Nun zu der Frage. Ich werde eine Sicherheitsanfälligkeit bei Remote-Befehlsausführung als Beispiel verwenden.

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

Um dies der Angreifer würde einfach Eingabe {${phpinfo()}} beispielsweise nutzen. Meine Fragen sind wie folgt:

  1. Was die Streben {} für sind und warum es wie ein Variable aus?
  2. Hat es einen Namen? Ich glaube nicht, dass es eine variable Funktion ist, da sie anders sind, nein?

Vielen Dank!

+1

Oh, geschweifte Klammern sind bisher nicht in der Liste: [Referenz - Was bedeutet dieses Symbol in PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol -mein-in-php) – hakre

Antwort

8

Dies ist Complex (curly) syntax.

Funktionen, Methodenaufrufe, statische Klassenvariablen und Klassenkonstanten innerhalb {$} Arbeit seit PHP 5. Der aufgerufene Wert wird jedoch als Name einer Variablen in dem Bereich interpretiert, in dem die Zeichenfolge definiert ist. Die Verwendung einzelner geschweifter Klammern ({}) funktioniert nicht für den Zugriff auf die Rückgabewerte von Funktionen oder Methoden oder die Werte der Klasse Konstanten oder statische Klassenvariablen.

Also, für eine einfache Variable, werden einzelne {} arbeiten, wie "{$foo}", aber phpinfo() ist eine Funktion, wenn Sie es nennen müssen, benötigen Sie zwei {}, die Ihr Beispiel "{${phpinfo()}}", die phpinfo() Funktion aufrufen wird.

Und deshalb die e Modifikator entmutigt zum Beispiel Bildgebung diese

{${eval($_GET['php_code'])}}, die dem Angreifer die Möglichkeit, Code auszuführen, beliebigen PHP gibt und als solche gibt ihm fast vollständigen Zugriff auf Ihre Server.

Um dies zu verhindern, verwenden Sie stattdessen preg_replace_callback().