Testland
Browse all skills & agents

burp-headless

Configures and runs headless Burp Suite Professional / Enterprise vulnerability scans (a "Burp scan"): Pro drives scans via its local REST API, Enterprise runs CI-driven scans at scale via its server API; supports BApp Store extensions (BCheck, custom scanners) and authenticated targets via session-handling rules; exports issues as HTML / XML / CSV / JSON or SARIF. Use when the team has a Burp Suite license and wants to run a vulnerability scan with Burp - paid-tier dynamic application security testing (DAST) layered on top of OWASP ZAP.

Install with skills.sh (any agent)

npx skills add testland/qa --skill burp-headless
View source

burp-headless

Overview

Per portswigger.net/burp/documentation/desktop/automated-scanning (opens in new window), Burp Scanner "is a web vulnerability scanning tool built into Burp Suite Professional" that maps the attack surface and identifies vulnerabilities in web applications and APIs.

How you run it headless depends on your license edition - see Step 1.

When to use

  • The team has a Burp Suite Professional or Enterprise license.
  • ZAP coverage isn't sufficient for a specific use case (e.g., Burp's BApp Store has a tool ZAP doesn't).
  • A penetration-testing team uses Burp interactively and wants CI-runnable scans for the same target.
  • Enterprise edition's scheduled scan + dashboard model fits the team's scale.

For most teams, zap-baseline + nightvision-dast cover the same surface without Burp's licensing friction.

How to use

  1. Confirm the license edition - Pro (per-user desktop) or Enterprise (CI-enabled) - before authoring workflows (Step 1).
  2. Install and activate: Pro via license file, Enterprise on a dedicated server + database (Step 1).
  3. Drive scans: Pro via the local REST API (Step 2), Enterprise via its server REST API from CI (Step 3).
  4. Load any needed BApp Store extensions and configure session-handling rules plus a login macro for authenticated targets (Steps 4-5).
  5. Run against staging, then triage findings and record every false-positive suppression with a justification (Step 6).
  6. Export issues (HTML / XML / CSV / JSON, or SARIF via BurpToSarif) and aggregate with ZAP + NightVision output (Step 7).
  7. Gate the CI job per severity threshold (Step 3, references/enterprise-ci.md).

Step 1 - License + install

Licensing (canonical, referenced elsewhere): Burp Pro is per-user desktop tooling whose headless / unattended use is constrained; Enterprise is "enterprise-enabled" and the intended fit for CI-driven scanning per burp-as (opens in new window). Verify your edition's headless / CI terms before authoring workflows.

Burp Pro: download Burp Suite Pro from portswigger.net/burp/pro; each user activates via license file. Headless invocation requires the Pro license to be valid (license-server activation for multi-user setups).

Burp Enterprise: server-side install per portswigger.net/burp/documentation/enterprise. Requires dedicated infrastructure + DB (MySQL/PostgreSQL).

Step 2 - Pro: REST API for scan control

Burp Pro exposes a REST API (when enabled in User Settings → REST API). Pattern:

# Start a scan via Pro REST API
curl -X POST "http://127.0.0.1:1337/v0.1/scan" \
  -H "Content-Type: application/json" \
  -d '{
    "scope": { "include": [{"rule": "https://app.example.com/.*"}] },
    "scan_configurations": [{"name": "Crawl strategy - fastest", "type": "NamedConfiguration"}],
    "urls": ["https://app.example.com/"]
  }'

Returns a task ID. Poll for completion + retrieve issues:

curl http://127.0.0.1:1337/v0.1/scan/<task_id>

The REST API surface is documented in Burp's User Settings → REST API → API Documentation tab.

Step 3 - Enterprise: CI integration

Burp Enterprise stores scan configurations and targets server-side and is the intended fit for CI-driven scanning: a CI script triggers a scan via the Enterprise REST API, polls for completion, downloads issues as JSON, then gates per severity. See references/enterprise-ci.md for the full workflow and a GitHub Actions example.

Step 4 - BApp Store extensions

Per burp-as (opens in new window) the "BApp Store" model - extensions distributed via the in-Burp store. Common useful extensions:

  • BCheck - custom-rule DSL for Burp; community + paid rules
  • Active Scan++ - additional active scan checks
  • HTTP Request Smuggler - specialized smuggling tests
  • JWT Editor - JWT manipulation for auth testing
  • Param Miner - parameter discovery

For headless / CI use, extensions can be loaded via Burp's extension config (Burp → Extender → Extensions → Add → load .jar / .py / BApp). Enterprise edition manages extension allowlists centrally.

