Alfred: Sicherheit

Hallöchen,

aufmerksam geworden durch

[pref:t=71856&m=413780]

hab ich da mal folgende Frage:

Ich lasse mir meine Seiten per php aus einzelnen htm-Fetzen zusammenbauen und hänge die dazu notwendigen Parameter frank und frei an die jeweiligen links an, also z.B.

<a href=show.php?q=0001 0002 0003>link</a>".

Das php-Skript ergänzt die Parameter (letztlich sind es natürlich Dateinamen) um ".htm", holt sich die einzelnen htm-Fetzen aus einem Unterverzeichnis und spuckt sie per "include" wieder aus. Beispielhaft:

<?php
$files = $_GET['q'];
$files = split("[ ]",$files);
$anz = count($files);

for ($i=0; $i<$anz; $i++){$files[$i] = "./unterverzeichnis/".$files[$i].".htm";}

foreach($files as $a){include($a);}
?>

Was anderes wäre es natürlich wenn es z.B. hieße

<?php
$files = $_GET['q'];
include ($files);
?>

da könnte ja ein Bösewicht eine fremde URL anhängen und das Script mit dieser aufrufen.

Jetzt also die Frage :

Ist die obige Variante auch so grob fahrlässig wie die untere? Wenn ja was habe ich dann nicht verstanden? Das Script tut doch nichts anderes als aus einem serverseitigem Unterverzeichnis htm-Code zusammenzubasteln und zu verschicken. Parameter mit denen das Script nichts anfangen kann dürften doch auch keinen Schaden anrichten, außer einer Fehlermeldung vielleicht...

Oder ?

Beste Grüsse,

Alfred

  1. Moin,

    Ist die obige Variante auch so grob fahrlässig wie die untere?

    Ja. Was passiert etwa wenn jemand ../../../datei als Datei übergibt? ../../../etc/passwd ist zum Beispiel beliebt, da es die Benutzerdatenbank des Systems (in der Regel) enthält. Die Anzahl der ../ muß natürlich entsprechend angepasst werden.

    Bei solchen Gelegenheiten willst du _immer_ basename() auf die Dateinamen anwenden um sicherzustellen, dass es wirklich Dateinamen ohne Verzeichnisteil sind (oder eine äquivalente Prüfung).

    --
    Henryk Plötz
    Grüße aus Berlin
    ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
    1. Hallo Henryk,

      Danke für die Antwort. Daß Unterverzeichnisse mit entsprechenden "../" umgangen werden können hätte mir eigentlich auch selber einfallen können.

      Ich habs aber mal eben online ausprobiert; mit einem hochgradig fahrlässigen Script wie

      test.php :

      <?php
      $files = $_GET['q'];
      include ($files);
      ?>

      und diversen Aufrufen

      http://domain.de/test.php?q=www.anderedomain.de oder

      http://domain.de/test.php?q=http://www.anderedomain.de

      etc.

      gelang es mir _nicht_ das test.php zur Anzeige von anderen WebSites zu zwingen. Es kamen immer nur php-Fehlermeldungen. Verweise auf Domain-eigene Dateien klappten aber.

      Kann es also sein daß der Provider schon von sich aus verhindert das solche Script-Konstruktionen funktionieren? Daß also für "include" nur _lokale_ Dateien erlaubt sind und keine URLs?
      (Bin bei Strato, Premium-L-Paket)

      Wäre ja schön, dann bräuchte ich mich um nix zu kümmern...Oder hab ich mich zu dämlich angestellt um das Horror-Szenario zu simulieren?

      Nicht daß hier falsche Eindrücke entstehen: Ich will solche Angriffe nicht erzeugen sondern mich davor schützen - aber um das zu erreichen müsst ich erst mal wissen wie diese überhaupt funktionieren...

      Besten Gruß,

      Alfred

      1. Hello,

        Ich habs aber mal eben online ausprobiert; mit einem hochgradig fahrlässigen Script wie

        test.php :

        <?php
        $files = $_GET['q'];
        include ($files);
        ?>

        und diversen Aufrufen

        gelang es mir _nicht_ das test.php zur Anzeige von anderen WebSites zu zwingen. Es kamen immer nur php-Fehlermeldungen. Verweise auf Domain-eigene Dateien klappten aber.

        http://domain.de/test.php?q=www.anderedomain.de oder

        Hier fehlt das Protokoll

        http://domain.de/test.php?q=http://www.anderedomain.de

        Der Parameteranteil muss url-codiert werden. Der Server decodiert ihn dann automatisch. In $_GET steht dann wieder http://www.anderedomain.de

        http://domain.de/test.php?q=http:%2F%2Fwww.anderedomain.de

        Und so müsste es dann gehen.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    2. Hello,

      Ist die obige Variante auch so grob fahrlässig wie die untere?

      Ja. Was passiert etwa wenn jemand ../../../datei als Datei übergibt? ../../../etc/passwd ist zum Beispiel beliebt, da es die Benutzerdatenbank des Systems (in der Regel) enthält. Die Anzahl der ../ muß natürlich entsprechend angepasst werden.

      Die Anzahl der Rückschritte ( ../ )muss nur groß genug sein, sie darf aber gerne größer sein, als eigentlich möglich ist. Weiter als bis / geht das System nicht zurück im Pfad und zählt dann den wertigen Anteil von dort brav wieder hoch. Probiers mal aus.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen