Laborversuche mit OWASP WebGoat (2014)

Olivier
Olivier

Laborversuche zu den OWASP Top Ten mit OWASP WebGoat

Inhaltsverzeichnis

Einleitung

  • Update 2016: Dieser Text stammt aus 2014. Ich habe ihn im IT Security Modul an der HSLU erstellt. Die Informationen sind möglicherweise nicht mehr aktuell.

Das „Open Web Application Projekt“ (OWASP) beschreibt auf einer umfangreichen Website häufige Angriffe auf Web Applikationen und stellt eine Top-Ten Liste zu den häufigsten Angriffen zusammen. OWASP listet die folgenden Schwachstellen in Web Applikationen auf, die als besonders kritisch angesehen werden:

  • A1 Injection
  • A2 Broken Authentication and Session Management
  • A3 Cross-Site Scripting (XSS)
  • A4 Insecure Direct Object References
  • A5 Security Misconfiguration
  • A6 Sensitive Data Exposure
  • A7 Missing Function Level Access Control
  • A8 Cross Site Request Forgery (CSRF)
  • A9 Using Components with Known Vulnerabilities
  • A10 Unvalidated Redirects and Forwards

Die Reihenfolge der Auflistung ist dabei relevant. Um die üblichen Sicherheitslücken in eigenen Versuchen zu erproben bietet OWASP die Applikation WebGoat an (https://github.com/WebGoat/WebGoat). Dies ist eine von OWASP entwickelte Versuchsumgebung, mit der bekannte Web-Attacken ausprobiert werden können.

OWASP WebGoat enthält mehrere Kurse und Lektionen aus verschiedenen Bereichen der OWASP Top Ten. Die Applikation enthält zu jeder Aufgabe auch Hinweise (Hints) und einen kompletten Lösungsweg. Meistens existieren mehrere Lösungsmöglichkeiten der Aufgabe. In den Versuchsbeschreibungen zu den Lektionen ist angegeben, ob Hinweise oder der komplette Lösungsweg verwendet wurde.

Versuchsumgebung

Um die Versuchsumgebung einfach zu halten, wurde die WebGoat Applikation auf einem Windows 8 System installiert. Dieses System dient in den nachfolgenden Versuchen sowohl als Client-, wie auch als Serversystem.

Die Installation von WebGoat ist denkbar einfach, ein ZIP-File kann von http://code.google.com/p/webgoat/downloads/list heruntergeladen werden und enthält alle benötigten Dateien für die Testumgebung. Nach dem Ausführen der Datei webgoat.bat steht ein Webserver auf Basis von Tomcat und Java unter der URL: http://localhost/WebGoat/attack zur Verfügung. Nach einem Login (Benutzername: guest, Passwort: guest) stehen dem Benutzer mehrere Kurse und Lektionen zur Auswahl.

Es wird noch ein weiteres Tool benötigt. Der von OWASP Entwickelte Zed Attack Proxy (ZAP - https://github.com/zaproxy/zaproxy/). ZAP ist ein lokaler Proxy Server. Die Anfragen des Browsers werden über ZAP zur Web Applikation weitergeleitet. Eine nützliche Funktion von ZAP ist, dass im Programm Breakpoints gesetzt werden können. Wenn zum Beispiel ein Breakpoint für www.nzz.ch gesetzt wird, und der Browser über den ZAP Proxy auf diese Website zugreifen will stoppt ZAP den Zugriff und bietet dem Benutzer die Möglichkeit, die Parameter des Zugriffs zu verändern.

Um also z.B. die Post oder Form- Parameter einer Seite zu manipulieren, werden die Browser Anfragen manipuliert:

  1. Installation ZAP Proxy (https://github.com/zaproxy/zaproxy/).
  2. Eintragen von http://localhost:8080 in der Proxy Konfiguration des gewünschten Browsers.
  3. Zugriff auf die gewünschte Adresse.
  4. Setzen eines Breakpoints im ZAP Proxy auf der Ziel-URL.
  5. Zugriff auf die Ziel-URL.
  6. Ändern der Parameter der Browseranfrage für die Ziel-URL im ZAP Proxy und ausführen des Requests.

Der Browser enthält dann die Antwort auf diesen manipulierten Request vom ZAP Proxy.

image

Lektion Nummeric SQL Interception

Die Seite der Lektion zeigt ein einfaches Formular für Wetterdaten, in dem über ein Drop-Down Menu eine Stadt ausgewählt werden kann. Mit einem Klick auf „Go!“ werden die Wetterdaten für diese Stadt und das ausgeführte SQL-Statement ausgegeben.

image

Das Ziel der Lektion ist, den Form Parameter station so zu manipulieren, dass die gesamte Tabelle weather_data angezeigt wird.

Dazu wird mit dem ZAP Proxy der Original Post-Request auf die Seite:

POST http://localhost/WebGoat/attack?Screen=77&menu=1100 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://localhost/WebGoat/attack?Screen=77&menu=1100
Cookie: JSESSIONID=9BBB822B1EF34454C076748E53489244
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
station=102&SUBMIT=Go%21

abgefangen und der station Parameter folgendermassen modifiziert:

station=102 OR 1=1&SUBMIT=Go%21

Nun liefert der Webserver dem Benutzer als Antwort die ganze Tabelle der Wetterdaten.

image

Lektion Command Injection

In dieser Lektion geht es darum, den Request auf einen Lektionen Plan so zu modifizieren, dass ein Betriebssystem Kommando ausgeführt wird.

  • Lektionsziel: The user should be able to execute any command on the hosting OS.

image

Um ein Betriebssystem Kommando auszuführen wir der Post Request modifiziert:

POST http://localhost/WebGoat/attack?Screen=87&menu=1100 HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
Content-Length: 45
Cache-Control: max-age=0
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://localhost
            User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost/WebGoat/attack?Screen=87&menu=1100
Accept-Encoding: sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: JSESSIONID=9CC0B024D1C14A14120BE7F92AA39BFD
HelpFile=AccessControlMatrix.help&SUBM

In der letzten Zeile wird nun der Form Parameter erweitert und folgendermassen an den Webserver geschickt:

HelpFile=AccessControlMatrix.help"%26%26 echo "test"&SUBMIT=View"

Dazu sind ein paar Erklärungen nötig:

  • Der String %26 ist die codierte Version des UND-Zeichens &.
  • Mittels zweier && können in der Windows Command Shell (cmd) Befehle nacheinander ausgeführt werden.

Der Befehl, welcher als String an das cmd.exe File des Webservers übergeben wird, lautet also:

cmd.exe /c type "C:\Users\osc\Desktop\WebGoat\WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat
\webapps\WebGoat\lesson_plans\English\AccessControlMatrix.html"&& echo "test"

Er enthält neben dem eigentlichen Befehl, die Hilfedatei anzuzeigen, auch noch einen weiteren echo Befehl, welcher „test“ auf der Konsole ausgibt.

Lektion Log Spoofing

Das Ziel der Lektion Log Spoofing ist es, einen falschen Eintrag im Log File des Servers zu erstellen, der so aussieht, als ob sich der Benutzer admin erfolgreich eingeloggt hätte.

Lektionsziele

  • The grey area below represents what is going to be logged in the web server's log file.
  • Your goal is to make it like a username "admin" has succeeded into logging in.
  • Elevate your attack by adding a script to the log file.

image

Um die Aufgabe zu erfüllen, musste auf die Hinweise zur Lektion „Hints“ zurückgegriffen werden. Die Hinweise lauteten folgendermassen:

  1. Hint 1: Try to fool the human eye.
  2. Hint 2: Use CR (%0d) and LF (%0a) for a new line.

Damit ist nun klar, wie das Ziel erreicht werden soll. Neben dem ersten nicht erfolgreichen Log-Eintrag für den Login eines Benutzers soll noch eine weitere Zeile mit dem erfolgreichen Login des Benutzers admin angefügt werden. Dies konnte folgendermassen ausgeführt werden:

  1. Im Feld Username wird ein Benutzername, ein CR und ein LF Charakter und eine weitere Log Zeile eingeben. Das Formularfeld hat also folgenden Inhalt: Olivier%0d%0aLogin Succeeded for username: admin.
  2. Der Webserver fügt dem String Login failed for username: einfach noch den Benutzernamen an. Da der Benutzername nun aber noch einen Zeilenumbruch und einen weiteren Log Eintrag erhält, sieht die Log Datei anschliessend folgendermassen aus:
Login failed for username: Olivier
Login Succeeded for username: admin

Lektion Denial of Service from Multiple Logins

In dieser Lektion soll ein „Denial of Service“ Angriff auf ein Loginformular ausgeführt werden. Gemäss der Aufgabenbeschreibung erlaubt die Seite mehrere Logins eines Benutzers. Die Seite hat dazu einen Database connection pool der 2 Verbindungen zulässt.

Um die Aufgabe zu lösen muss:

  1. Eine Liste von erlaubten Benutzernamen gefunden werden und
  2. Total 3 Logins auf die Seite ausgeführt werden

image

Ein Login mit dem Benutzernamen „oli“ und dem Passwort „oli“ zeigt, dass folgendes SQL Statement abgefragt wird, um den Benutzer zu identifizieren:

SELECT * FROM user_system_data WHERE user_name = 'oli' and password = 'oli'

Das User Feld eignet sich für eine SQL Injection Attacke. Es müsste also möglich sein, das SQL Statement abzuändern und die Passwort-Abfrage zu umgehen.

Der ZAP Proxy liefert den Request auf die Seite:

POST http://localhost/WebGoat/attack?Screen=139&menu=1200 HTTP/1.1
… 
Username=oli&Password=oli&SUBMIT=Login

Eine kurze Internetrecherche zeigt, dass SQL Statements mit „--„ und nicht mit „;“ auskommentiert werden. Der zweite Versuch mit folgendem Post Parameter:

Username=oli' OR 1=1 --&Password=oli&SUBMIT=Login

Liefert eine Tabelle der Benutzer:

image

Mit den Login Angaben können nun mehrere Logins auf die Seite ausgeführt werden. Nach dem Login der Benutzer jsnow, jdoe, und jplane erscheint eine Meldung über den erfolgreichen Abschluss der Lektion von OWASP WebGoat.

image

Fazit

OWASP WebGoat erlaubt es interessierten Personen ohne grossen Aufwand bekannte Attacken auf Web Applikationen auf einfache Weise nachzustellen. Die ausgeführten Versuche waren vom Schwierigkeitsgrad her nicht besonders hoch, weisen aber einen hohen Lerneffekt durch „Learning by doing“ auf. Zudem stellen sich rasch Erfolgserlebnisse ein, so dass die Arbeit mit den Lektionen Spass macht. Die in meinem Versuch verwendete Versuchsumgebung könnte ohne grossen Aufwand in der Laborumgebung der HSLU installiert werden und so weiteren Studenten zur Verfügung stehen.