Skip to main content

Security Findings from Captured Traffic

Every snapshot and replay report is scanned for security problems in the traffic itself: credentials sent without TLS, JWTs that never expire, CORS that trusts everyone, card numbers in response bodies, inputs that look like SQL or path traversal, and more. There is nothing to install or configure. The traffic you captured for testing is the input, so you get findings for the endpoints your service really serves and calls.

The scanners read traffic; they do not attack your service. A finding means the traffic shows the problem or a pattern that often comes with it, so treat each one as a lead to confirm in code.

Where to find them​

In the dashboard, open a replay report and click its Recommendations tab, or open a snapshot and click Recommendations, then Traffic Recommendations. Security findings are listed with the other traffic recommendations under the Security category; pick it in the Category filter to see only those. Snapshots are scanned when they are analyzed, and reports are scanned again on the replayed traffic.

In proxymock, the same scanners run on local recordings:

  • proxymock report --in <recording> writes a report whose security section lists the findings. --format html --out report.html writes a self-contained page (without --out the HTML goes to stdout), --format prompt writes a digest for an AI agent, and --format dir --out <dir> writes security.json and one fix prompt per finding under fix-prompts/.
  • In proxymock web, open Requests, switch the view to Report, and scroll to Findings, auth posture, and transport hygiene.
  • The generate_report MCP tool gives an agent the same report.

Read a finding​

Each finding names the problem and its severity: Critical, High, Medium or Low. In the dashboard, a finding card shows:

  • AI Coding Prompt to Resolve: a prompt you can paste into Claude Code, Cursor or another coding agent. It describes the problem, the security context and a summary of the request and response that triggered it: the method and URL, the header names, and the start of each body.
  • Evidence: what was seen, such as how many requests sent credentials over plain HTTP and to which endpoint. When the evidence has a link, Investigate opens the report or snapshot tab it points to in a new browser tab.
  • Affected Services: the endpoints involved.
  • Related RRPairs: the requests that triggered the finding.

proxymock also shows each finding's confidence and its CWE and OWASP Top 10 references, and can filter findings by any of them and group them by severity, scanner or endpoint. Confidence is certain when the traffic proves the problem, such as a JWT with alg=none. It is firm when the pattern is strong, and tentative when it is a candidate that often has an innocent explanation. Severity in proxymock is high, medium or low, with critical counted as high.

There is no dismiss button. A finding is fixed in your code, and it goes away when traffic captured after the fix no longer shows it.

What is checked​

Credentials and tokens​

FindingFlags whenSeverityCWE
Credentials transmitted over plaintext HTTPA request carries a password, API key, bearer token, session cookie or Basic auth over http://High319
JWT-shaped token exposed in URL query stringA JWT appears in a query string, where logs and proxies keep itHigh598
JWT presented with alg=noneA JWT's header says alg=noneCritical347
JWT with empty signature segmentA JWT has no signatureHigh347
JWT kid header contains a path traversal sequenceA JWT kid contains .. or starts with a slashHigh22
Symmetric-key JWT (HSxxx) presented over plaintextAn HS256-style JWT travels without TLSMedium327
JWT has no expiration claimA JWT has no expMedium613
JWT Token with Long ExpirationA JWT is valid for more than three daysMedium
Expired JWT Token AcceptedA request with an expired JWT gets a successful responseHigh
JWT payload contains PII claimA JWT carries email, phone, SSN, address, national ID or date of birthLow359
Cookie value contains JWT / base64-encoded JSONA cookie value is readable data rather than an opaque idMedium200
Authenticated response is cacheableA response to an authenticated request can be cached by a browser or proxyLow525

JWTs are decoded without checking their signature, to read the claims.

Injection and request input​

FindingFlags whenSeverityCWE
Potential SQL Injection DetectedA query parameter or body value contains SQL keywords with injection patterns such as ' OR '1'='1 or UNION SELECTCritical
NoSQL query operator in request bodyA JSON body key is a MongoDB operator such as $ne, $gt or $whereHigh943
Path traversal sequence in requestThe URL or an input contains ../ or an encoded form of itHigh22
Serialized-object payload acceptedA request body starts with a Java, Python pickle posix gadget, .NET or PHP serialized-object markerHigh502
Request carries both Transfer-Encoding and Content-Length headersA request could be read two ways by a proxy and a server, the setup for request smugglingHigh444
Open-redirect candidateA redirect's Location contains a value from the requestMedium601
URL-shaped value in request input (SSRF candidate)An input is a URL, such as http://, file:// or gopher://Medium918
Template-engine syntax in request input (SSTI candidate)An input contains template syntax such as {{...}} or ${...}Medium1336
LDAP filter syntax in request inputAn input looks like an LDAP filterMedium90
Privilege-related field in request body (mass-assignment risk)A body sets a field such as isAdmin, role, tenant_id or __proto__, outside admin endpointsMedium915
Request input reflected verbatim in response bodyA query value comes back unchanged in the response, a reflected XSS candidateLow79

