Serverseitige Angriffe Flashcards
Wie defniert sich ein Angreifer?
über seine Möglichkeiten mit dem System zu unteragieren
Arten von Angreifern:
- Netzwerk-Angreifer
- Web-Angreifer
- Lokal-Angreifer
- Entfernter-Angreifer
Netzwerk-Angreifer:
Netzwerk = NW
- sitzt an der Kommunikationsverbindung
- Fähigkeiten: Beobachtung, Erzeugung, Unterbrechung des NW-Verkehrs
- Man in the middle
Entfernter Angreifer:
- kann mit entferntem System über ein Netzwerk interagieren
- Remotysystem durch benutzung/ Missbrauch der verfügbaren Interfaces zu kompromittieren
- Ziele: Ausführung von Code, Abschöpfen von Infos, Denual of Service
lokaler Angreifer:
- führt beliebigen Code aus (aber mit beschränktem Zugriffsrechten)
- Hauptziel: Gewinnung von zusätzlichen Rechten
- “Man in the Computer”
- Bsp.: Schadsoftware, Jailbreaker
Web-Angreifer:
- neues Angreifermodell
- spezifisch für Web-Anwendungen
- “Man-in-the-Browser” => erzeugt HTTP-Anfragen aus dem Browser des Benutzers
- XSS-Angreifer => JavaScript im clientseitigen Kontext der angegriffenen Anwendung ausführen
Auf einem typischen Web Server…
- sind die Ports 80/443/ 8080 geöffnet
- läuft das Betriebssystem und der Web Server (Hauptanwendung, Plug-Ins)
Grundlagen HTTP und Web-Anwendungen:
- alle HTTP-Transaktionen folgen dem selben allgemeinen Muster
- jede Anfrage des Clients und jede Serverantwort besteht aus drei Teilen
1. Anfrage-, Antwortzeile
2. dem Header
3. optional: Nachrichteninhalt
HTTP ist … :
- … zustandslos
- nur Request und Response sonst nichts
- kein Handshake, keine Initialisierung
- … menschenlesbar
- damit ist Anfrage abgeschlossen (Nachdem die TCP-Verbindung geöffnet ist, wird die Anfrage-Syntax zum Server hin gestreamt)
HTTP Request besteht aus :
- der Anfragezeile (GET/index.html HTTP/1.1)
- Liste von HTTP-Headern, getrennt durch durch (bsp. Cookies, Host)
- einer leeren Zeile
- optional: “message body”
HTTP Request:
- Allgemeine Form der HTTP Anfragezeile: Verb Path Protocol
- Verb: bezeichnet die Aktion, die mit der Zielressource ausgeführt werden soll (Get)
- Pfad (path): gibt Ressourcen an (index.html)
- Protokoll: im Web Entweder HTTP…
- 1.0 oder
- 1.1 der
- 2.0
HTTP GET:
- Zweck: Ressource abrufen
- sollte keine Seiteneffekte auf den Zustand des Webservers haben
- Enthält keinen Message-Body
- Parameter werden in der URL übergeben
HTTP Post:
- Zweck: Daten zum Server senden
- diese Daten im Message Body
- diese Methode sollte füt Zustandsändernde Anfragen verwendet werden
weitere HTTP Verbs:
- HEAD
- PUT, DELETE
TRACE, OPTIONS, CONNECT; PATCH
Schema URL:
HTTP Response besteht aus…:
- dem Response-Code
- Liste von Response-Headern
- einer Leerzeile
- Response-Body
HTTP Response Code Beschreibung:
- Angreifer muss Informationen über sein Ziel zusammentragen bevor er seinen Angriff starten kann
- können eine Menge an Infos liefern wenn man sie richtig liest (insbesondere failed request)
HTTP Response Codes:
- 2xx Success (200 OK)
- 3xx Redirection (301,302,303,2307)
- 304 Not Modified
- 4xx Client Error (400 Bad Request, 401 Unauthorized, 403 Forbidden)
- 5xx Server Error (500 Intrenal Server Error, 502 Bad Gateway)
HTTP Response Headers:
- jeder HTTP Response kann belibig viele Response-Header enthalten
- Syntax:
- Name-Wert-Paar als Strings
- getrennt durch carriage return und line feed
- liefert Informationen über:
- Meta- und Serverinformationen
- wie soll der response body weiter verarbeitet werden
- Beispiele: (Set-Cookie, Contect-Type, Content-Length)
- viele Sicherheitsmechanismen basieren auf HTTP-Response Headern
HTTPS:
- Kombi aus HTTP und SSL (oder TLS)
- verschlüsselt die Kommunikation
- schützt vor Man-In-The-Middle und snooping
- schützt Benutzerauthentifizierung
- Schützt nicht vor Angriffen gegen die Web-Anwendung selbst
Web Proxies:
- Zwischenstationen die HTTP-Verkehr abfangen, untersuchen und weterleiten
- Zweck: catching, filtern
- Client und Netzwerk-Proxys müssen dem Browser bekannt sein (alle Anfragen werden an Progy geschickt)
- client-seitige Proxys können Sicherheitsaufgaben übernehmen (persönliche Firewalls)
Web-Server-Scripting:
- bald nach der Entstehung des WWW reichtte es nichtt mehr aus, nur statische HTML-Seiten auszuliefern
- Idee: HTML-Code programmatisch “on the fly”
- Methoden
- CGI (Common Gateway interface) => gibt Daten aus Request an Programm
- Methoden Forts)
- Webserver-Modul => schneller und bessere Schnittstellen (Bsp. mod_perl, mod_php)
- spezieller Anwendngsserver (Bsp. Tomcat, Websphere)
Bsp. Web-Applikation
- Ziel: Schreibe eine Anwendung, die einen Benutzernamen und ein Passwort entgegen nimmt und sie dann anzeigt
Angriffe auf Web-Applikationen Client-seitige Probleme:
- Cross-Site Scripting (XSS -> JavaScript)
- Cross-Site Request Forgery (CSRF)
Angriffe auf Web-Applikationen Server-seitige Probleme:
- SQL Injection
- Remote Code Injection
- Path Traversal
Ungeprüfte Eingaben (untrusted input):
- Web-Anwendungen nutzen Eingaben aus HTTP-Request (und auch Dateien) um ihre Antworten zu bestimmen
- Angreifer manipulieren HTTP-Request => Sicherheitsmaßnahmen werden umgangen
- Bsp.: XSS, SQL-Injection, Overflow, cookie poisoning)
- einige Seiten probieren sich zu schützen, indem sie bekannte schädliche Eingaben herausfiltern (Problem es gibt viele)
Prüfung der Eingaben:
- Eingaben denen man nicht vertraut sollten gegen eine “positive” Spezifikation validiert werden
- diese definiert folgendes
- Datentyp (string, integer, real, etc…)
- Zulässige Zeichenmenge –
- Minimale und maximale Länge
- ob null zulässig ist
- ob der Parameter zwingend benötigt wird (requires) oder nicht
- ob mehrere/doppelte Werte zulässig sind
- das numerische Intervall –
- spezifische erlaubte Werte (enumeration)
- spezifische Muster (regular expressions)
Was ist untrusted input?:
- Ziel-URLs
- Parameter (P) (GET-P in der URL, POST P im Body)
- Header
- Metadaten von übertragenen Objekten
- abgeleitete Code Injection
Vertraue dem Client nie:
- kann unter vollständiger Kontrolle des Angreifers stehen
- kann alle Aspekte des Web User-Interfaces lesen und ändern
- kann jegliche Sicherheitsmaßnahmen auf Client-Seite untergraben
Client-Seitige Validierung:
- versuche nicht Benutzereingaben auf der Client-Seite zu überpüfen
- Dont’Do:Passwort Vorgaben durchsetzten
- => kann leicht von Client-Seite (Angreifer) ganz leicht unschädlich gemacht werden durch
- Client-Seitige Manipulation von HTML
- Benutzung eines Abhör-Web-Proxy auf Cliebt Seite
versteckte Felder in Forms:
- sind für Angreifer sichtbar => kann sie lesen und manipulieren
- Deshalb: keine Geheimnisse und nicht beeinflusbare-Werte reinschreiben (Preis Online-Shopping)
Injection Attacks:
- viele Web-Anwendungen rufen Interpreter auf
- SQL, Shell Command
- Interpreter führen die Befehle aus, die durch Parameter in den Eingabedateien gegeben sind
- => Benutzer kann eigene Befehle (wen Parameter seiner Kontrolle unterliegen) an den Interpreter injizieren
SQL Injection:
- innerhalb einer existierenden Anwendung SQL-Kommandos in die Datenbank-Engine zu injizieren
- besonders weit verbreitet
- gefährliche Form einnes Injection-Angiffs
SQL Injection Szenario:
- Anwendung nutzt DBS zu dauerhaften Datenspeicherung (Kommunikation mit SQL Befehlen)
- Problem: dymanische Eingaben
- um SQL-Injection Schwachstelle auszunutzen muss Angreifer Paramter finden den die Web-Anwendung nutzt um DB-Abfrage zusammen zu bauen
- => dann kann er SQL-Befehle sorgfältig an geeigneten Stellen des Parameters einfügen um die Webanwendung dazu zu bringen schadhafte Abfrage an DB weiter zu geben
- Daten können abgerufen, manipuliert, zerstärt werden
Bsp.: SQL-Injection Password:
Gewinnung von Informationen mit Hilfe von Fehlermeldungen:
- Fehlermeldungen, die die Anwendung ausgibt, helfen möglicherweise dem Angreifer.
- Stelle sicher, dass du keine unnötigen Debugging- und Fehlermeldungen an Benutzer ausgibst.
- Für das Debugging ist es besser Logfiles zu benutzen
Datenbank auskundschaften:
- wenn Mehrfachabfragen (wie in MySQL) in einer Verbindung nicht erlaubt sind, lässt sich Informations-leakage mit komplexeren Vorgehensweisen erreichen
- durch hinzufügen von boolschen Bedingungen
- Infos aus anderen Tabellen mithilfe von Subquerys
Datenbank auskundschaften, Spaltenanzahl:
Datenbank auskundschaften, Spaltenname:
Eine Querymit falschemSpaltennamenliefert einen Fehler
Datenbank auskundschaften, Ermittekn weiterer Tabellen mit UNION:
weitere Beispiele für SQL-Angriffe:
- select * …; insert into user values(“user”,”h4x0r”); •
- Der Angreifer legt einen neuen Benutzer auf Datenbankebene an.
- select *… ; drop table SensitiveData;
- Ein “;” anzuhängen funktioniert nicht bei allen Datenbanken. Das kann abhängig vom Datenbanktreiber sein (z.B. bei MySQL)
SQL-Injection für Fortgeschrittene:
- Webapplikationen ändern lassen oft das ‘ und “ weg => verhindert die meisten SQL-Injection-Angriffen
- bei großen Anwendnungen keine Strings sondern sondern Zahlen
SQL-Injection im Blindflug:
- typische Gegenmaßnahme ist die Anzeige von Fehlermeldungen zu überprüfen
SQL-Injection im Blindflug:
- Daten können sogar durchsickern, wenn überhaupt keine Rückmeldung an den user/attacker gesandt wird:
- z. B. SQL-Injection-Verwundbarkeiten in Logging-Funktionen
- Der Trick besteht darin, das Antwortverhalten des Webservers zu beeinflussen:
- “timing based information leaks”
Timing basierte Information Leak:
- Erstelle eine Query, die entweder sehr schnell abgearbeitet ist oder aber sehr lange braucht,abhängig von einem abgefragten Wert.
- Durch Messen der Antwortzeit erhält man Informationen über den Wert
- true/false Information = ein Bit
SQL Injection Solution:
- Entwickler dürfen es nicht lassen, dass vom Benutzer eingegebene Daten SQL-Statements verändern
- beste Schutz: Applikation von SQL trennen
- Persistenz-Fraemeworks können helfen
- benötigte Statements sollten als prepared statememts realisiert sein
prepared statements:
- Konzept: Keine dynamische String-Concatenation •
- Stattdessen vorgefertigte SQL-Statements mit Platzhaltern.
- Damit bleibt die syntaktische Struktur der Anweisung statisch.
- Einfügen von SQL-Syntax ändert dann nicht die Semantik des Statements
- trzdm verwundbar wenn sich Angreifer schlau anstellt
Andere Möglichkeiten SQL-Injection vor zu beugen als prepared statements:
- Validierung der Benutzereingaben die in den SQL-Statements landen
- nur Daten akzeptieren, die genau den Erwartungen entsprechen (Typ, Größe)
- Entfernen oder escapen von Anführungszeichen die in Benutzerdaten sind
- aus ‘ wird '
- schweigsam sein (keine SQL Errors) => Response Code 500 sagt genug
- Zugriffsrechte beschränken
Warnung bei eigenen Sicherheitsvorkehrungen:
- man muss das Rad nicht jedes Mal nue erfinden?
- eigene Implementierung kann lückenhaft sein
- Zeitaufwand für Fehlersuche/ Korrektur und Testen
Remote Code-Injection:
- Gegenmaßnahmen
- validiere und escape dynamische Kommandos
- nimm ausführenden System-User so viele Privilegien wie möglich weg
- besser: gar keine Shell-basierte Kommunikation/ Ausführung
Path traversal:
- Folgen: Information leakage (Konfigurationsdateien)
- Gegenmaßnahmen:
- normalisiere alle Pfade
- Positivlsten (Whitelists)
- sensible Daten außerhalb solcher Pfade
String basierte Code-Injection:
- Code und User Eingaben vermischen sich, da Code auch dynamisch erzeugt wird
Kontrollfluss bei Web-Applikationen:
- Der Kontrollfluss einer Web-Applikation wird bestimmt durch die Abfolge der HTTP-Requestsund -Responses.
- Die HTTP-Requests, die die Applikation (auf Serverseite) erwartet, ergeben sich aus den Aktionen in ihrem User-Interface
Vorgesehene und erwartete HTTP-Request:
- Die vorgeseheneFormdereingehenden Requestswird bestimmt durch das UI der Web-App
- Die interne Logik der Applikation ist auf dieses erwartete Schema hin programmiert.
- Der Angreifer kann ausgehende HTTP–Requests bis aufs letzte Bit kontrollieren
- Also kann der Programmierer sich nicht auf die Einschränkungen durch das erwartete Format und den Ablauf der Requests verlassen
- Das Bedeutet, er kann nicht davon ausgehen, dass alle eingehenden Requests sich an das Schema halten, das vom UI der Applikation vorgegeben wird
HTTP Verb-Tampering:
- HTTP ist gutmütiges Protokoll
- man kann beliebiges Wort als HTTP-Method verwenden, nicht nur GET oder POST
- im schlimmsten Fall:
- Default authorization = ALLOW
- Die Berechtigungsprüfungen hängen an spezifischen HTTPVerben –GET,POST
- Alle unbekannten oder unerwarteten Verben werden durchgelassen –Lässt sich mit einem „WURST“-Request austricksen
Fehlende Kontrollfluss Integrität:
- wenn INtegrität des Workflows nicht eingehalten wird, kann Angreifer von a nach c springen und b überspringen
- besonders schwer wenn Kontrollfluss über mehrere Parteien erstreckt
Race Conditions:
- Problem mit der Nebenläufigkeit
- meiste Web-Entwickler sind sich nicht im klaren, dass sie hochgradig multithreaded Code schreiben
- jeder HTTP Request ist ein Thread?
File Upload:
- Nachlässigkeit kann schwerwiegende Sicherheitsprobleme verursacht:
- Dateien sind vom Angreifer kontrolliert (Dateinamen, Dateiinhalt)
- nach Upload liegt Datei auf dem Server und in den Sicherheitsgrenzen der Anwendung wo sie verarbeitet wird
- Tipps:
- Prüfe alles gründlich und akzeptiere nur das, was du erwartest
- Beurteile Dateien nicht nur aufgrund ihrer Dateiendung
- Lass es nicht zu, dass der Benutzer den Filenamen wählt.
- Sonst könnte er die Datei z.B. ../etc/passwd nennen.
- Beschränke die Größe der Dateien – Sonst könnte ein Angreifer damit einen DoS-Angriff auf die Anwendung fahren.
- Wandle Bilddateien um (reformat)