[PHP] Download Script auf Sicherheitslücken testen

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Nippel, 3. August 2010 .

  1. 3. August 2010
    Download Script auf Sicherheitslücken testen

    Hallo Mädels,

    ich hab' mir mal vor geraumer Zeit ein Download-Script schreiben lassen in PHP. Wie einfach ist es, dies auf potentielle Sicherheitslücken zu testen?

    Besten Dank für die Antworten.

    Freundliche Grüße

    Nippel
     
  2. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Du kannst einmal ganz einfach gucken, ob die $_GET und wenn vorhanden $_POST-Variablen überprüft werden, ob sie zB ', " oder ähnliche Zeichen enthalten..
    Funktionen, die zur Überprüfung genutzt werden sind u. a.:
    PHP: mysql_real_escape_string - Manual => Kommentiert ' aus, sodass diese nicht eine vorgegange ' schließen können
    PHP: intval - Manual => Konvertiert einen String in einen Integer..

    MfG
     
  3. 3. August 2010
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Download Script auf Sicherheitslücken testen

    du kannst ja gleich mal das hier testen ^^

    dann solltest du noch prüfen on man die files hotlinken oder über LFI einbinen kann, so lässt sich nämlich u.u php-code ausführen (z.b. ne shell).

    LFI solltest du aber grundsätzlich überall prüfen. hab damit selber schon geschlampt und wurde (zum glück) von nem freundlichen user darauf hingewiesen.
     
  4. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Kann ich das nicht einfach verhindern, indem ich den PHP Parser via htaccess in dem Image Ordner wo die Bilder liegen ausschalte?
     
  5. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    das hilft gegen hotlinks, aber nicht gegen LFI, weil der php-parser ja bereits läuft wenn die datei included wird
     
  6. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Eii hast recht da hab ich was vertauscht. ^^

    Wenn man jetzt z.b. ne Seite hat die wirklich viele Dateien beinhaltet und man dafür nicht ein einzelen Case für das Includen erstellen will, wie sieht es aus mit der Methode, dass man die PHP Dateien in seinem Ordner ausliest und mit der $_GET Variable abgleicht. Ist keine Datei auf dem Server die so heißt, gibt es ein exit();

    Ist das zu Serverlastig?
     
  7. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    ja im vergleich zur try-error methode auf jeden fall:

    PHP:
    <? php

    $file 
    = !empty( $_GET [ 'file' ]) ?  $_GET [ 'file' ] :  'main' ;
    $file  get_word ( $file 'main' );

    if(!
    file_exists ( 'includes/'  $file  '.php' ))
        
    $file  'main' ;
        
    include 
    'includes/'  $file  '.php' ;

    // ------------------------------------

    function  get_word ( $str $fallback ) {
        
    $str  str_replace ( chr ( 0 ),  '' $str );
        if(
    preg_match ( '/^[a-zA-Z_0-9\-]+$/' $str ))
            return 
    $str ;
            
        return 
    $fallback ;
    }
     
  8. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Gegen LFI hilft auch einfach basename:
    PHP:
    $filename  basename ( $_GET [ 'file' ]);
    $filename  = ( is_file ( 'files/' . $filename . '.php' ) ?  $filename  'index' );
    include(
    'files/' . $filename . '.php' );
     
  9. 3. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Hi,

    es geht hier nicht um ein Up- und Download-Script, sondern einfach um ein Script, dass von mir angegebene Dateien zum Download anbietet und die Downloads zählt. Nicht mehr, nicht weniger.
     
  10. 4. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Das ist ja erstmal irrelevant..
    Sicherheitslücken kann jedes Script haben, was in irgendeiner Weise eine Eingabe vom User annimmt und verarbeitet..
    Sei es GET, POST oder gar Cookies...
    Diese musst du überprüfen, ob der User schadhafte Werte übergeben kann..

    Wenn du keine Datenbank im Hintergrund hast, musst du dir ja zB über SQL-Injections keine Sorgen machen..
    Aber wie gesagt.. LFI und RFI sind bei Dowloadscripten dein Feind..
    Und XSS könnte auch noch eine Rolle spielen..

    MfG
     
  11. 4. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Hallo,

    genau das ist der Punkt. Es werden keine Eingaben gemacht. Lediglich ein Link muss angeklickt werden, damit die Datei runtergeladen werden kann. Upload erfolgt durch meine Wenigkeit via FTP-Server.
     
  12. 4. August 2010
    AW: Download Script auf Sicherheitslücken testen

    aha und wir sollen jetzt raten wie das script funktioniert?

    meine glaskugel meint: index.php zeile 7 solltest du dir mal genauer ansehen!

    ------------------------

    mehr als allgemeine tipps kann man dir nicht geben. gib dich damit zufrieden oder poste dein script hier.
     
  13. 4. August 2010
    AW: Download Script auf Sicherheitslücken testen

    und es ist doch relevant, wenn der download link z.B. so aussieht "http://addr.domain?id=1231" ...
    genau dort gibts möglichkeiten für injektions etc. darum sollte man, wie schon angegeben Get-variablen prüfen etc.
     
  14. 5. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Hallo zusammen,

    anbei noch das betroffende Script.

    PHP:
    <? php
        
    // *****************************************************************
        // 1. Download Progress
        
    function  makeDownload ( $file $dir $type ) {
            
    header ( "Content-Type:  $type " );
            
    header ( "Content-Disposition: attachment; filename=\" $file \"" );
            
    readfile ( $dir  $file );
        }
        
        
    $mime  = array(
            
    "zip"  =>  "application/zip" ,
            
    "rausgenommen"  =>  "text/plain" ,
            
    "rausgenommen"  =>  "text/plain"
        
    );
        
        
    $file  $_GET [ "file" ];
        
    $dir  "files/" ;
        
        
    $filetype  explode ( "." $file );
        
    $type  $mime [ $filetype [ count ( $filetype )- 1 ]];
        
        
    // let's say unknown file types are text-only ...
        
    if (empty( $type ))  $type  "text/plain" ;
        
        
    // *****************************************************************
        // Security fix for /etc/password hacking tries
        
    $file_temp  explode ( "/" $file );
        
    $file  $file_temp [ count ( $file_temp )- 1 ];
        
        
    // *****************************************************************
        // 2. Download Counter
        
    $counterfile  "counter/"  $file  ".txt" ;
        
        if (
    file_exists ( $counterfile ))
        {
            
    $fp  fopen (& $counterfile "r+" );
            
    $calls  fgets (& $fp );
            
    $calls ++;
            
    rewind (& $fp );
            
    flock (& $fp 2 );
            
    fputs (& $fp , & $calls );
            
    flock (& $fp 3 );
            
    fclose (& $fp );
        }
        else
        {
            
    $fp  fopen (& $counterfile "w" );
            
    $calls  "1" ;
            
    fputs (& $fp , & $calls );
            
    fclose (& $fp );
        }

        
    // *****************************************************************
        // DO IT!
        
    if (!empty( $file ) && ! preg_match ( '=/=' $file ))
            if (
    file_exists ( $dir  $file ))
                
    makeDownload ( $file $dir $type );
    ?>
     
  15. 5. August 2010
    AW: Download Script auf Sicherheitslücken testen

    das is alles? wegen den paar zeilen ^^

    also ich hab keine sicherheitslücken gefunden. is zwar ein wenig schlampig programmiert aber läuft.
     
  16. 5. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Hallo,

    das ist nicht alles. Lasse Dir aber gerne den restlichen Code per private Nachricht zukommen. Ihr spracht von GET und Co. und der kommt nun einmal darin vor.

    PHP:
    <? php
        
    // (c) by mir
        // angepasst für Diese-Seite 2008
        
    class  FileFunctions  {        
            function 
    GetTimestamp ( $filename ) {
                if (!
    is_file (& $filename )) {  // should never happen!
                    
    global  $ehandle ;
                    
    $ehandle -> ErrorOccured ( "GetTimestamp" $filename "Datei nicht gefunden" );
                }
                
                
    $timestamp  filemtime (& $filename );
                
    $timestamp  gmdate ( "d M Y" $timestamp );
                
                
    clearstatcache ();
                return 
    $timestamp ;
            }
            
            function 
    GetFilesize ( $filename ) {
                
    $i  0 ;
                
    $suffix  = array(
                    
    "Bytes" ,
                    
    "KB" ,
                    
    "MB"
                
    );
                
                if (!
    is_file (& $filename )) {  // should never happen!
                    
    global  $ehandle ;
                    
    $ehandle -> ErrorOccured ( "GetFilesize" $filename "Datei nicht gefunden" );
                }
                
                
    $filesize  filesize (& $filename );
                while (
    $filesize  1024 ) {
                    
    $filesize  $filesize  1024 ;
                    
    $i ++;
                }
                
    $filesize  round (& $filesize );
                
                
    clearstatcache ();
                return 
    $filesize  " "  $suffix [ $i ];
            }
            
            function 
    GetDownloads ( $filename ) {            
                
    // ----- start workaround
                
    $filename_array  explode ( "/" $filename );
                
    $filename  $filename_array [ count ( $filename_array )- 1 ];
                
    // ----- end workaround
                
                
    $counterfile  "counter/"  $filename  ".txt" ;            
                if (!
    is_file (& $counterfile ))
                    return 
    "keine" ;
                
                
    $counterfile  fopen (& $counterfile "r" );
                
    $cnt_download  fgets (& $counterfile );  // reads one line!
                
                
    fclose (& $counterfile );
                
                if (
    $cnt_download  ==  0 ) {
                    return 
    "keine" ;
                }
                elseif (
    $cnt_download  0 ) {
                    
    $cnt_download  number_format (& $cnt_download 0 "," "." );
                    return 
    $cnt_download ;
                }
                else { 
    // should never happen!
                    
    global  $ehandle ;
                    
    $ehandle -> ErrorOccured ( "GetDownloads" $filename "Counterstand ungültig" );
                }
            }
        }
        
        class 
    Errors  {
            var 
    $error_string ;
            
            function 
    ErrorOccured ( $type $accfile $extrainfo ) {
                
    $this -> error_string   "Ein Fehler ist aufgetreten!<br />\n" ;
                
    $this -> error_string  .=  "Bitte kontaktieren Sie mich schnellstmöglich unter Angabe der unten stehenden Fehlerinformationen!<br />\n" ;
                
    $this -> error_string  .=  "<span style=\"color:red\">" ;
                
                if (!empty(
    $accfile )) {
                    
    $this -> error_string  .=  "<br />\n" ;
                    
    $this -> error_string  .=  "<span style=\"font-weight:bold\">Dateizugriff:</span> " ;
                    
    $this -> error_string  .=  $accfile ;
                }
                if (!empty(
    $type )) {
                    
    $this -> error_string  .=  "<br />\n" ;
                    
    $this -> error_string  .=  "<span style=\"font-weight:bold\">Funktion:</span> " ;
                    
    $this -> error_string  .=  $type ;
                }
                if (!empty(
    $extrainfo )) {
                    
    $this -> error_string  .=  "<br />\n" ;
                    
    $this -> error_string  .=  "<span style=\"font-weight:bold\">Grund:</span> " ;
                    
    $this -> error_string  .=  $extrainfo ;
                }
                
    $this -> error_string  .=  "</span>" ;
                
    //$this->error_string .= "</div>\n</body>\n</html>";
                
                
    die( $this -> error_string );
            }
        }
    ?>
     
  17. 5. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Also in dem Teil sehe ich ehrlich gesagt kein GET^^

    Nur in dem davor und da passts, da du ja aufpasst, dass man keine Datei runterladen kann, die man nicht runterladen soll..
     
  18. 5. August 2010
    AW: Download Script auf Sicherheitslücken testen

    am besten den dateinamen buchstaben+zahlen kombination zuweisen und abspeichern. und zur prüfung nimst du die c-funktionen: ctype_alpha, ctype_alnum oder ctype_digit
     
  19. 6. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Hallo,

    ich werde mir das noch einmal genauer anschauen. Hintergrund war der, dass in einem Verzeichnis "counter" sich eigenartige Text-Dateien befanden:

    .txt (Inhalt war eine 1)
    contact.php.txt (Inhalt waren wilde Buchstaben & Zahlen)

    und so weiter.
     
  20. 6. August 2010
    AW: Download Script auf Sicherheitslücken testen


    Wenn ich das richtig sehe war bei der ersten Text Datei einfach der Wert "$_GET["file"]" leer und daher hat er einfach nur eine ".txt" Datei erstellt mit dem Counterwert "1".

    Bei dem zweiten hat jemand vermutlich versucht den Inhalt (Quelltext) deiner contact.php Datei auszulesen (Google: Local File Inclusion).

    Wie da jedoch verschiedene Buchstaben + Zahlen rein gekommen sind kann ich dir gerade auch nicht sagen, da dein Script ja entweder den Counter um eins erhöht,wenn die Datei schon existiert, oder wenn nicht erstellt das Script die Datei mit dem Inhalt "1".

    Um so etwas zu vermeiden, könntest du einfach mehrere Checks machen sprich:

    PHP:
    if(isset(! $file ) or  strpos ( strtolower ( $file ),  '.php' ) > - 1 ) { 
    global 
    $ehandle ;
    $ehandle -> ErrorOccured ( "GetDownloads" $filename "Kein Dateiname angegeben oder Dateiname enthielt unerlaubte Werte!" );
    // ungetestet
    Das überprüft ob "$_GET["file"]" einen Wert ha,t oder die Datei unerlaubte Werte enthält (hier im Beispiel wäre es ".php")

    Aber man sollte eh direkt von Anfang an mit Datenbanken arbeiten, zumal du dann viel einfachere Funktionen hast um z.B. den Counter zu erhöhen und es ist bei weiten nicht so Ressourcenlastig wie fopen, fclose etc.
     
  21. 6. August 2010
    AW: Download Script auf Sicherheitslücken testen

    wie gesagt [Bensen], machmal hab ich den eindruck dein account wird von mehreren genutzt.

    ---------------------

    isset: prüft ob eine variable exstiert und ungleich NULL ist.

    dein script: isset(!$file)
    wtf + syntax error

    ---------------------

    strpos: liefert das erste vorkommen einer zeichenkette in einer anderen.

    dein script: strpos($file, '.php')
    .php darf also irgendwo mal vorkommen -> nicht gerade "sicher"

    ---------------------

    du suchst: empty und substr
     
  22. 6. August 2010
    AW: Download Script auf Sicherheitslücken testen

    Ach verdammt, ne hatte nen harten Arbeitstag und nicht mehr genau nachgedacht was ich da schreibe.

    Hab vorher auch if empty($file) geschrieben nur dann dachte ich mir so das if(isset(!$file) eleganter ausschaut.

    Gut das mit dem strpos($file, '.php') wusste ich nicht und war unüberlegt.

    Mit pathinfo sollte es wohl dann am einfachsten sein. Wobei es eigendlich sinnlos ist, da über Get file ja nichts included wird.
     
  23. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.