Responses, headers and cookies​

FindingFlags whenSeverityCWE
CORS Access-Control-Allow-Origin: * with credentialsA credentialed request gets Access-Control-Allow-Origin: *Medium942
Set-Cookie missing flagA cookie is set without HttpOnly, SameSite, or Secure over TLSMedium1004
Content-Security-Policy uses permissive directiveThe CSP allows unsafe-inline, unsafe-eval, data: or *Medium1021
HSTS explicitly disabled / below recommended minimumA TLS response sets HSTS with max-age under six monthsHigh319
TLS page references http:// resource (mixed content)An HTML page served over TLS loads something over http://Medium319
Developer / debug surface exposedA path such as /swagger, /.env, /.git/config, /actuator/env or /debug/pprof answers successfullyMedium200
5xx response leaks stack trace, SQL fragment or server file pathAn error response includes internal detailsLow209
Server header reveals software versionThe Server header includes a versionLow200
Technology fingerprint header exposedA header such as X-Powered-By or X-AspNet-Version names the stackLow200
Deprecated security header in responseA response sets X-XSS-Protection or HTTP public key pinningLow757

Sensitive data in bodies​

Request and response bodies are searched for a possible payment card number (High), a possible US Social Security number (High), an AWS access key id (High), a PEM private key block (High) and email addresses (Low). For JSON, the finding names the field path where the value was found.

Values that DLP redacted before storage are not matched, since the scanners only see the redacted placeholder.

Behavior across many requests​

These look at patterns over many requests. Most need at least ten observations of an endpoint; the IDOR, admin and session checks need fewer. Most are tentative:

FindingFlags whenSeverityCWE
Same auth token accesses multiple records (IDOR candidate)One token successfully reads three or more different numeric ids on the same routeHigh639
Session cookie value unchanged across login (fixation risk)A client keeps the same session cookie before and after logging inHigh384
Single auth token hits both admin and regular endpointsOne token succeeds on /admin/ paths and on ordinary onesMedium269
No rate-limiting on auth endpointTen or more failed logins within a minute and never a 429Medium307
Login response varies measurably by username (enumeration risk)Response sizes from one login endpoint vary by 30% or more across ten or more attemptsMedium204
Identifiers on this endpoint look predictableIds on a route are sequential or look like timestampsLow340
Endpoint response time has wide variance (timing side-channel)p95 latency is five or more times p50Low208

Keep in mind​

  • Both directions are scanned. Calls your service makes to its dependencies are scanned too, so a finding can be about a third party, such as a vendor's Server header. The endpoint on the finding tells you which side it is.
  • Tentative findings need a look. A search box that echoes its query, a webhook field that takes a URL, or an admin API that accepts role will all show up as candidates. The confirmation is in your code.
  • Findings follow the traffic. An endpoint that was not exercised in the captured traffic is not checked, and a header that appears only on some responses is judged on those.
  • One finding per check and endpoint. Repeated hits add to a finding's count and related requests instead of creating new findings, and endpoints that differ only by an id in the path are merged. Header and exposed-path findings group every endpoint that shares the same value, the session fixation and admin token findings cover the whole capture, and some checks report one endpoint more than once, such as one finding per missing cookie flag set or per Content-Security-Policy directive.

Check that a fix worked​

Capture the traffic again after the fix and compare it with the old recording:

proxymock report --in ./proxymock/recorded-after --baseline ./proxymock/recorded-before --format html --out compare.html

The comparison sorts each finding into new, persistent or resolved, so you can see the fix land and catch anything it introduced.

proxymock: auth posture and transport hygiene​

Beyond findings, the proxymock report summarizes two things worth a glance, as context for the findings:

  • Auth posture by endpoint: the authentication scheme each endpoint receives (none, Basic, bearer, JWT, API key, AWS SigV4, session or form) and, on endpoints that receive more than one scheme, how many calls carried no credentials.
  • Transport & header hygiene: how many responses came over plain HTTP, and how many TLS responses lacked HSTS, a Content-Security-Policy, X-Frame-Options, Referrer-Policy or X-Content-Type-Options. A missing HSTS header is counted here rather than reported as a finding.