Sicherheitsrisiko PHP

radarin

Angesehenes Mitglied
Hallo Liste.
Ich hatte die letzten beiden Wochenenden ungebetenen Besuch von Hackern. Während am letzten Sonntag nur die Startseite ersetzt und ein paar obskure Files im Hauptverzeichnis ersetzt wurden, so hat ein Hacker eine Woche zuvor sämtliche Files sammt Mailserver gekillt.

Selbstverständlich liegt das Sicherheitsproblem nicht beim Provider, sondern bei meinem wohl 'fahrlässige' Einsatz von PHP. Der Provider wirft mir vor, ich täte schliesslich alle Seiten includen. Ja sicher, schliesslich will ich meine Seiten mit möglichst wenig Aufwand unterhalten und das Ganze auch übersichtlich halten. So lade ich also immer die 'index.php' und inckude die Seite mit dem Inhalt über eine URL-Variable.

http://www.domain.ch/index.php?page=home

Das soll gefährlich sein? Kann ich eigentlich nicht richtig nachvollziehen wo da die Gefahr lauern soll. Dennoch muss der Hacker irgendwie reingekommen sein.

Eas kann ich denn machen um hier unerwünschen Zugriff zu verhindern..?

Thanks, René

 
Ist der PHP Safmode on?

Ich behaupte jedoch das es an deinem Hoster liegt, da er am Mailserver rumgefummelt hat. Oder was auch möglich ist, das jemand deine Passwörter kennt.
 
QUOTE http://www.domain.ch/index.php?page=home

Das soll gefährlich sein?

Das kommt darauf an, was du in der index.php mit dem $page machst.

Du solltest dringends in deinen Logfiles suchen, was der Hacker gemacht hat.
 
damit erlaubst du wahrscheinlich die ausführung von quasi beliebigem code mit welchem der übeltäter dann zugriffsrechte erlangen kann
 
Safmode on? keine Ahnung. Das FTP Passwort sollte sicher sein, unsinniger Buchstaben und Zahlensalat.

CODE
if(isset($HTTP_GET_VARS['page']))
{
 $page = $HTTP_GET_VARS['page'];
}
else
{
 $page = "home";
}

include($domain_root_path.$page.".".$phpEx);


In der 'index.php' wird das ganze Design drumherum definiert. Mit Include wird dann der Seiten Inhalt geladen, entweder nur HTML oder auch SQL.

Der Datenbank ist nix passiert, Mein FTP zeigt beim Login die Verzeichnisse "etc, mail, public_ftp, public_htm, tmp und www" an. Alle diese Verzeichnisse sind gelöschr worden. Nach Aussage des Providers musste der Server deshalb neu aufgesetzt werden. Datenverlust hatte ich keinen, nur alle eMail-Konten mussten manuell neu eingerichtet werden. Im Wesentlichen halt einfach Ärger und Aufwand.

Aber wo finde ich denn meine Logfiles..?
 
QUOTE Aber wo finde ich denn meine Logfiles..?

Das ist überall anderst...
 
Ein Stichwort das in diesem Zusammenhang gefallen ist: Variable Validieren, nur definierte Seiten sollen includet werden dürfen, manipulation der URL abfangen...

Aber wie?
 
Wenn Du nicht direkt die URL-Variable in den Include-String einsetzt, ist es sicherer. So kann jeder mit Probieren schauen, welche Dateien sonst noch in diesem Verzeichneis sind, z.B. config.php, admin.php oder db.php oder was auch immer.

Mach es mit einer switch-Abfrage. Ist halt Mehraufwand, wenn es viele Seiten sind aber du bestimmst, welche Seiten includet werden können.

Franz
 
und vielleicht ruft jm die includeten seiten auch separat auf? wenn du in der haupt-php-file passwort abfragen etc machst für die sicherheit, und danach die file includest, dann ist die includete file nicht selber pw geschützt, und per manuellem Öffnen kommt jeder rein! tipp: in der haupt-php-file eine globale var setzen:

define("IS_LOADED",1);

und dann in jeder includeten datei folgendes:

if(!isset(IS_LOADED)) {
die("Module duerfen nicht manuell geoeffnet werden!")
}

Gruss
Josh
 
Hallo

CODE include($domain_root_path.$page.".".$phpEx);Also diese Implementierng ist von mir aus recht sicher (sofern $domain_root_path nicht leer und und auf was lokales zeigt.). Gut, ein paar checks mehr oder der von Franz angesprochene switch wäre sicher nicht schlecht.

Ganz gefährlich wäre: inlcude($page);

Aber das Gute in deinem Fall: Da du die Parameter per GET übergibst, kannst du im Serverlog genau nachvollziehen, was der nette Mensch gemacht hat. Wenn der Server Linux als OS hat würd ich mal im /var/log/apache/* gucken gehen.

Gruss
Roger
 
sinnvoll wäre es, den Aufruf per mod_Rewrite so zu maskieren, dass man nicht mehr erkennt, dass es sich um einen php-get Aufruf handelt.

Also eine Regel wie diese hier:

RewriteRule ^([^/]*).html index.php?page=$1 [qsa]

und schon rufst du die Home-Seite mit "home.html" auf.

Dann kann kein Skript-Kiddie ohne weiteres erkennen, dass da php hintersteckt.

Und die Regel nimmt auch keinen Slash im Namen an ([^/]).

Gruß,
Ansgar
 
Ja danke, das mit der Seitenliste ist eine gute Idee, werde dies wahrscheinlich über ein Array lösen.
Im Adminbereich können selbst die Includeten Seiten ohne Session nicht geöffnet werden, das geht soweit ok, im Hauptbereich können sie allerdings einzeln angezeigt werden, was jedoch meist zu Fehlermeldungen führt, da Vatiablen aus der Index-Seite fehlen. Ich werde dennoch auch dieses noch abfangen. Gibt heute Abend also noch einiges zu tun.
Nur mit dem 'RewriteRule' blicke ich völlig nicht durch...

Gruss René
 
such nach "mod_rewrite tutorial" unter google, ist relativ einfach wenns du mal blickst.
 
Um zu verhindern dass die Include-Page ohne Index-Page geladen werden kann bin ich wie hier vorgeschlagen vorgegasngen. Mit ISSET klappt es allerdings nicht, genausowenig mit DEFINED. Folgende 2 Test mit deren Ausgabe:

CODE
//define("INDEX_IS_LOADED",1);
if(!defined (INDEX_IS_LOADED)) {
echo "Test: ";
echo INDEX_IS_LOADED;
}


Ausgabe:
Test: INDEX_IS_LOADED


CODE
define("INDEX_IS_LOADED",1);
if(!defined (INDEX_IS_LOADED)) {
echo "Test: ";
echo INDEX_IS_LOADED;
}


Ausgabe:
Test: 1

define steht in der index.php, if defined wird in einer includeten seite abgearbeitet...

Bei vorhandener Konstante dürfte es zu keiner Ausgabe kömmen.
 
Problem hat sich erledigt, musste um die Konstante noch Anführungszeichen setzen. Bei ISSET hatte auch das nix gebracht...
 
Zurück
Oben