• 27.04.2024, 23:38
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

leuko

Senior Member

Include Per URL -> Validierung

Mittwoch, 27. Oktober 2004, 18:45

Ein Kollege hat bei einer Seite nicht wirklich an die Sicherheit gedacht und included fleissig per URL Seiten.

In Verbindung mit url_fopen ist dies ja nicht gerade sinnvoll (dezent ausgedrückt).

Die Frage ist nun wie er dies nun validieren kann damit kein Mißbrauch mehr möglich ist.
Meine Kentnisse im Hinblick auf PCRE sind recht bescheiden, habe auch keine Lust mich deshalb richtig einzuarbeiten.

Die übergebenen Werte sehen so aus:

"pfad/pfad/dateiname.xy"

Die Verzeichnisstiefe ist nicht immer gleich.

Lösungsvorschläge? :)

Re: Include Per URL -> Validierung

Mittwoch, 27. Oktober 2004, 19:01

ah, wegen dem fehler hab ich schon ein gutes halbes dutzend nicht ganz unbekannte (modding-)seiten auf den rücken gelegt. an dieser stelle ein tipp: benutzt NICHT euren vornamen als db-passwort :)

man kann das einbinden externer seiten ganz einfach verhindern, indem man den root-dir-pfad vorhängt und mit file_exists() im lokalen dateisystem prüft, ob die datei wirklich vorhanden ist. wenn man die endung .php an die url anhängt, lassen sich damit auch keine files ohne diese endung öffnen, z.b. /etc/passwd. zudem sollte man .. filtern. wenn man keine unterverzeichnisse benutzt, kann man auch / verbieten.

Re: Include Per URL -> Validierung

Mittwoch, 27. Oktober 2004, 19:13

wenn die seite net so sonderlich modular sein muss kann man auch ne switch abfrage machen

switch($_GET['seite'])
{
case news : include("files/xyz/news.php");
usw...
}

leuko

Senior Member

Re: Include Per URL -> Validierung

Mittwoch, 27. Oktober 2004, 19:16

Es muss modular sein da eine recht große Anzahl an Möglichkeiten besteht.
Das war auch mein erster Gedanke. :)

Die Gefahr das ein Bösewicht diese Schwachstelle nützt um an Passwörter zu kommen ist vermutlich nicht existent da der Apache in einer Jail Umgebung läuft.

Re: Include Per URL -> Validierung

Mittwoch, 27. Oktober 2004, 19:19

ich zitiere mal aus unserem text-modul:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (empty($_GET['text']))
            trigger_error('Kein Text ausgewählt.', E_USER_ERROR);

        // check for illegal strings
        if (false !== strpos($_GET['text'], '/etc/passwd'))
            trigger_error('Wow, you\'re a super l33t h4x0r, eh?', E_USER_ERROR);
        $illegalParts = array('/', '\\');
        foreach ($illegalParts as $illegalPart) {
            if (false !== strpos($_GET['text'], $illegalPart))
                trigger_error('Nicht erlaubte Zeichen gefunden.', E_USER_ERROR);
        }

        // check file existence
        $textfile = realpath($_SERVER['DOCUMENT_ROOT'] . $CFG['path_texts'] . $_GET['text'] . '.inc.php');
        if (! file_exists($textfile))
            trigger_error('Text nicht gefunden.', E_USER_ERROR);

        // load file
        include($textfile);

man sieht auch wieder deutlich: php suxxst zualleroberst.