-
Notifications
You must be signed in to change notification settings - Fork 0
ZAP Praktische gids (how to en oplossingen)
Een OS-specifieke variant van de ZAP Desktop Tool kan opgehaald worden van: https://www.zaproxy.org/download/
Voor het opstarten van de tool is een Java JRE nodig (en niet een JDK) vanaf versie 11 anders volgt de melding:
Naast HTTP GET, HTTP POST en HTTP PUT zijn er nog meer request methods zoals HTTP PATCH. ZAP ondersteunt dit (nog, 2025) niet.
Wanneer je PATCH in een sequence probeert te gebruiken, stopt de sequence bij de overview. Als je PATCH via een andere route probeert te implementeren, krijg je de volgende foutmelding:
java.lang.IllegalArgumentException: Method not supported: PATCH
Bij het werken met ZAP Automation Plans is het belangrijk om rekening te houden met portabiliteit. Scripts die lokaal goed functioneren, kunnen in een CI/CD-omgeving onverwachte problemen opleveren. Dit komt voornamelijk doordat omgevingsvariabelen (environment variables) anders zijn ingericht op een ontwikkelmachine dan in een pipeline-omgeving.
Het ZAP Automation Framework interpreteert géén omgevingsvariabelen automatisch in YAML-velden zoals urls
of includePaths
. In tegenstelling tot bijvoorbeeld shellscripts of Docker Compose, wordt een waarde als ${RELEASE_NAME}
door ZAP beschouwd als een letterlijke string, tenzij je deze gebruikt in:
- een Zest-script, of
- een expliciet ondersteund veld zoals
env.parameters
Houd hier dus rekening mee bij het verplaatsen of hergebruiken van automation plans tussen verschillende omgevingen.
Variabelen in sequence worden niet overgenomen uit automation plan!
Dus je moet een shell script maken met envsubst
Zest-scripts bieden geen directe ondersteuning voor logging naar stdout, zeker niet in headless modus. Wil je toch logberichten gebruiken binnen een Zest-script, dan zijn er enkele alternatieve werkwijzen:
- Gebruik de
ZestActionPrint
om een waarde op te slaan in een variabele. - Log deze variabele via een secundair mechanisme, zoals:
- een custom scan rule
- een apart script dat de uitvoer verwerkt
Let op: standaard logging vanuit Zest werkt niet zoals je wellicht gewend bent bij andere scriptingtalen. Test dit goed bij gebruik in een pipeline.
The ZAP scan is integrated into the GitLab CI/CD pipeline as a job in the .gitlab-ci.yml
file. And does the following:
- Runs in the "zap" stage of the pipeline.
- Uses the zaproxy/zaproxy:stable Docker image.
- Executes for both merge requests and the main branch.
- Sets environment variables based on the context (merge request or main branch)
- Performs variable replacements in the configuration files.
- Runs the ZAP scan using the zap.sh command with the zap-scan.yaml automation plan.
- Stores the reports as artifacts, which can be accessed from the GitLab UI.
The run-zap-scan.sh
script is used to run ZAP scans locally.
./run-zap-scan.sh -r mr155
The following actions are executed
- Creates a temporary directory structure for ZAP scan outputs
- Sets environment variables (RELEASE_NAME, ZEST_SCRIPT, ENCODING_SCRIPT)
- Substitutes environment variables in configuration files
- Runs the ZAP scan using Docker with the zaproxy/zap-stable image
- Outputs the scan results to the temporary directory
To run a ZAP scan locally:
./run-zap-scan.sh -r mr155
After running the script, the scan reports can be found in the ./zap-temp/reports
directory.
The script includes commented-out code for debugging purposes. To enter the ZAP container for debugging:
- Uncomment the debugging section in the script
- Run the script
- You will be placed in a shell inside the ZAP container
Wanneer je ZAP gebruikt voor het scannen van een applicatie in een testomgeving, is het vaak wenselijk om het ZAP-verkeer te onderscheiden van normaal verkeer. Door een specifieke User-Agent-header in te stellen in ZAP, kun je dit verkeer eenvoudig terugvinden en filteren in logsystemen zoals Kibana (op basis van bijvoorbeeld Elasticsearch-logs).
ZAP genereert veel verkeer en kan foutmeldingen of ongebruikelijke requests veroorzaken. Om analyses zuiver te houden en false positives in dashboards te vermijden, is het aan te raden ZAP-verkeer te taggen en uit te sluiten of juist te volgen in Kibana.
De User-Agent kan op meerdere manieren worden ingesteld, afhankelijk van hoe je ZAP gebruikt.
- Open ZAP.
- Ga naar Tools → Options.
- Navigeer naar HTTP Sessions of Connection → User-Agent.
- Voeg een custom User-Agent toe, bijvoorbeeld:
Je kunt ook een custom header instellen via een script of een request policy. Bijvoorbeeld via een script dat wordt opgenomen in je automation plan:
jobs:
- type: requestor
parameters:
requests:
- url: "https://example.org"
method: "GET"
headers:
User-Agent: "ZAP-Scanner/1.0"
Zodra de requests zijn gelogd met deze specifieke User-Agent, kun je in Kibana eenvoudig filteren op dit verkeer om bijvoorbeeld foutanalyses of dashboards zuiver te houden.
Alle verkeer afkomstig van ZAP:
user_agent.keyword: "ZAP-Scanner/1.0"
Verkeer uitsluiten in visualisaties of zoekopdrachten:
NOT user_agent.keyword: "ZAP-Scanner/1.0"
Let op: de exacte veldnaam kan variëren, afhankelijk van de ingest pipeline of logstructuur in jouw Elasticsearch-configuratie. Veelvoorkomende velden zijn user_agent
, http.user_agent
of user_agent.keyword
.
-
Gebruik een unieke en herkenbare User-Agent zoals
ZAP-Scanner/1.0
zodat je deze eenvoudig kunt terugvinden in logs. -
Leg in je testdocumentatie of Automation Plan vast welke User-Agent wordt gebruikt.
-
Filter ZAP-verkeer standaard uit in je productiedashboards om verwarring of onterechte alerts te voorkomen.
-
Overweeg om aparte dashboards of waarschuwingen op te zetten voor ZAP-verkeer, zodat je gestructureerd inzicht hebt in bevindingen uit penetratietests.
-
Combineer de User-Agent met andere metadata (zoals IP-adres van je CI-runner) om verkeer nog betrouwbaarder te onderscheiden.
In tegenstelling tot een normale webbrowser volgt ZAP een HTTP 303-redirect niet automatisch. Dit kan ertoe leiden dat een testscript stopt of faalt nadat een POST-verzoek een 303 See Other
statuscode teruggeeft. Om dit gedrag te corrigeren, moet je de redirect handmatig afhandelen binnen je script of automation plan.
De HTTP 303-redirect bevat in de response-header een Location
-veld met de URL waarheen het verzoek doorgestuurd moet worden. Om deze waarde te extraheren en te gebruiken in een volgend verzoek, volg je onderstaande stappen:
-
Maak een variabele aan via
Edit Assignment
Voeg in je script eenEdit: Set Variable
stap toe.
-
Lees de
Location
-header uit de response
Gebruik de optie om een variabele te vullen met de waarde van een specifieke header. -
Gebruik regex voor prefix en postfix
Stel een prefix-regex in (bijvoorbeeldLocation:
) en een postfix-regex (zoals een newline of einde van de regel) om alleen de URL uit de header te isoleren. -
Gebruik de variabele in een volgend request
Je kunt de nieuwe URL uit deLocation
-header vervolgens gebruiken in een opvolgendRequest
-object of stap binnen je Zest-script of automation plan.
-
Deze aanpak vereist dat je werkt met Zest of met aangepaste scripting binnen je automation plan.
-
Test dit goed, want een fout in je regex kan ertoe leiden dat je een onvolledige of ongeldige URL gebruikt.