Step 5 - Authentication via session-handling rules

Burp's session handling is rule-based (User Options → Sessions → Session Handling Rules). Each rule defines:

  • Scope (which URLs trigger this rule)
  • Actions (run a macro to re-login, set headers, etc.)
  • Conditions (run only if logged-out indicator detected)

Macros record a multi-step login flow (visit → fill form → submit → assert success). Burp re-runs the macro mid-scan when sessions expire.

For CI/headless use, embed the configured session handling rules in the project file - Burp re-loads them on --project-file=....

Step 6 - False-positive triage (MANDATORY)

Burp's three suppression mechanisms:

MechanismWhereWhen to use
Issue suppression in scan configScan config: "Issue types to detect"Categorical exclusion (e.g., disable SSL/TLS issues for staging-only HTTP)
Custom-issue rule (BCheck)Project: BCheck definitionPer-project pattern (e.g., suppress findings on legacy admin endpoints)
Server-side mark-as-FP (Enterprise)Enterprise dashboardPersistent + auditable
Pro: per-issue notesRight-click issue → Add noteIn-tool only; no audit trail

Justification template (mandatory in BCheck or Enterprise notes):

# BCheck: suppress SQL injection finding on /search?q=
# Reason: parameter pre-validated via Joi schema (line 42)
# Reviewer: alice@example.com (2026-05-15)
# Expires: 2026-12-15
# Re-review-date: 2026-12-15

given response.body matches "alice|bob|charlie"
then
    suppress

Cadence: Enterprise dashboard's "Resolved as False Positive" filter periodically; review for staleness. Pro requires manual notes audit.

Step 7 - Output formats

Burp Pro export: Issue → Right-click → Report selected issues → HTML / XML / CSV / Burp's own JSON.

Burp Enterprise REST API returns issues as JSON natively; aggregate it with ZAP + NightVision output for a combined verdict.

For SARIF (GitHub Code Scanning): use the BurpToSarif community converter (BApp Store).

Worked example

A team holds a Burp Suite Enterprise license and wants CI-gated coverage of app.example.com staging, layered on their existing ZAP baseline.

  1. In the Enterprise dashboard they register the site (site_id: 42) and a scan configuration (scan_configuration_id: 7) that skips SSL/TLS issue types (staging is HTTP-only).
  2. A session-handling rule with a login macro re-authenticates when the scanner hits the logged-out banner, keeping authenticated routes in scope (Step 5).
  3. The GitHub Actions job (references/enterprise-ci.md) triggers the scan, polls until status: succeeded, and downloads burp-issues.json.
  4. A suppression BCheck marks the known /search?q= finding as a false positive with reviewer + expiry, committed to the repo (Step 6).
  5. The job parses burp-issues.json, fails on any High severity, and uploads the SARIF conversion to GitHub Code Scanning (Step 7).

Result: every merge to the staging branch runs a licensed Burp scan whose findings sit alongside ZAP and NightVision output in one severity-gated verdict.

Anti-patterns

Anti-patternWhy it failsFix
Burp Pro headless in CI without checking licenseLicense violation; legal riskVerify Pro license terms; use Enterprise for CI
Suppress per-issue note in Pro (no audit trail)Notes lost in repo migrationsUse BCheck rules (committed to repo) or Enterprise mark-as-FP
Skip session handling for authenticated appsScanner gets stuck on login; coverage 0%Configure session handling rules + macro (Step 5)
Run Burp scan against productionActive probes corrupt dataStaging only
BApp Store extensions without security reviewSupply-chain riskEnterprise extension allowlist

Limitations

  • Headless / CI licensing differs by edition (see Step 1).
  • Burp Enterprise requires dedicated server infrastructure + database; non-trivial ops cost.
  • BApp Store extensions vary in quality; some are abandoned.
  • REST API surface is stable but version-specific; consult in-tool API docs.

References

  • burp-as (opens in new window) - automated scanning overview
  • portswigger.net/burp/documentation - Pro + Enterprise docs
  • portswigger.net/burp/documentation/enterprise - Enterprise CI
  • portswigger.net/bappstore - BApp Store
  • zap-baseline, nightvision-dast - sister DAST tools (use ZAP first; Burp adds layered paid coverage)
  • dast-scan-cadence-author - build-an-X for layered DAST

Burp Enterprise CI integration

View source (opens in new window)

Burp Enterprise CI integration

