PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: PHP + PERL + /bin/bash



heurika
11.09.2006, 13:06
Hallo,
ich bin dabei ein kleinen Adminpanel zu schreiben.
Der Pannel ist mit PHP programmiert und hat genügend Rechte um über system();
ein Perl Script im Ordner /home/programme aufzurufen.

Hier mal das Beispiel:
/srv/www/htdocs/confixx/html/admin.php ruft über system(); > /home/programme/admin.pl auf.
Dieses wiederrum führt ein paar Perl Befehle aus und zusätzlich ruft es auch über System(); einen Kopier Befehl auf:
cp -R /ordnera /ordnerb

Das Problem jetzt, wenn ich nur das Perl Script aufrufe dann kopiert er den Ordner.

Wenn ich das PHP Script aufrufe führt er das Perlscript aus und gibt auch die Meldungen aus, aber es kopiert nicht den Ordner, warum?

Darf man ineinander nicht system aufrufen?
Oder muss ich beim 2. System Aufruf was beachten?
zzt rufe ich das Perl Script so auf:

>>>>>>>>>>>>>
sub vorgang {
system("
#!/bin/bash
cp -R /ordnera /ordnerb
");
}
vorgang();
<<<<<<<<<<<<<

Danke!

caba
11.09.2006, 13:49
Wenn das kein murgs ist was du da machst weiss ich auch nicht.

exec() und system() sind generell schonmal böse[tm]
und will man nicht benutzen.

Wenn es unbedingt sowas sein muss nutze die Filesystem funktionen von PHP. Wobei du dann darauf achten musst das das script mit rechten des Webservers ausgeführt wird.

Ansonsten nutze cgi um Shell/Perl/* -Scripts aufzurufen.

theton
11.09.2006, 14:07
Jo, das ist definitiv Murks, was da entsteht. However, nicht mein Rechner, dem da gerade Sicherheitsluecken implementiert werden. Gehe ich recht in der Annahme, dass das PHP-Skript ueber einen Webserver aufgerufen wird? Wenn ja, solltest du dafuer sorgen, dass der Webserver-User (und somit der User, der das PHP-Skript ausfuehrt) auch ausreichende Rechte auf Quellordner (mindestens Leserechte) und Zielordner (hier braucht er Schreibrechte) hat.
Ausserdem kannst du "#!/bin/bash" in einem system()-Aufruf gleich mal vergessen. system() selbst interpretiert keine Shellskript-Anweisungen. Ein einfaches system("cp -R /ordnera /ordnerb") sollte es auch tun.

heurika
11.09.2006, 15:28
hab gemerkt das es auch vollkommender sicheitsgefährdender schwachsinn ist :oldman.
Ich habe eine andere Methode überlegt,
PHP Script schreibt es in die MySQL DB.
Ein Cron unter root läuft durch der die "Aufträge" die in der Datenbank stehen bewältigt. Somit kann auch kein user eine Injection machen ;)

greetz

theton
11.09.2006, 15:47
Macht man halt ne SQL-Injection und beim naechsten Durchlauf des Cron wird der Kram ausgefuehrt, sofern dein Cron das nicht alles nochmal explizit durchcheckt. However, unsicher wird es bei deinen unzureichenden Scripting-Kenntnissen (sorry, aber den Eindruck macht das nunmal hier) wahrscheinlich trotzdem. Vielleicht erstmal mit was einfachem ueben, bevor du dich an ein Tool setzt, dass zum Steuern eines Rechners eingesetzt werden soll (wenn ich das "Adminpanel" so richtig verstanden habe).

heurika
11.09.2006, 18:56
SQL-Injection wird schwer zu machen Sein.
Beim anlegen des Eintrages wird die Syntax gecheckt Diese darf nur so sein:
3x kleinbuchstaben + bis zu 10 zahlen, restliche wird als falsch deklariert.
wobei diese syntax zuvor schon von der Datenbank ausgelesen wird und somit nicht per GET oder POST manipulierbar ist. Der User selbst kann nur eine Zahl definieren die als Auswahl von radiobuttons zu sehen sind.
( ) Auswahl 1
( ) Auswahl 2
( ) Auswahl 3
......
diese Variable wird auch per Post ausgelesen und per is_numeric gecheckt ob es eine Zahl ist. Wobei die Zeile der Auswahl in der DAtenbank eh als INT(3) definiert ist. Daher würde ich mich wundern wie der User eine Injection zu stande bekommt. Beim Eintrag von USER[varchar] & AKTION[int]. Um die User Variable zu manipulieren muss der Angreifer erstmal Confixx überlisten da die Variable über Confixx übergeben wird.

Jo bezüglich des Scriptes, es Funktioniert so wie bei #4 beschrieben ;)