#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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 ;} + Multi-Zitat Zitieren
#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' ); + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 ); ?> + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 ); } } ?> + Multi-Zitat Zitieren
#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.. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren