Skip to main content
Blackbox scanning tests a web application from the outside without access to source code. Vigolium sends crafted HTTP requests and analyzes responses to find vulnerabilities.

Quick Start

Strategies

Use --strategy to control how much reconnaissance Vigolium performs before dynamic testing.

Lite, Fast, Minimal Discovery

Runs only the dynamic-assessment phase against the provided targets. No crawling, no content discovery.
Best for: quick checks, CI pipelines, known endpoints.
Since v0.4.5, lite also carries a pace ceiling — concurrency 10, rate limit 20 req/s, max-per-host 10 — on top of selecting fewer phases. Before that, lite and balanced opened a crawl identically: a name every operator reads as “gentler on the target” was gentler in module count alone.The ceiling only ever narrows. An explicitly typed --concurrency / --rate-limit / --max-per-host overrules it (an operator overruling the preset is the point of having both), and a scanning_pace config already gentler than lite is not dragged up to it. balanced is the baseline and deep is explicitly the one that opens wide, so neither ships a ceiling.

Balanced, Default

Runs content discovery, browser spidering, known-issue-scan analysis, and audit.
Best for: general-purpose scanning with good coverage.

Deep, Maximum Recon

Adds external intelligence harvesting (Wayback Machine, CommonCrawl, etc.) on top of balanced.
Best for: thorough assessments where you want to discover forgotten endpoints and historical paths.

Phase-by-Phase Walkthrough

Input Formats

Vigolium accepts targets in multiple formats via -I / --input-mode:
-T/--target-file reads its file as one target URL per line, so a spec or an export must go through -i/--input — pointing -T at a YAML spec makes every line of that file a target. The exceptions are the two formats that genuinely are target lists: urls and burpscope.

External Harvesting

Queries external data sources for historical URLs and endpoints. Enabled by --strategy deep or --external-harvest.
Sources: Wayback Machine, CommonCrawl, AlienVault OTX, Arquivo.pt are keyless and enabled by default; URLScan and VirusTotal join the set only once their API key is configured in vigolium-configs.yaml under external_harvester.api_keys. Configure the active set with external_harvester.sources. Wayback and CommonCrawl also mine archived response bodies, not just the index:
  • Wayback replays each capture through /web/<ts>id_/ (the raw, un-rewritten copy) and walks every main host’s robots.txt history — the old Disallow: lines name paths no crawler was ever allowed to record.
  • CommonCrawl range-fetches the WARC record each index row already locates, which is one small gzip member rather than the whole archive file.
Index rows are emitted verbatim — an index row is what the archive recorded, including the malformed URLs a scanner once requested. Mined URLs are the ones that get filtered: scope-checked on a label boundary, junk-extension filtered, and stripped of archive hostnames, so mining a page can’t fan the scan out across every CDN and analytics host it references. Mining is gated on the index carrying timestamps (a replay is addressed by timestamp) and capped by fixed per-domain budgets, since the phase runs unattended.

Content Discovery

Brute-force directory and file discovery using the deparos engine. Enabled by --strategy balanced/deep or --discover.
The discovery engine uses recursive brute-forcing (default depth 5), observed filename variants, JS analysis, and case-sensitivity auto-detection.

Browser Spidering

Chromium-based crawling that handles SPAs, JavaScript rendering, and form interactions. Enabled by --strategy balanced/deep or --spider.
Spider flags:
  • -b / --browsers, number of browser instances (default: 1)
  • -E / --browser-engine, chromium, ungoogled, or fingerprint (default: chromium)
  • --headless: headless mode (default: true)
  • --no-cdp: disable CDP event listener detection
  • --no-forms: disable automatic form filling
  • --spider-max-time: max duration (default: 30m)

Known Issue Scan

Runs Nuclei templates and Kingfisher secret scanning against discovered hosts and response bodies. Enabled by --strategy balanced/deep or by the strategy. By default, known-issue-scan enriches its target list with path prefixes discovered in previous phases (discovery, spidering). This increases coverage, Nuclei templates run against individual path prefixes (e.g., https://example.com/api/v1/) rather than just the host root. Disable this for faster but less granular scans:
Pinning it skips the one-time nuclei-templates clone into ~/nuclei-templates. Since v0.4.5 that first-run clone announces itself rather than looking like a hung scan.

Dynamic Assessment

The core scanning phase (canonical name dynamic-assessment; aliases audit, dast, assessment). Runs active and passive modules against all discovered HTTP records. Enabled in all strategies. Uses a feedback loop (up to 3 rounds): after each round, checks for newly discovered records and rescans if found. OAST (Out-of-band Application Security Testing) injects blind callback payloads when configured:

Performance Tuning

CLI Speed Flags

Scanning Pace (Config File)

The scanning_pace section in vigolium-configs.yaml provides centralized speed control. Common values serve as a baseline inherited by all phases; per-phase subsections override specific values.
Precedence (highest to lowest): CLI flags > scanning profile > per-phase overrides > common values > built-in defaults.

Proactive WAF/CDN Pacing

An aggressive active phase can burst a WAF/CDN edge into a rate-based block — and once the edge starts filtering, the findings that would have surfaced are hidden behind challenge pages. To stay ahead of that, the per-host rate limiter pre-throttles a host the first time earlier-phase traffic fingerprints it behind a recognized edge, before the heavy phase ever fires:
  • Detection reads ordinary responses — headers on plain 200s are enough to fingerprint CloudFront, Cloudflare, Akamai, Imperva/Incapsula, Sucuri, and Azure Front Door. No block or challenge is required to arm the pacing.
  • On the first match, per-host concurrency drops to a quarter of its ceiling (MaxPerHost/4), then ramps back up on healthy responses so a well-behaved edge isn’t paced forever.
  • The drop prints once per host as a [waf-pacing-armed] notice (for example 40→10), so you can see exactly when and how far a host was throttled.
This is the proactive half of Vigolium’s WAF handling: it slows down before an edge blocks. It complements the reactive WAF-block warning (the one-time-per-host [waf-block-detected] notice covered on the discovery phase page), which fires after a confirmed block. Passing --no-waf-pacing disables only the proactive pacing; the reactive back-off after a confirmed block is unaffected.

Output Formats

Multiple formats can be combined with a comma, e.g. --format jsonl,html.

Lightweight Scan Commands

For quick, targeted scans of individual URLs or raw requests.

scan-url: Single URL

scan-request: Raw HTTP Request

When phase flags (--discover, --spider, --external-harvest, --known-issue-scan) are used with these commands, they delegate to the full Runner pipeline (database required).

Module Selection

Hand-picking modules auto-skips known-issue-scan. Narrowing a scan to specific modules (--module-id, or -m/--modules) signals a targeted, low-noise run, so Vigolium auto-appends --skip known-issue-scan — otherwise the broad Nuclei/Kingfisher known-issue pass would flood the results. A one-line console note explains the auto-skip; pass --only known-issue-scan to force the pass back on. It’s a no-op when --only is set or when no module narrowing is active, and is silent under --silent.

Filtering by Tag

Modules are tagged with classification labels (e.g., spring, rails, django, xss, injection, light). Use --module-tag to run only modules matching specific tags:
Tags are matched with OR logic, a module runs if it matches any of the specified tags. When both -m and --module-tag are provided, the results are merged (union).

Custom Extensions

Load JavaScript or YAML extension modules alongside or instead of built-in modules. See Extension Scanning for full details.

Heuristics

Pre-flight checks detect WAFs, redirects, and technology before scanning. Controlled via --heuristics-check:
Heuristics are automatically disabled when --only is used.

OAST (Out-of-Band Testing)

OAST detects blind vulnerabilities where the application triggers an out-of-band callback (DNS/HTTP) instead of reflecting payloads in the response. Vigolium uses an interactsh server for callback tracking. OAST is enabled by default. The OAST probe module injects callback URLs into insertion points and monitors for interactions during and after the scan.
Configuration in vigolium-configs.yaml:

Mutation Strategy

The mutation strategy controls how Vigolium generates payloads for parameter fuzzing. Value-aware mutation analyzes the original parameter value, classifies it by semantic type, and generates type-appropriate mutations.
Recognized value types include: integer, UUID, email, JWT, boolean, path, sequential ID, and 15+ others. Each type has specialized neighbor, boundary, and escalation mutations.

Project Scoping

Use --project-uuid (with a UUID) or --project-name (with a name) to scope all scan data to a specific project for multi-tenant isolation. Both are global flags, so they work on every command, not just scan:
See Projects for the full multi-tenancy reference.

Common Scenarios