Mozz : und PHP <- geht das überhaupt?

Beitrag lesen

Nochmal Aloha!

  1. Aufrufen eines externen Systemkommandos:
    Dazu kennt PHP die Kommandos passthru(), popen() und den Backtick-Operator. exec() und system() sind eher ungeeignet, um Massenoutput durchzureichen.

Auch hier gilt: Extreme Vorsicht mit User-Input. Bei dieser Variante kann der User es u.U. schaffen, beliebige Kommandos (evtl. zusätzlich) auf dem Server auszuführen. "rm -rf *" reicht evtl. schon, um deine Präsenz zu löschen.

Hi Sven!

Ich selbst habe (leider) keine shell-Zugang und nach
<?php passthru("rm test.php"); ?>
war die Datei test.php immer noch da, rm -rf * hab' ich lieber nicht probiert ;-), sollte dann aber auch nicht gehen.

Ich habe als Usereingaben "nur" die Parameter var1, var2, usw.
<?php passthru("../cgi-bin/script.cgi?var1=xx&var2=yy"); echo "\n"; ?>

D.h. ../cgi-bin/script.cgi? kann userseitig nicht verändert werden nur die Parameter danach. Bisher dachte ich mir das so: Der User gibt in ein Formular ein Suchwort ein und legt Optionen fest (z.B. Case Sensitive). Dies geschieht bisher noch über das Perl-Script, würde ich dann aber über PHP realisieren. Danach würde ich das Perl-Script mit

<?php passthru("../cgi-bin/script.cgi?var1=xx&var2=yy");

füttern. Allerdings habe ich gerade beim Testen entdeckt, dass

<?php passthru("../cgi-bin/script.cgi?terms=test"); ?>
nicht funktioniert :-(

wohl aber
<?php passthru("../cgi-bin/script.cgi"); ?>

also ohne die Parameter geht es, mit nicht, gibt es hier Probleme mit der Variablenübergabe an Perl? Verstehe es nicht, dass

../cgi-bin/script.cgi?terms=test über passthru() nicht geht, aber der direkte Aufruf über
http://www.test.de/cgi-bin/script.cgi?terms=test ohne Probleme möglich ist. Cheatah hat ja etwas vom Perl-Modul CGI.pm geschrieben, dass zur Parameterübernahme nötig ist, kann es sein, dass es bei lokalem Zugriff (also nicht über http) zu Problemen kommt?

Nun, jedenfalls würde ich das so realisieren, wenn ich den Fehler noch finde. Gäbe es bei dieser Lösung für den User eine Möglichkeit bei geschickter Wahl der "Suchbegriffe" den an passthru übergebenen String so zu verändern, dass neben dem CGi-Script ein weitere Befehl abgesetzt werden kann? Das würde schon mal voraussetzen, dass passthru() auch mehrere Kommandos ausführen kann, ist das so?

Nur mal als gedankliches Beispiel:

Normale Usereingabe: Suche nach >SelfHTML Forum<
erzeugte URL:
<?php passthru("../cgi-bin/script.cgi?terms=%22SelfHTML+Forum%22"); ?>

"Feindliche" Usereingabe: Suche nach >", "rm -rf *"<
erzeugte URL:
<?php passthru("../cgi-bin/script.cgi", "rm -rf *"); ?>

Wie gesagt, ich weiß nicht, ob es mit passthru() möglich ist mehrere Befehle auszuführen [link:http://www.php.net/manual/en/function.passthru.ph spricht auch nur von einem Befehl, wenn ein Rückgabewert möglich ist, geht das vermutlich auch nur mit einem Befehl.

Noch eine grundsätzliche Frage: Würde bei solchen Dingen generell auch ein urlencode reichen, damit der Sting innerhalb von "" ("string") nicht "durchbrochen" wird oder sind da weitere Überprüfungen notwendig?

Mozz