Verschiedene Sicherheitsmechanismen in PHP | Teil 1

Einleitung

Man will in PHP seine Webseite programmieren, dann gehört
ebenso eine gewisse Menge an Sicherheit dazu. Man möchte doch
auch wenn man als Beispiel ein Community Portal programmiert
Datenschutz garantieren können, richtig?

Dann ist der Punkt Sicherheit das A&O und wo sollte man denn
zu erst ansetzen wenn nicht beim Fronted Teil der [[CMS]]?

Nun es gibt viele Ansatzpunkte wo man sich um die Sicherheit
seiner CMS kümmern sollte. Das wichtigste ist allerdings,
dass man sich nicht um die Sicherheit dann kümmert, wenn die Software
soweit fertig gestellt ist. Sondern sich schon einige Gedanken für
die Sicherheit im Vorfeld macht und diese auch gleich direkt bei
der Programmierung der CMS sofort wenn der jeweilige Zeitpunkt es
zulässt umsetzt.

Nun fangen wir doch hier einmal mit einigen einfachen Code-Beispielen
an die einigen anderen sicherlich bekannt kommen werden.

Szenario 1:

Man hat ein Menü in seiner CMS für die Navigation.
Über die Navigation soll es möglich sein in die bereits geschaffene
Template-Vorlage den Inhalt eines DIV-Elementes zu ändern.
Man möchte hierbei auf GET-Parameter setzen.

Nun einige denken sich nun ist doch easy und kommen auf die Idee einen
3 Zeiligen Quelltext zu schreiben mit der die angegebene Seite sei es
Home, Guestbook, Imprint oder sonst was ist includen, like:


Nun vom Prinzip her ist das doch eigentlich eine „elegante“ Lösung?
Verschiebt man alle Files mit Inhalten die man möchte in den Ordner „pages“
und erspart sich somit jede Menge Erweiterungsarbeit denn schließlich wird
nur das included was auch wirklich in dem Ordner pages ist und auch wirklich existiert?

Falsch!

Auch wenn wir statisch die Dateiendung „php“ mitgeben, lässt sich 1. dies bypassen
und 2. lassen sich ebenfalls auch files includen die nicht im Ordner „pages“ liegen.

Nehmen wir mal ein ganz fahrlässiges Szenario an:

Wir haben in unserem System 2 Ordner und eine index.php
Einmal den Ordner „includes“ und einmal den Ordner „pages“.
In Pages werden die Files gespeichert wie wir eigentlich includen möchten und im Ordner
Include liegt eine Config-Datei mit dem Namen „mysql_config.inc“.

Unsere Index-File enthält das oben gezeigte PHP-Beispiel und beide Ordner
sind mit einer htaccess vor Zugriffen von außen geschützt -> deny from all.

Die file „mysql_config.inc“ enthält unsere sehr geheimen MySQL-Daten.
Im Ordner „pages“ hingegen liegt eine Home.php und eine guestbook.php.

Die „mysql_config.inc“ enthält den folgenden Inhalt:

$dbhost = "localhost";
$dbuser = "userxyz";
$dbpass = "sehr_geheim";

$dbname = "meinedatenbank";

In den restlichen Dateien „guestbook.php“ und „home.php“ sind andere für jeden
bestimmte Inhalte zu sehen.

Nun öffnen wir in unserem Webbrowser doch einmal die Homeseite.
Schön und gut, alles wird wunderbar angezeigt.

Und nun rufen wir mal die Index-File mit einem etwas anderen Parameter ab:

Hoppla, was sehen wir da. Die MySQL-Daten die doch niemand sehen darf.
Wir haben die Daten doch mit einer htaccess geschützt und explizit ein bestimmtes
Verzeichnis angegeben, von dem sich das Script die files holen darf.

Was ist denn hier passiert?

Nun mit „../“ oder „./“ lassen sich ein oder mehrere unbekannte Verzeichnise angeben
im Dateipfad.

Kurze Übersicht:

"../" = Gehe ein Verzeichnis zurück
"./" = Bleibe in diesem Verzeichnis

Wenn wir uns nun unseren Include den wir hier tätigen denken sieht der wie folgt aus:


Prinzipiell müsste hier doch eigentlich ein Fehler auftreten?
Was bedeutet dieses „%00“ und warum funktioniert das includen doch?

Nun das sind viele Fragen die man sich hier nun stellen könnte. Aber prinzipiell ist
das ganze einfach zu erklären.
„%00“ ist ein Nullbyte welches wir an den GET-Parameter gehangen haben. Wenn das Nullbyte
bei einem Include-Vorgang oder einer anderen Funktion im Dateinamen enthalten ist, wird dadurch alles was hinter diesem
Nullbyte folgt ignoriert.

Dadurch lassen sich eben auch statische Inhalte im Quelltext aus dem String kürzen.
Deshalb ergibt sich aus unserem Include auch bildlich gesehen dieser Code:


Was eben dem entspricht:


Nun jetzt kann man sich überlegen wie man das stattdessen lösen könnte.
Nun da gibt es genug weitere Möglichkeiten. Eine Möglichkeit davon ist die Verwendung von
Switch-Case Blocks:


Dies war’s für’s erste. Hiermit sind wir mit dem Thema Local File Includes (kurz LFI) durch.
Weiteres folgt später 😉

Leave a Reply