Scanner group

Attack surface and exposure

Four pages about what an application gives away before anyone exploits it. Discovery builds the endpoint inventory every dynamic scanner works from; the three scanners here then ask one cheap question each, a known request or a known file, and decide on a string match in what comes back.

3 scanners + discovery2 DAST1 SASTup to Highno credentials needed

How this group works

No payload crafting, no two-account comparison, no timing oracle. Each scanner sends one well-known request (or reads one well-known file), then looks for a fixed string in the response. The inventory from discovery tells the dynamic scanners where to send it; the repository tells the static one what to read.

Target app https://app.example HTML · bundles · spec forms · probed paths Repository openapi.yaml only when a repo is given Endpoint inventory GET / GET /api/Users POST /api/orders POST /graphql GET /rest/v1/tasks bundles · spec · forms · probes base URL = scheme + host http_probe · DAST · fixed-cost path check on the base URL requestGET /.env response200 · non-HTML KEY=VALUE HIGHconfidence 0.90 graphql · DAST · only paths containing /graphql, /api/graphql, /gql requestPOST { __schema } response2xx · "__schema" in it MEDIUMconfidence 0.90 openapi · SAST · spec files in the repo, found by an openapi: or swagger: marker readopenapi.yaml evidenceno ^security: line HIGHconfidence 0.85 Shared rule: one request or one file read, then a fixed string in what came back. No exploit chain, so confidence is set by the check, 0.70 to 0.90.

1Everything starts from the target URL. Playwright renders the page and keeps the HTML and every JavaScript file it pulled in. A repository is optional and only the static scanner uses it.

2Endpoint discovery turns bundles, a served spec, HTML forms and a short list of probed paths into the inventory. The scanners in this group take the inventory as given; the HTTP probe also derives the base URL (scheme plus host) from its first entry.

3HTTP probe. Known paths are fetched on the base URL. GET /.env that returns 200, a non-HTML content type and a KEY=VALUE line is reported as an exposed sensitive file at High. An SPA shell that merely contains an "=" is ignored. Nothing is exploited.

4GraphQL. Only endpoints whose path contains /graphql, /api/graphql or /gql are touched. An introspection query that comes back 2xx with __schema, __type or "types" in the body means the whole schema is public.

5OpenAPI (SAST). Any .yaml, .yml or .json file carrying an openapi: or swagger: marker is a spec. A spec with no securitySchemes or no top-level security: line describes an API that is public by default.

6The three share one shape: a cheap probe, a string match, a finding whose confidence is fixed per check rather than measured. That is why they run early, run at quick depth, and need no credentials. The pages below show each scanner's full check list and the guards that keep the string match honest.

Scanners in this group

At a glance

ScannerWhat it looks atWhat it reportsSeverityNeeds
Endpoint discoveryRendered HTML, every JS bundle and lazy chunk, 13 well-known spec paths per API base, forms and query links, probed API basesNot findings: the categorised, ranked endpoint inventory the DAST scanners consumen/aTarget URL. Credentials add the authenticated crawl; --probe-writes adds derived POST/PUT endpoints
HTTP probeFour error-trigger paths and eight sensitive paths on the base URL, then OPTIONS, TRACE, forged Host and CRLF query payloads against ranked endpointsVerbose error page, exposed .git/HEAD or .env, directory listing, TRACE or CONNECT enabled, Host header reflected, CRLF header injectionMedium to HighTarget URL only. Quick depth. 900 s timeout, stops itself at 85 % of it
GraphQLInventory entries whose path contains /graphql, /api/graphql or /gqlIntrospection enabled, no query depth limit, batch queries acceptedLow to MediumTarget URL only. Quick depth. 600 s timeout. Nothing runs if no path matches
OpenAPI spec.yaml, .yml, .json files in the indexed repo that contain an openapi: or swagger: markerNo global security scheme, http:// server URL, Basic auth, API key in query, security: [] override, sensitive path without global securityMedium to HighRepository only. No LLM, no binary

The HTTP probe and GraphQL scanners are auth-aware: when a login session exists from the authenticated crawl, its headers ride along on every request so protected endpoints are probed too. Neither requires one.

Why this class matters

Why it matters

These findings are reconnaissance, and reconnaissance is where every attack starts. An exposed .env hands over database credentials; an exposed .git lets the source be reconstructed; a stack trace names the framework, file paths and query structure; a GraphQL schema or a Swagger document is a complete map of the API with the auth requirements of every route. Individually each looks low-risk. Chained, they decide which endpoint an attacker goes after first and with what payload.

Real-world context

GitLab, 2019: GraphQL introspection was enabled by default, and researchers used it to enumerate private project information and user data. GitLab then restricted introspection in production. Exposed .env files, .git directories and Swagger documents at /api-docs or /swagger.json are among the most common bug bounty findings; automated scanners probe the internet for these paths continuously, and thousands of production sites have leaked database credentials and API keys this way.