PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Exploiten von preg_replace - RegEx Injection - Remote Code Execution



Lidloses_Auge
20.04.2009, 21:23
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:


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.

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:


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:


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


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


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.


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:


echo preg_replace('/.*/e','strtoupper("$0")','${phpinfo()}');
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 13Durch 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.


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

VeN0m
20.04.2009, 21:33
Sehr schönes Tutorial gefällt mir... Wozu man preg_replace bzw. im allgemeinen die preg_-Befehle nutzt weiß ich. Aber wo findet diese Methode bzw. diese "Manipulation" Verwedendung? Oder wofür braucht man es? Hast Du da irgendwo ein Beispiel?

-=Player=-
20.04.2009, 21:40
man kann fast jeden beliebigen php code ausführen.
Sprich du könntest auch eine RFI einbauen und so eine Shell includen und dann vlt per LocalExploit in das system kommen.

VeN0m
20.04.2009, 21:46
Na das klingt doch sehr nützlich. Wieder was gelernt ;). Echt unglaublich, was es alles gibt...
Danke für das Tutorial Auge. Und danke für die Zusatzerklärung, Player. ;)

Lidloses_Auge
20.04.2009, 22:02
Ein wenig exotisches Wissen schadet doch nie, hoffe doch, dass es seine Anhänger finden wird.
Ansich aber eine sehr interessante Sache

VeN0m
21.04.2009, 14:52
Interessant ist sowas immer. Es ist immer wieder erstaunlich, auf was für Sachen man mit ein Wenig Logik doch kommt. Und Wissen, egal ob exotisch oder nicht kann selbstverständlich nie schaden. Irgendwann braucht man sowas bestimmt mal. Bietet ja sehr viele Möglichkeiten... :)