Burp Enterprise (CI-friendly) workflow:

  1. Enterprise server stores scan configurations + targets.
  2. CI script triggers a scan via the Enterprise REST API.
  3. CI script polls for completion + downloads issues as JSON.
  4. CI script parses + gates per severity.

The full CI-driven scanning model is documented per automated scanning (opens in new window) "CI-driven scanning"; consult portswigger.net/burp/documentation/enterprise for current API endpoints (the surface is stable but per-version specifics evolve).

GitHub Actions workflow (Enterprise model)

jobs:
  burp-enterprise:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Burp Enterprise scan
        run: |
          SCAN_ID=$(curl -s -X POST "${{ secrets.BURP_ENT_URL }}/api/scans" \
            -H "Authorization: ${{ secrets.BURP_ENT_TOKEN }}" \
            -d '{"site_id":42,"scan_configuration_id":7}' \
            | jq -r '.id')
          echo "SCAN_ID=$SCAN_ID" >> $GITHUB_ENV
      - name: Wait for scan completion
        run: |
          while true; do
            STATUS=$(curl -s "${{ secrets.BURP_ENT_URL }}/api/scans/$SCAN_ID" \
              -H "Authorization: ${{ secrets.BURP_ENT_TOKEN }}" | jq -r '.status')
            [ "$STATUS" = "succeeded" ] && break
            [ "$STATUS" = "failed" ] && exit 1
            sleep 30
          done
      - name: Download issues
        run: curl -s "${{ secrets.BURP_ENT_URL }}/api/scans/$SCAN_ID/issues" \
            -H "Authorization: ${{ secrets.BURP_ENT_TOKEN }}" -o burp-issues.json

Related skills

dast-scan-cadence-author

Designs an end-to-end DAST cadence for teams adopting dynamic scanning: ZAP passive baseline (PR-blocking) then ZAP full active scan (nightly on staging) then optional Burp Pro deep scan (per-release). Handles the baseline-finding ratchet for legacy apps so pre-existing findings do not immediately block PRs, plus per-tool per-run deduplication and CI workflow YAML. Use when the team is setting up DAST from scratch or restructuring scan cadence, not when tools are already running and you need to merge their output (cross-tool aggregation of existing independent runs is a separate concern).

nightvision-dast

Configures and runs NightVision white-box-assisted DAST: analyzes source code before attacking, traces every finding to its origin line, and drives coverage from OpenAPI / Postman / GraphQL specs rather than crawling. Supports Header, Cookie, TOTP, and recorded Interactive Login auth; exports findings as SARIF for GitHub Code Scanning, plus JSON, CSV, or PDF. Per-finding suppression via Alert Rules; CLI integration via the `nightvision` command. Use when source-traceable findings and spec-driven request coverage matter, not just authenticated black-box scanning (see zap-authenticated-scans for that).

nuclei-dast

Installs and runs ProjectDiscovery Nuclei template-based HTTP scanning: selects templates via `-t {path}` and `-tags`/`-severity` filters, controls request rate with `-rl`, emits JSONL output via `-j` for cross-tool finding aggregation, authors custom YAML matchers for app-specific checks, and gates CI on severity thresholds. Use when the team runs Nuclei alongside ZAP for template-driven DAST coverage, needs fuzzing-style probes beyond ZAP passive scan, or wants to operationalize community CVE templates in a pipeline.

zap-authenticated-scans

Configures authenticated DAST sessions in ZAP - ZAP Context + Authentication Method (form, JSON, script, browser-based, HTTP/NTLM), Session Management strategy (cookie, header, script), Verification Strategy (regex indicators, poll-URL), CSRF token handling, OAuth/bearer header injection, logged-in/logged-out indicator calibration, and context XML export for use with `-n` in baseline and full scans. Use when the team needs DAST coverage of authenticated routes - the most common DAST gap and the hardest DAST setup to get right.

zap-baseline

Configures and runs OWASP ZAP baseline scanning: `zap-baseline.py` Docker-packaged spider + passive scan suitable for CI gating; supports `-t target_url` + `-r html_report` + `-c config_file` rule customization (INFO/IGNORE/FAIL warnings) and Ajax spider via `-j` for JS-heavy SPAs. Passive-only; for active injection probes use `zap-full-scan.py` via zap-authenticated-scans. Accepts `-n context_file` for pre-configured auth contexts (see zap-authenticated-scans for setting up auth from scratch). Use when the user runs OWASP ZAP for pre-prod web app DAST.