Zap
Zap Grundlagen
Einleitung
ZAP (kurz fuer Zed Attack Proxy) ist ein quelloffener Sicherheitsscanner fuer Webanwendungen. Frueher lief das Projekt als OWASP ZAP unter dem Dach des Open Web Application Security Project (OWASP). Das ist nicht mehr aktuell: ZAP hat OWASP 2023 verlassen und ist zum Software Security Project (unter der Linux Foundation) gewechselt, um die Finanzierung der Weiterentwicklung zu sichern. Seit September 2024 sind die Hauptentwickler bei Checkmarx angestellt, das Projekt wird seitdem als "ZAP by Checkmarx" gefuehrt. Es bleibt dabei quelloffen, community-gesteuert und kostenlos - eine kommerzielle "Pro"-Version wie bei Burp Suite gibt es nicht.
- Es ist sowohl fuer Einsteiger in die Anwendungssicherheit als auch fuer professionelle Penetrationstester gedacht.
- Als Proxy-Server eingesetzt ermoeglicht es, den gesamten durchlaufenden Datenverkehr zu manipulieren - auch Verkehr, der ueber HTTPS verschluesselt ist.
- Es kann zusaetzlich in einem Daemon-Modus laufen und wird dann ueber eine REST-API gesteuert.
- ZAP wurde urspruenglich von Paros abgezweigt, einem aelteren Pentesting-Proxy.
- Es wird unter der Apache-Lizenz veroeffentlicht.
Einige der integrierten Funktionen:
- abfangender Proxy-Server (Intercepting Proxy)
- traditionelle und AJAX-Webcrawler
- automatisierter (aktiver) Scanner
- passiver Scanner
- erzwungenes Browsing (Forced Browsing)
- Fuzzer
- WebSocket-Unterstuetzung
- Skriptsprachen
- Plug-n-Hack-Unterstuetzung
- Es verfuegt ueber eine Plugin-basierte Architektur mit einem Online-Marktplatz (ZAP Marketplace), ueber den sich neue oder aktualisierte Funktionen nachinstallieren lassen.
Zap Installation
- apt install zaproxy
Zap automatischer Scan
Scan
- Automated Scan
- URL einfügen
- Attack
Nach dem Durchlauf zeigt ZAP die gefundenen Alerts als Baum an. Im Beispiel sind es 17 Fundstellen; die Zahl in Klammern nennt die Anzahl betroffener URLs:
- Cross Site Scripting (DOM Based) (4)
- Cross Site Scripting (Reflected) (2)
- Remote OS Command Injection
- SQL Injection (4)
- Absence of Anti-CSRF Tokens (Systemic)
- Content Security Policy (CSP) Header Not Set (Systemic)
- Missing Anti-clickjacking Header (Systemic)
- Sub Resource Integrity Attribute Missing (2)
- In Page Banner Information Leak (Systemic)
- Server Leaks Version Information via "Server" HTTP Response Header Field (Systemic)
- Strict-Transport-Security Header Not Set (Systemic)
- X-Content-Type-Options Header Missing (Systemic)
- Authentication Request Identified (2)
- Information Disclosure - Suspicious Comments (4)
- Modern Web Application (2)
- Re-examine Cache-control Directives (Systemic)
- User Controllable HTML Element Attribute (Potential XSS) (14)
ZAP-Fundstellen im Überblick
ZAP nennt jede Fundstelle "Alert" – das hat nichts mit den Alerts in GVM zu tun, wo damit Benachrichtigungen gemeint sind.
Die Zahl in Klammern gibt die Anzahl betroffener URLs an. "(Systemic)" bedeutet, dass der Befund die gesamte Anwendung betrifft; ZAP fasst dann zusammen, statt hunderte gleichartige Treffer zu listen.
Die Fundstellen sind farblich nach Risiko markiert. In der ausgeklappten Ansicht steht die Farbe als kleines Fähnchen vor jeder Zeile:
| Farbe | Stufe | Bedeutung |
|---|---|---|
| rot | High | nachgewiesene, ausnutzbare Schwachstelle |
| orange | Medium | fehlende Schutzmaßnahme oder eingeschränkt ausnutzbar |
| gelb | Low | geringe Auswirkung, meist Informationspreisgabe |
| blau | Informational | Beobachtung ohne Sicherheitsrelevanz |
Nachgewiesene Schwachstellen
| Fundstelle | Erklärung | Abhilfe |
|---|---|---|
| Remote OS Command Injection | Eingaben fließen in einen Systemaufruf. Mit Trennzeichen wie ; oder | hängt der Angreifer eigene Befehle an und führt Code auf dem Server aus – mit den Rechten des Webserver-Prozesses. |
Systemaufrufe mit Benutzerdaten vermeiden; wenn unvermeidbar, Argumente als Array übergeben statt als Kommandozeile |
| SQL Injection | Eingaben landen ungefiltert in einer Datenbankabfrage. Reicht vom Lesen fremder Datensätze bis zum Umgehen der Anmeldung. | Prepared Statements mit gebundenen Parametern statt zusammengebauter Abfragestrings |
| Cross Site Scripting (DOM Based) | JavaScript liest Daten aus URL oder Fragment und schreibt sie über innerHTML ins Dokument. Läuft rein im Browser – der Server sieht die Nutzlast nie. |
Sichere DOM-Methoden wie textContent; keine ungeprüften Daten in innerHTML
|
| Cross Site Scripting (Reflected) | Eine Eingabe geht an den Server und erscheint unverändert in der Antwort. Angriff über präparierten Link, wirkt in der Sitzung des Opfers. | Kontextabhängige Ausgabekodierung |
Fehlende Schutzmaßnahmen
Keine Lücken für sich genommen, aber sie erleichtern die Ausnutzung anderer Fehler.
| Fundstelle | Erklärung | Abhilfe |
|---|---|---|
| Absence of Anti-CSRF Tokens | Formulare ohne unvorhersehbares Token lassen sich von fremden Seiten absenden; der Browser hängt die Cookies automatisch an. | Token pro Formular und Sitzung; SameSite-Cookies
|
| Content Security Policy (CSP) Header Not Set | Ohne CSP fehlt die zweite Verteidigungslinie, die eine gefundene XSS-Lücke oft noch entschärft. | Content-Security-Policy setzen, möglichst ohne unsafe-inline
|
| Missing Anti-clickjacking Header | Die Seite lässt sich in einen fremden iframe einbetten und mit einer transparenten Schicht überlagern. | frame-ancestors in der CSP, ersatzweise X-Frame-Options
|
| Strict-Transport-Security Header Not Set | Der erste Aufruf kann über HTTP erfolgen und abgefangen werden. | Strict-Transport-Security mit ausreichender max-age
|
| X-Content-Type-Options Header Missing | Ohne nosniff raten Browser den Inhaltstyp; eine hochgeladene Datei kann so als Skript ausgeführt werden. |
X-Content-Type-Options: nosniff
|
| Sub Resource Integrity Attribute Missing | Extern eingebundene Skripte ohne integrity-Attribut: Wird das CDN manipuliert, führt die Seite fremden Code aus. |
integrity- und crossorigin-Attribut setzen
|
| Re-examine Cache-control Directives | Cache-Vorgaben, die persönliche Inhalte in Proxys oder im Browser-Cache liegen lassen könnten. | Cache-Control: no-store für authentifizierte Antworten
|
Informationspreisgabe
| Fundstelle | Erklärung | Abhilfe |
|---|---|---|
| Server Leaks Version Information | Produkt und Version im Server-Header. Kein Angriffsweg, aber Aufklärung: Der Angreifer weiß, welche Exploits in Frage kommen. |
ServerTokens Prod bzw. server_tokens off
|
| In Page Banner Information Leak | Versionsangaben im Seiteninhalt, etwa auf Standard- oder Fehlerseiten. | Standardseiten ersetzen |
| Information Disclosure – Suspicious Comments | HTML-Kommentare mit Wörtern wie "TODO" oder "password". Meist harmlos, gelegentlich Hinweise auf interne Pfade oder Testzugänge. | Kommentare beim Ausliefern entfernen |
Hinweise ohne Sicherheitsrelevanz
| Fundstelle | Erklärung |
|---|---|
| Authentication Request Identified | ZAP hat Anmeldeformulare erkannt – Hinweis darauf, wo für einen authentifizierten Scan Zugangsdaten hinterlegt werden können. |
| Modern Web Application | Die Anwendung nutzt viel JavaScript. Ein reiner HTML-Crawl erreicht nicht alle Funktionen; hier ist der AJAX-Spider nötig. |
| User Controllable HTML Element Attribute (Potential XSS) | Eingaben landen in HTML-Attributen. ZAP hat keinen Angriff nachgewiesen, nur den Weg beobachtet – Prüfkandidaten, keine Befunde. |
ℹ️ Hinweis: Der Unterschied zwischen nachgewiesen und vermutet ist zentral: Die vier bestätigten DOM-XSS-Funde hat ZAP durch manipulierte Eingaben belegt, die 14 "Potential XSS" nur durch Beobachtung vermutet. In GVM übernimmt die Quality of Detection diese Rolle, in ZAP steht sie im Namen der Fundstelle.
ℹ️ Hinweis: Priorisiert wird nicht nach Farbe, sondern danach, wie tief ein Angreifer kommt: erst Command Injection (Codeausführung auf dem Server), dann SQL Injection (Datenbank), dann XSS (Browser des Opfers), zuletzt die fehlenden Header.
Zap Brute Force
Passwort liste laden
Die Passwortliste enthaelt haeufig verwendete, schwache Passwoerter und dient als Payload-Quelle fuer den Angriff.
ZAP starten und Browser oeffnen
ZAP faengt Requests standardmaessig nicht ab (Break ist aus) - anders als bei Burp gibt es kein Interception-Umschalten. ueber den eingebauten Browser wird der Proxy automatisch gesetzt und das ZAP-Zertifikat ist bereits importiert.
- Manual Explore
- Launch Browser
- Es oeffnet sich ein Browser, dessen Verkehr komplett ueber ZAP laeuft.
Opfer aufrufen
Im ZAP-Browser die Login-Seite des Opfers aufrufen.
- http://opfer.sec-labs.de/scripts/login-simple.php
- Login Simple
Testlogin absenden
Einmal mit einem beliebigen Test-Passwort einloggen, damit der POST-Request mit allen Parametern in ZAP auftaucht.
- User: xinux
- Password: sux
- Dieser Request dient als Vorlage - an ihm wird gleich die Payload-Position gesetzt.
Request in den Fuzzer schicken
Der abgesendete Request landet unten im History-Tab. Dies entspricht Burps "HTTP history".
- History (unten)
- POST-Paket mit Params auswaehlen
- Rechte Maustaste auf den Request
- Attack
- Fuzz...
- Attack
- Der ZAP-Fuzzer ist das Gegenstueck zu Burps Intruder - in ZAP voll und ungedrosselt nutzbar.
Payload-Position markieren
Im Fuzzer-Fenster wird der Request angezeigt. Statt wie bei Burp alle automatischen Positionen zu loeschen, wird die Position direkt durch Markieren gesetzt.
- Im Request-Text den Passwort-Wert sux mit der Maus markieren
- Rechts auf Add... klicken
- Die markierte Stelle wird zur Fuzz-Position. Ein vorheriges "Clear" wie bei Burp ist nicht noetig.
Payloads laden
Jetzt wird der markierten Position die Passwortliste als Payload-Quelle zugewiesen.
- Im Payloads-Dialog auf Add... klicken
- Type
- File waehlen und die Datei bad-passwords laden
- Alternativ Type: Strings - das entspricht Burps "Simple list", bei der die Eintraege direkt untereinander eingefuegt werden.
Erfolg erkennen
ZAP hat keinen fertigen "Grep-Match"-Haken wie Burp. Der erfolgreiche Login wird stattdessen ueber die Antwortgroesse erkannt: Eine erfolgreiche Anmeldung liefert eine andere Seite als eine fehlgeschlagene, also weicht die Laenge der Antwort ab.
- Fuzzer starten
- In der Ergebnisliste nach der Spalte Size Resp. Body sortieren
- Der Treffer faellt durch die abweichende Laenge sofort auf. Diese Spalte entspricht Burps "Length".
Angriff starten
- Start Fuzzer druecken
- ZAP arbeitet die komplette Passwortliste ab. Die Content-Length muss nicht angepasst werden - ZAP korrigiert sie beim Fuzzen automatisch. Die Anzahl paralleler Threads laesst sich im Fuzzer unter Options einstellen.
Optional: automatisch auf einen Text in der Antwort pruefen
Wer den Treffer nicht ueber die Groesse, sondern ueber einen bestimmten Text in der erfolgreichen Antwort (z.B. das Wort Hallo) erkennen will, kann ein kleines Processor-Script einhaengen. Es benoetigt das Skripting-Add-on, das in ZAP kostenlos enthalten ist.
- Fuzzer HTTP Processor-Script
function processResult(utils, fuzzResult) {
var body = fuzzResult.getHttpMessage().getResponseBody().toString();
if (body.indexOf("Hallo") > -1) {
fuzzResult.addCustomState("Treffer", "JA");
}
return true;
}
- Das Script im Fuzzer unter Message Processors einhaengen. Bei einem Treffer erscheint in einer eigenen Spalte der Wert JA.