SAFE-FIRST PROBES · GITHUB-ALIGNED · EVIDENCE · REMEDIATION

Web Security Payload Field Manual

Context-aware probes for authorized web security testing across XSS, injection, SSRF, GraphQL, uploads, prototype pollution, cache issues, and more - with signals, stop conditions, and root-cause fixes.

Authorized testing only Start with a safe-first probe. Stop when the security boundary is proven.
Read the testing method
24test categories
156reviewed probes
Safe-firstrisk labels
2026-10-05last reviewed

Curated against public references including github.com, portswigger.net, cheatsheetseries.owasp.org. Every probe keeps SecurityCipher safe-first wording, signals, and stop conditions.

XSS PLAYBOOK

Cross-Site Scripting

Trace untrusted input to its exact browser context before trying an executable proof.

9 probes
01

Reflection canary

Safe first

Map reflection and encoding without executing script.

sc-xss-7f3a<>'"&
What to watch

The marker appears in HTML, an attribute, JavaScript, CSS, or a URL. Record which characters are encoded and where.

02

HTML element context

Active proof

Confirm executable markup only after raw HTML injection is established.

<img src=x onerror=alert(location.origin)>
What to watch

A dialog shows the current origin. If markup renders but the handler does not run, inspect CSP and sanitization.

03

Double-quoted attribute

Context specific

Test whether a double-quoted attribute can be closed and a new event attribute added.

" autofocus onfocus=alert(location.origin) x="
What to watch

Focus reaches the injected element and the handler runs. This payload is invalid for single-quoted or unquoted contexts.

04

Single-quoted JavaScript string

Context specific

Test insertion inside a single-quoted JavaScript string.

';alert(location.origin);//
What to watch

The string terminates, the call executes, and the remaining source is commented. Escaping rules change for JSON and template literals.

05

DOM hash source

Active proof

Check whether client-side code moves location.hash into an HTML sink.

#<img src=x onerror=alert(location.origin)>
What to watch

The fragment is not sent to the server, so execution indicates a browser-side source-to-sink path.

06

SVG onload context

Active proof

Test SVG markup contexts after HTML injection is established.

<svg onload=alert(location.origin)>
What to watch

A dialog or console proof tied to the SVG sink confirms execution. CSP may still block handlers.

07

Template literal breakout

Context specific

Probe insertion inside a JavaScript template literal.

${alert(location.origin)}
What to watch

Expression evaluation indicates a template-literal sink. Escape rules differ from quoted strings.

08

Angular-style expression

Context specific

Fingerprint client-side template expression evaluation without assuming Angular version.

{{constructor.constructor('alert(location.origin)')()}}
What to watch

Execution or a framework-specific error justifies deeper client-template testing. Prefer framework docs for current versions.

09

JS protocol navigation

Active proof

Check sinks that place untrusted values into href, action, or similar URL contexts.

javascript:alert(location.origin)
What to watch

Navigation executes script in the page origin. Many browsers restrict javascript: in some contexts.

SQLi PLAYBOOK

SQL Injection

Change one input at a time and compare a true condition with a false control.

9 probes
01

Quote differential

Safe first

Detect an unhandled string delimiter with the smallest possible mutation.

'
What to watch

A repeatable status, body, header, or timing change may indicate query parsing. A generic 500 alone is not proof.

02

String true control

Read-only probe

Create a true predicate in a common single-quoted WHERE context.

' AND '1'='1'-- 
What to watch

Compare against the false control using the same request and stable application state.

03

String false control

Read-only probe

Provide the negative control for boolean-based testing.

' AND '1'='2'-- 
What to watch

A consistent content or behavior difference between true and false conditions is stronger evidence than either response alone.

04

Numeric false control

Read-only probe

Test a numeric expression without introducing a quote.

1 AND 1=2
What to watch

An empty result or changed response compared with the original numeric value can reveal expression evaluation.

05

MySQL short delay

Explicit scope

Validate a blind MySQL path when content-based controls are unavailable.

' AND SLEEP(2)-- 
What to watch

Use repeated baseline and delayed samples. Network jitter or slow application code can create false positives.

06

UNION column fingerprint

Read-only probe

Find whether a UNION SELECT path accepts a single NULL column in a string context.

' UNION SELECT NULL-- 
What to watch

A changed result set or syntax error about column count guides the next controlled UNION step. Escalate only with explicit scope.

07

ORDER BY differential

Read-only probe

Detect injectable ORDER BY positions using a small column-index change.

1 ORDER BY 2-- 
What to watch

Compare against ORDER BY 1 and an out-of-range index. Stable differences suggest expression evaluation.

08

PostgreSQL short delay

Explicit scope

Validate a blind PostgreSQL timing path when content controls are unavailable.

'; SELECT pg_sleep(2)-- 
What to watch

Repeated baseline versus delayed samples should show a stable delta. Account for connection pooling jitter.

09

Stacked query marker

Explicit scope

Check whether the driver or ORM allows a second statement after a terminator.

';SELECT 'sc_sql_7f3a'-- 
What to watch

Seeing the marker or a multi-statement error is informative. Do not run destructive stacked statements.

SSRF PLAYBOOK

Server-Side Request Forgery

Begin with a unique callback you control. Internal addresses require explicit authorization.

9 probes
01

Controlled callback

Safe first

Detect server-side DNS or HTTP access without targeting internal infrastructure.

https://unique-id.your-callback.example/
What to watch

Correlate a unique token, timestamp, source address, DNS lookup, and HTTP request in your callback logs.

02

Redirect revalidation

Controlled host

Check whether policy is applied to every redirect hop.

https://your-callback.example/redirect-to-approved-target
What to watch

A callback from the first hop is expected; reaching a disallowed second destination indicates incomplete revalidation.

03

IPv4 loopback

Explicit scope

Test whether the server can reach its own loopback interface.

http://127.0.0.1/
What to watch

A response that differs from a controlled unreachable address may indicate internal access, but error handling can obscure results.

04

IPv6 loopback

Explicit scope

Find validation that blocks IPv4 loopback but misses IPv6.

http://[::1]/
What to watch

Compare with the IPv4 result and a negative control. The target service may not listen on IPv6.

05

Reserved documentation address

Negative control

Use an RFC 5737 documentation address as a non-production negative control.

http://192.0.2.1/
What to watch

This address should not identify a real Internet host. Fast rejection versus a timeout can reveal validation behavior, not SSRF by itself.

06

Decimal IP loopback

Explicit scope

Find filters that only block dotted-quad 127.0.0.1.

http://2130706433/
What to watch

A response consistent with loopback access indicates weak IP literal validation.

07

file scheme probe

Explicit scope

Detect whether non-HTTP URL schemes reach the server-side fetcher.

file:///etc/hosts
What to watch

Any local file content or scheme-specific error outside HTTP policy is a finding. Prefer fixtures when available.

08

Cloud metadata hostname

Explicit scope

Test link-local cloud metadata reachability only with written authorization.

http://169.254.169.254/latest/meta-data/
What to watch

Metadata body or distinctive headers prove cloud SSRF impact. Stop after minimal proof and do not harvest secrets.

09

DNS rebinding candidate

Controlled host

Use a controlled dual-A DNS name to test resolve-then-connect TOCTOU gaps.

https://rebind-unique-id.your-callback.example/
What to watch

Correlate DNS answers with later connections. A second resolve to a private address after an allowlisted first answer is the signal.

SSTI PLAYBOOK

Server-Side Template Injection

Use arithmetic fingerprinting. Do not jump from evaluation to command execution.

9 probes
01

Literal canary

Safe first

Observe whether template-looking input remains literal or triggers a controlled error.

sc-ssti-7f3a{{not_a_real_name}}
What to watch

A literal echo is not vulnerable. Removal, substitution, or a template-specific error justifies engine-aware testing.

02

Jinja2 or Twig arithmetic

Non-destructive

Test expression evaluation without reading data or invoking functions.

{{7*7}}
What to watch

A rendered value of 49 suggests evaluation, but multiple engines share this syntax.

03

Engine differential

Fingerprint only

Distinguish engines that repeat strings from engines that coerce or reject the expression.

{{7*'7'}}
What to watch

For example, Jinja2 commonly renders seven copies of 7 while Twig commonly renders 49. Version and configuration can differ.

04

Expression Language

Non-destructive

Check Java EL, FreeMarker, and other dollar-brace expression contexts.

${7*7}
What to watch

A value of 49 indicates expression handling but does not identify the engine by itself.

05

ERB arithmetic

Non-destructive

Test an ERB-style output expression without accessing files or executing commands.

<%= 7*7 %>
What to watch

A rendered value of 49 indicates evaluation in an ERB-like context.

06

Freemarker arithmetic

Non-destructive

Confirm Freemarker or similar dollar-brace evaluation without invoking dangerous builtins.

${7*7}
What to watch

Rendered 49 supports evaluation. Do not jump to Execute or object introspection.

07

Pebble or Thymeleaf style

Non-destructive

Fingerprint Thymeleaf-style inline expression contexts.

[[${7*7}]]
What to watch

A rendered 49 or template parse error specific to Thymeleaf justifies engine-aware follow-up.

08

Handlebars expression

Explicit scope

Probe Handlebars helper or constructor paths carefully after simpler canaries fail.

{{#with "s" as |string|}}{{string.constructor.constructor "return 7*7"}}{{/with}}
What to watch

Evaluation or a sandbox error is enough. Prefer non-RCE proofs in reports.

09

Mako arithmetic

Non-destructive

Test Mako or similar Python template expression syntax without OS access.

${7*7}
What to watch

Rendered 49 indicates evaluation. Confirm engine via error messages before any further probe.

JWT PLAYBOOK

JSON Web Token Validation

Change one header or claim at a time. Decoding a token is not signature verification.

9 probes
01

Baseline header review

Inspection

Record the token type, algorithm, and key identifier before making changes.

{"alg":"RS256","typ":"JWT","kid":"key-2026-07"}
What to watch

The server must choose acceptable algorithms and key sources from configuration, not trust arbitrary header values.

02

Unsigned token rejection

Test account only

Confirm that an unsigned token is rejected even if its claims look valid.

{"alg":"none","typ":"JWT"}
What to watch

Any authenticated response is a failure. A robust implementation rejects the token before authorization logic.

03

Expired token

Safe negative

Verify that an expiration in the past is enforced.

{"exp":1}
What to watch

The token should be rejected with a consistent authentication error. Allow only a small documented clock-skew window.

04

Audience mismatch

Safe negative

Confirm that a token minted for another recipient is not accepted.

{"aud":"https://not-this-service.example"}
What to watch

The service should reject the token even when the signature is otherwise valid.

05

Remote key header

Controlled host

Confirm that the verifier does not fetch keys from an attacker-selected URL.

{"jku":"https://your-controlled.example/jwks.json"}
What to watch

No callback should occur and the token should be rejected unless the URL is on a strict, intentional allowlist.

06

Algorithm confusion candidate

Test account only

Check whether an RS256-configured API also accepts HMAC with a public key as the secret.

{"alg":"HS256","typ":"JWT"}
What to watch

Acceptance of a forged HMAC token signed with the published public key is a critical failure. Use only test accounts.

07

Empty kid rejection

Test account only

Probe key lookup with an empty kid value.

{"alg":"RS256","typ":"JWT","kid":""}
What to watch

Unexpected acceptance or path traversal into a default key file indicates unsafe kid handling.

08

Issuer mismatch

Safe negative

Confirm issuer validation rejects tokens from the wrong authority.

{"iss":"https://not-this-issuer.example"}
What to watch

The service should reject the token even when the signature would otherwise verify against an unrelated key set.

09

Embedded jwk header

Test account only

Verify the verifier ignores attacker-supplied embedded public keys.

{"alg":"RS256","typ":"JWT","jwk":{"kty":"RSA","n":"...","e":"AQAB"}}
What to watch

No authentication success should occur when the header carries an untrusted jwk. Callbacks are not expected.

Traversal PLAYBOOK

Path Traversal

Use a harmless fixture created for the test. Avoid reading operating-system or application secrets.

8 probes
01

Controlled parent path

Safe fixture

Attempt to read a harmless fixture placed one directory above the intended root.

../sc-traversal-proof.txt
What to watch

A unique fixture marker proves boundary escape without exposing sensitive files.

02

URL-encoded parent path

Safe fixture

Check whether decoding occurs after an early validation step.

%2e%2e%2fsc-traversal-proof.txt
What to watch

The same fixture appears only for the encoded request, indicating inconsistent normalization order.

03

Double-encoded parent path

Safe fixture

Detect a second decoding layer between a proxy, framework, and file API.

%252e%252e%252fsc-traversal-proof.txt
What to watch

The fixture appears after multiple decode passes. Confirm the exact component sequence before reporting.

04

Windows separator

Safe fixture

Test path handling on Windows or cross-platform libraries.

..\sc-traversal-proof.txt
What to watch

The fixture appears when backslashes are interpreted as directory separators.

05

Absolute-path rejection

Safe fixture

Confirm that an absolute path cannot bypass the intended base directory.

/tmp/sc-traversal-proof.txt
What to watch

A controlled fixture outside the content root must remain inaccessible.

06

Null-byte truncation legacy

Safe fixture

Detect legacy null-byte truncation between validation and the file API.

../sc-traversal-proof.txt%00.png
What to watch

Fixture content with a trailing encoded null suggests truncation. Modern runtimes often reject this.

07

Nested traversal

Safe fixture

Bypass naive filters that only strip a single ../ sequence.

....//....//sc-traversal-proof.txt
What to watch

Fixture content after nested dots indicates incomplete sanitization.

08

UNC-style path

Safe fixture

Test Windows UNC path handling when the app runs on Windows or emulates it.

\\sc-traversal-share\sc-traversal-proof.txt
What to watch

Unexpected share access or distinctive errors indicate UNC interpretation. Prefer local fixtures.

LFI PLAYBOOK

File Inclusion

Prove inclusion with controlled fixtures or unique markers. Avoid dumping password files by default.

5 probes
01

Fixture include

Safe fixture

Include a harmless fixture placed outside the intended template directory.

../sc-lfi-proof.txt
What to watch

Fixture marker text in the response proves local file inclusion without touching system secrets.

02

PHP wrapper expect denial

Explicit scope

Check whether dangerous PHP stream wrappers are enabled in include sinks.

expect://id
What to watch

Command output or wrapper-specific errors indicate expect:// availability. Prefer php://filter for read-only proofs when needed.

03

php filter base64 read

Safe fixture

Read a controlled fixture through php://filter without executing it.

php://filter/convert.base64-encode/resource=sc-lfi-proof.txt
What to watch

Base64 of the fixture marker in the response proves wrapper-assisted LFI.

04

Remote include URL

Controlled host

Detect allow_url_include style remote inclusion against a host you control.

https://unique-id.your-callback.example/sc-rfi.txt
What to watch

Callback plus included marker content proves RFI. Do not host executable shells.

05

Null-byte legacy include

Safe fixture

Test legacy truncation that appends .php after validation.

../sc-lfi-proof.txt%00
What to watch

Fixture content despite a forced suffix indicates null-byte truncation.

Command PLAYBOOK

OS Command Injection

Use a unique printed marker. Do not read files, open shells, or make external connections.

8 probes
01

Semicolon marker

Explicit scope

Test command separation with a harmless, deterministic output marker.

;printf sc_cmd_7f3a
What to watch

The marker appears in the response or captured process output.

02

AND operator marker

Explicit scope

Test execution after a preceding command succeeds.

&&printf sc_cmd_7f3a
What to watch

The marker appears only when the original command returns success.

03

Pipe marker

Explicit scope

Test whether input reaches a shell pipeline.

|printf sc_cmd_7f3a
What to watch

The marker appears even though pipeline behavior may replace or combine normal output.

04

Encoded newline

Explicit scope

Check whether URL decoding introduces a command separator.

%0aprintf%20sc_cmd_7f3a
What to watch

The marker appears after a decoding layer converts %0a to a newline.

05

Short timing control

Rate limited

Validate blind execution when output is not returned.

;sleep 2
What to watch

Repeated requests show a stable two-second delta over baseline. Use low concurrency and account for jitter.

06

Backtick marker

Explicit scope

Test POSIX command substitution with a harmless marker.

`printf sc_cmd_7f3a`
What to watch

Marker output indicates backtick evaluation inside a shell.

07

Dollar parenthesis marker

Explicit scope

Test modern command substitution syntax.

$(printf sc_cmd_7f3a)
What to watch

Marker output indicates $(...) evaluation. Prefer printf markers over file or network commands.

08

Windows ampersand marker

Explicit scope

Probe Windows cmd.exe chaining on Windows targets only.

& echo sc_cmd_7f3a
What to watch

Marker appears in process output. Do not use destructive commands.

XXE PLAYBOOK

XML External Entity

Prove entity processing with an internal marker before attempting any external lookup.

6 probes
01

Internal entity marker

Safe first

Detect DTD and entity expansion without file or network access.

<?xml version="1.0"?><!DOCTYPE r [<!ENTITY sc "sc_xxe_7f3a">]><r>&sc;</r>
What to watch

The parsed value contains sc_xxe_7f3a. Internal expansion alone is not proof that external entities are enabled.

02

External HTTP callback

Controlled host

Confirm external entity resolution against a host you control.

<?xml version="1.0"?><!DOCTYPE r [<!ENTITY sc SYSTEM "https://unique-id.your-callback.example/xxe">]><r>&sc;</r>
What to watch

A correlated DNS or HTTP callback proves outbound resolution. The XML response need not include callback content.

03

XInclude callback

Controlled host

Test XInclude processing when you cannot control the XML document type.

<r xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="https://unique-id.your-callback.example/xinclude" parse="text"/></r>
What to watch

A callback or included controlled marker indicates that XInclude is processed.

04

SVG internal entity

Safe first

Check an image-processing path with a non-network entity marker.

<?xml version="1.0"?><!DOCTYPE svg [<!ENTITY sc "sc_svg_7f3a">]><svg xmlns="http://www.w3.org/2000/svg"><text>&sc;</text></svg>
What to watch

The rendered or transformed output contains the unique text marker.

05

Parameter entity callback

Controlled host

Test parameter-entity resolution when classic general entities are blocked.

<?xml version="1.0"?><!DOCTYPE r [<!ENTITY % sc SYSTEM "https://unique-id.your-callback.example/xxe-param">%sc;]><r/>
What to watch

A correlated callback proves outbound DTD fetching even if the document body stays empty.

06

DOCTYPE rejection baseline

Safe first

Confirm the parser rejects or ignores DOCTYPE declarations by policy.

<?xml version="1.0"?><!DOCTYPE r [<!ENTITY sc "x">]><r/>
What to watch

Hardened services return a clear rejection. Silent acceptance of DOCTYPE warrants deeper XXE tests.

Redirect PLAYBOOK

Open Redirect

Use a harmless destination you control and verify the actual Location header.

7 probes
01

Absolute external URL

Controlled host

Test whether a redirect parameter accepts an arbitrary origin.

https://your-controlled.example/sc-redirect
What to watch

A 3xx Location header or client-side navigation reaches the exact controlled URL.

02

Scheme-relative URL

Controlled host

Check validation that only rejects strings beginning with http.

//your-controlled.example/sc-redirect
What to watch

The browser inherits the current scheme and navigates to the controlled host.

03

Backslash authority

Browser dependent

Identify URL parsers that normalize backslashes into authority separators.

\\your-controlled.example\sc-redirect
What to watch

Browser and server parsing can differ. Confirm the final browser destination rather than relying only on string validation.

04

Userinfo confusion

Controlled host

Check whether validation mistakes userinfo for the destination host.

https://trusted.example@your-controlled.example/
What to watch

The actual host is your-controlled.example; trusted.example is the username component.

05

Encoded scheme-relative URL

Controlled host

Check whether validation and redirect execution happen before and after different decode steps.

%2f%2fyour-controlled.example%2fsc-redirect
What to watch

The final Location value or browser destination resolves to the controlled host.

06

Data URI destination

Browser dependent

Check whether redirect sinks accept data: URLs.

data:text/html,sc-redirect
What to watch

Browser navigation into a data: document can enable phishing. Confirm the final client destination.

07

Path-relative confusion

Controlled host

Find validators that allow root-relative paths but browsers interpret an authority.

/\your-controlled.example/sc-redirect
What to watch

Final navigation to your-controlled.example is the signal. Server and browser parsers may disagree.

NoSQL PLAYBOOK

NoSQL Injection

Use impossible predicates as negative controls. Test authentication logic only with dedicated accounts.

7 probes
01

JSON type mismatch

Safe first

Check whether an endpoint enforces a string schema before building a query.

{"username":{"unexpected":"sc_probe"}}
What to watch

A clean 4xx validation error is expected. Query-engine errors or changed results indicate unsafe type handling, not necessarily injection.

02

MongoDB impossible operator

Negative control

Detect whether a client-supplied MongoDB operator reaches the query layer.

{"username":{"$eq":"sc-user-that-cannot-exist"}}
What to watch

Compare with the same impossible value as a plain string. A behavior difference suggests operator interpretation.

03

MongoDB not-equal operator

Test account only

Test operator injection using a dedicated test workflow.

{"username":{"$ne":"sc-user-that-cannot-exist"}}
What to watch

Broader results or an authentication-state change indicates unsafe query construction. Stop after minimal proof.

04

Query-string operator

Negative control

Check frameworks that parse bracket notation into nested objects.

username[$eq]=sc-user-that-cannot-exist
What to watch

Compare with username=sc-user-that-cannot-exist and inspect server-side parsing if available.

05

Regex exact negative

Negative control

Test regex operator handling without enumerating real usernames.

{"username":{"$regex":"^sc_user_that_cannot_exist$"}}
What to watch

A difference from the equivalent plain string can reveal operator acceptance while preserving a no-match control.

06

MongoDB greater-than operator

Test account only

Detect overly broad operator injection that widens result sets.

{"username":{"$gt":""}}
What to watch

Unexpected authentication or enumeration versus an empty-string baseline indicates operator reach.

07

JavaScript where operator

Explicit scope

Check whether server-side JavaScript query forms are accepted.

{"username":{"$where":"return false"}}
What to watch

Acceptance or engine errors around $where are enough. Do not run expensive or looping expressions.

GraphQL PLAYBOOK

GraphQL Injection

Start with introspection and authorization checks. Treat every field resolver as its own API.

6 probes
01

Introspection probe

Safe first

Check whether schema introspection is exposed to untrusted clients.

{"query":"{ __schema { queryType { name } } }"}
What to watch

A schema payload in the response expands the attack surface. Many programs still allow it in staging only.

02

Field suggestion leak

Safe first

Use an invalid field to see whether suggestions or verbose errors reveal real field names.

{"query":"{ scNonexistentField }"}
What to watch

Did-you-mean hints or stack traces disclose schema details useful for further testing.

03

Batching amplification

Rate limited

Detect whether array batching multiplies expensive operations without rate limits.

[{"query":"{ __typename }"},{"query":"{ __typename }"}]
What to watch

Both operations execute in one HTTP request. Combine with authz tests carefully and keep concurrency low.

04

Alias duplication

Rate limited

Check alias-based duplication as a simpler alternative to HTTP batching.

{"query":"query { a:__typename b:__typename c:__typename }"}
What to watch

Many aliased fields succeed where depth limits alone are insufficient. Watch CPU and resolver timing.

05

IDOR-style node access

Test account only

Test object access with another user's identifier in a dedicated test tenant.

{"query":"query($id:ID!){ node(id:$id){ id ... on User { email } } }","variables":{"id":"User:2"}}
What to watch

Email or private fields for User:2 without entitlement is broken object authorization, not injection.

06

Directive or nested depth canary

Safe first

Establish a tiny baseline before increasing nesting depth in later requests.

{"query":"{ a:__typename }"}
What to watch

Use this as the control when comparing against deeper nested queries for complexity limits.

Upload PLAYBOOK

Insecure File Upload

Validate type, content, and storage location. Prefer harmless markers over web shells.

5 probes
01

Extension allowlist probe

Explicit scope

Check double-extension handling against an image-only allowlist.

filename=sc_upload_7f3a.php.png
What to watch

If the server stores or serves the file as executable PHP, the allowlist is unsafe. Prefer non-exec proof when possible.

02

Content-Type mismatch

Safe first

Send a text body with an image Content-Type to test trust in client MIME claims.

Content-Type: image/png
(body is plain text marker sc_upload_7f3a)
What to watch

Acceptance without content sniffing indicates weak validation. Stored XSS or parse errors are secondary signals.

03

SVG script marker

Active proof

Upload SVG only when the product claims to allow SVG images.

<svg xmlns="http://www.w3.org/2000/svg" onload="console.log('sc_upload_7f3a')"></svg>
What to watch

Script execution when the SVG is opened in-browser proves stored XSS via upload. Prefer console markers over alerts in shared apps.

04

Path in filename

Safe fixture

Detect directory escape through the multipart filename parameter.

filename=../sc_upload_7f3a.txt
What to watch

File appears outside the upload directory or overwrite occurs. Use unique fixture names only.

05

Null-byte legacy name

Explicit scope

Probe legacy truncation between validation and filesystem write.

filename=sc_upload_7f3a.php%00.png
What to watch

Stored name becomes .php or validation bypasses the image suffix. Modern stacks often reject nulls.

Proto PLAYBOOK

Prototype Pollution

Pollute only disposable objects in a test app. Confirm gadget impact before claiming RCE.

5 probes
01

JSON proto key

Safe first

Test whether recursive merges copy __proto__ from JSON into Object.prototype.

{"__proto__":{"scPolluted":"sc_proto_7f3a"}}
What to watch

After the request, ({}).scPolluted === 'sc_proto_7f3a' in the same app context proves pollution.

02

Constructor prototype path

Safe first

Bypass filters that only block the literal __proto__ key.

{"constructor":{"prototype":{"scPolluted":"sc_proto_7f3a"}}}
What to watch

The same polluted property on a fresh object is the signal.

03

Query-string proto

Safe first

Check server-side qs parsers that turn bracket notation into recursive objects.

__proto__[scPolluted]=sc_proto_7f3a
What to watch

Server behavior changes for unrelated objects or explicit debug output of polluted keys confirm the issue.

04

Client hash gadget canary

Safe first

Probe client-side parsers that read location.hash into merge helpers.

#__proto__[scPolluted]=sc_proto_7f3a
What to watch

A page script reading ({}).scPolluted after hash parsing proves client-side pollution.

05

Nested merge bypass

Safe first

Find nested merge helpers that sanitize only the top level.

{"a":{"__proto__":{"scPolluted":"sc_proto_7f3a"}}}
What to watch

Pollution still appears on Object.prototype when nested keys are merged unsafely.

LDAP PLAYBOOK

LDAP Injection

Use impossible filters as negative controls. Avoid dumping directories in production scopes.

5 probes
01

Filter metachar probe

Safe first

Inject LDAP filter metacharacters to detect unsafe concatenation.

sc_ldap_7f3a)(
What to watch

Directory errors, empty results, or authentication anomalies versus a plain string baseline are signals.

02

Always-true filter attempt

Test account only

Classic always-true filter pattern for login or search fields.

*)(uid=*))(|(uid=*
What to watch

Broader results or unexpected auth success on a test account indicates filter injection. Stop at minimal proof.

03

Null bind style blank

Rate limited

Check wildcard handling in search or login inputs.

*
What to watch

Enumerating many entries with a single star suggests missing allowlists. Limit result size in tests.

04

Escaped control comparison

Safe first

Compare properly escaped input against raw metacharacters.

sc_ldap_\2a_7f3a
What to watch

Safe APIs treat the escaped form as literal data. Behavioral gaps versus raw * help confirm injection.

05

Attribute OR injection

Test account only

Probe attribute injection in multi-attribute filters.

x*)(mail=*))(|(mail=*
What to watch

Unexpected mail attributes in results show filter logic compromise. Use synthetic directory data when possible.

CSRF PLAYBOOK

Cross-Site Request Forgery

Prove state-changing requests can be forged from another origin. Prefer harmless actions.

5 probes
01

Token absence check

Test account only

Submit a legitimate state-changing form without the anti-CSRF token.

POST /account/email (omit csrf token field)
What to watch

A successful change proves missing server-side token validation. Use a disposable test account.

02

Token reuse across accounts

Test account only

Check whether tokens are bound to the session or user.

csrf=TOKEN_FROM_ACCOUNT_A on ACCOUNT_B request
What to watch

Acceptance of another account's token indicates weak binding.

03

Content-Type JSON simple request

Test account only

Probe whether cookie-auth JSON endpoints accept simple content types without tokens.

Content-Type: text/plain
{"email":"sc-csrf@your-controlled.example"}
What to watch

State change from a cross-origin form-like request proves CSRF on an API that assumed JSON was safe.

04

SameSite none review

Safe first

Inventory session cookies that remain valid in cross-site contexts.

Set-Cookie: session=...; SameSite=None; Secure
What to watch

SameSite=None cookies require strong CSRF tokens. Lax/Strict reduce but do not replace token checks for all cases.

05

Method override confusion

Test account only

Test verb overrides that bypass method-specific CSRF middleware.

POST /account/email?_method=PUT
What to watch

State change through an unexpected verb path indicates middleware gaps.

Root-cause fix

Require anti-CSRF tokens on cookie-authenticated state changes, set SameSite thoughtfully, avoid CORS misconfiguration that bypasses token checks, and reject simple content types for sensitive JSON APIs when appropriate.

IDOR PLAYBOOK

Insecure Direct Object References

Swap object identifiers between two test accounts. Prove authorization failure with minimal data exposure.

5 probes
01

Sequential ID swap

Test account only

Request a neighbor object ID with a second test account's session.

GET /api/invoices/1002 (auth as owner of 1001)
What to watch

Invoice fields for 1002 in the response prove missing object-level authorization.

02

Body ownership override

Test account only

Submit another user's object ID while keeping your session cookies.

{"invoice_id":1002,"user_id":1001}
What to watch

Successful update or read indicates the server trusted the client ownership field.

03

Encoded ID tamper

Test account only

Decode opaque-looking identifiers that are only encoded, not encrypted or authorized.

id=MTAwMg== (base64 of 1002)
What to watch

Access to 1002 after decoding shows obscurity without authorization.

04

Horizontal function reuse

Test account only

Call a higher-privilege export route with a normal user token.

GET /api/admin/users/2/export with non-admin session
What to watch

Export data or 200 instead of 403 indicates broken function-level authorization.

05

Cross-tenant GUID

Test account only

Use a resource GUID from tenant B while authenticated to tenant A.

GET /api/t/tenant-b/resources/11111111-1111-1111-1111-111111111111
What to watch

Resource payload from tenant B is a tenancy isolation failure.

Deserialize PLAYBOOK

Insecure Deserialization

Fingerprint parsers with benign objects. Do not deliver gadget chains on production data.

5 probes
01

Java serialized stream magic

Safe first

Detect Java serialization by looking for base64 that starts with the ac ed magic.

rO0AB
What to watch

Server errors mentioning ObjectInputStream or acceptance of rO0AB blobs justify deeper review. Do not send gadget chains.

02

PHP unserialize canary

Safe first

Probe PHP unserialize sinks with a harmless stdClass object.

O:8:"stdClass":1:{s:4:"mark";s:12:"sc_deser_7f3a";}
What to watch

Application logic reflecting sc_deser_7f3a or unserialize errors confirms the sink. Avoid POP chains.

03

Python pickle marker note

Inspection

Identify pickle usage from docs, errors, or non-production fixtures rather than blind RCE opcodes.

pickle ASCII opcode mark: (sc_deser_7f3a
What to watch

Any server acceptance of pickle bytes from clients is high risk. Prefer replacing pickle with JSON.

04

.NET type field

Safe first

Test JSON.NET TypeNameHandling style type discriminators with a benign type.

{"$type":"System.Object, mscorlib","mark":"sc_deser_7f3a"}
What to watch

Unexpected type loading errors or honor of $type without allowlists is the signal. Do not load gadget types.

05

YAML object canary

Explicit scope

Check whether YAML loaders resolve tags into objects.

!!python/object/apply:str [sc_deser_7f3a]
What to watch

Constructed objects or loader errors about python/object tags prove unsafe YAML loading. Use safe_load equivalents.

CRLF PLAYBOOK

CRLF Injection

Prove header or log injection with a unique marker. Avoid session fixation proofs on shared accounts.

5 probes
01

Header marker injection

Safe first

Test whether encoded CRLF reaches an HTTP response header context.

sc%0d%0aX-SC-Injected:%20sc_crlf_7f3a
What to watch

A reflected X-SC-Injected response header containing the marker proves splitting or header injection.

02

Set-Cookie injection attempt

Explicit scope

Check whether attackers can inject a Set-Cookie header via CRLF.

sc%0d%0aSet-Cookie:%20sc_crlf=1
What to watch

An unexpected Set-Cookie for sc_crlf indicates response splitting. Use only disposable test browsers.

03

Log forging marker

Safe first

Detect newline injection into application or access logs.

sc_user%0aERROR sc_crlf_7f3a fake event
What to watch

A forged log line containing the marker appears beside the real event. Avoid flooding production logs.

04

Location header split

Controlled host

Probe redirect sinks that copy input into Location without sanitizing newlines.

https://trusted.example/%0d%0aX-SC-Injected:%20sc_crlf_7f3a
What to watch

Extra response headers after Location prove splitting. Confirm with a raw HTTP client.

05

HTTP/2 downgrade note

Safe first

Retest over HTTP/1.1 if the front end speaks HTTP/2, because splitting behavior differs by protocol.

sc%0d%0aX-SC-Injected:%20sc_crlf_7f3a
What to watch

HTTP/2 rejects raw newlines in many stacks. A failure on h2 with success on h1 still matters behind misconfigured downgrades.

HPP PLAYBOOK

HTTP Parameter Pollution

Send duplicate parameters and compare which value each tier honors.

5 probes
01

Duplicate query winner

Test account only

Send two values for the same query key and see which one authorization uses.

role=user&role=admin
What to watch

If the app authorizes as admin while logs show user, parsing is inconsistent across layers.

02

Array vs scalar

Safe first

Mix array and scalar forms for the same logical parameter.

id[]=1&id=2
What to watch

Unexpected type coercion or the ignored value becoming authoritative is the signal.

03

Body and query clash

Test account only

Supply the same name in query string and body on a POST endpoint.

GET id=1 with POST body id=2
What to watch

Security checks reading one source while business logic reads the other enable bypasses.

04

Comma-joined values

Safe first

Check whether a single parameter with commas becomes a list in one tier and a string in another.

id=1,2
What to watch

Differential behavior between WAF and app parsers can hide or create access bugs.

05

Header and parameter twin

Test account only

Compare trusted header injection points against user-controlled parameters of the same name.

X-User-Id: 1 plus user_id=2
What to watch

If either value can override identity checks, document which component trusted which source.

Smuggle PLAYBOOK

HTTP Request Smuggling

Use timing and benign desync probes only. Confirm lab or explicit written scope before any desync testing.

5 probes
01

CL.TE ambiguity probe

Explicit scope

Send a deliberately ambiguous CL.TE request in a lab or explicitly scoped environment.

Content-Length: 6
Transfer-Encoding: chunked

0

G
What to watch

Timeouts, unexpected 400 classes, or desync symptoms justify specialist follow-up. Do not poison shared frontends casually.

02

TE.CL ambiguity probe

Explicit scope

Probe TE.CL confusion only with authorization and isolated infrastructure.

Transfer-Encoding: chunked
Content-Length: 4

5c
GPOST /
0

What to watch

Desync indicators differ by proxy. Prefer PortSwigger lab methodology over production spray.

03

Obfuscated Transfer-Encoding

Explicit scope

Check whether duplicate or obfuscated TE headers are inconsistently honored.

Transfer-Encoding: chunked
Transfer-Encoding: xchunked
What to watch

Different treatment by edge versus origin is the classic desync prerequisite.

04

HTTP/2 downgrade review

Inspection

Map whether an HTTP/2 front end downgrades to HTTP/1.1 backends that reintroduce desync classes.

:method PUT with http2 to http1 backend
What to watch

Architecture notes plus a controlled lab proof are enough for many reports. Avoid live poisoning.

05

Timing baseline

Safe first

Capture clean timing and status baselines before any ambiguous request.

normal POST with Content-Length matching body
What to watch

Without a baseline, timeouts are not evidence. Keep concurrency at one during desync research.

Cache PLAYBOOK

Web Cache Deception

Use unique paths and accounts. Never poison shared caches with other users' private data.

5 probes
01

Static suffix on private path

Test account only

Request an authenticated path with a static-looking suffix while logged in.

/account/settings/sc_cache_7f3a.css
What to watch

If the response contains private account HTML and later loads without cookies, the cache keyed on the static suffix.

02

Path delimiter confusion

Test account only

Exploit delimiter differences between cache and origin routers.

/account/settings;sc_cache_7f3a.js
What to watch

Cached private content under a delimiter variant is the finding. Compare with a logged-out fetch.

03

Encoded slash variant

Test account only

Test encoding discrepancies in cache key normalization.

/account%2fsettings/sc_cache_7f3a.css
What to watch

Private body cached under the encoded path indicates normalization bugs.

04

Cache-Control review

Safe first

Inspect sensitive responses for directives that prevent shared caching.

Cache-Control: private, no-store
What to watch

Missing no-store on authenticated HTML is a configuration finding even before deception succeeds.

05

Unkeyed header probe

Controlled host

Check whether an unkeyed header changes response content that still gets cached.

X-Forwarded-Host: your-controlled.example
What to watch

Poisoned Location or absolute URLs served to later victims indicate web cache poisoning. Use unique cache busters.

CORS PLAYBOOK

CORS Validation

CORS is enforced by browsers. Inspect both preflight and actual responses with and without credentials.

7 probes
01

Untrusted origin

Safe first

Check whether an arbitrary origin is reflected or broadly allowed.

Origin: https://your-controlled.example
What to watch

Access-Control-Allow-Origin matching the untrusted origin is risky when sensitive data is available, especially with credentials.

02

Null origin

Safe request

Test whether sandboxed documents, local files, or opaque origins are trusted.

Origin: null
What to watch

Access-Control-Allow-Origin: null can expose data when attackers can generate a null origin.

03

Trusted-prefix confusion

Controlled host

Find suffix or substring checks that mistake an attacker domain for a trusted origin.

Origin: https://trusted.example.your-controlled.example
What to watch

The server must reject this unless the exact origin is intentionally trusted.

04

Trusted-suffix confusion

Review ownership

Test weak prefix checks and document the actual DNS ownership boundary.

Origin: https://your-controlled.example.trusted.example
What to watch

Acceptance may be intended only if trusted.example controls and secures every possible subdomain.

05

Credentialed preflight

Safe request

Inspect the policy returned before a cross-origin API request.

OPTIONS /api/account HTTP/1.1
Origin: https://your-controlled.example
Access-Control-Request-Method: GET
What to watch

Review Access-Control-Allow-Origin, Access-Control-Allow-Credentials, allowed methods and headers, and Vary: Origin together.

06

Wildcard with credentials smell

Safe request

Review responses for the forbidden wildcard-plus-credentials combination.

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
What to watch

Browsers reject this pairing, but seeing it in raw headers indicates a broken CORS configuration worth fixing.

07

Arbitrary method reflection

Safe request

During preflight, check whether dangerous methods are reflected broadly.

Access-Control-Request-Method: PUT
What to watch

Allowing PUT, DELETE, or uncommon methods for untrusted origins expands impact when ACAO is loose.

Headers PLAYBOOK

HTTP Security Headers

Treat headers as browser policy, not substitutes for secure application logic.

7 probes
01

Content Security Policy baseline

Adapt before use

Establish a restrictive starting policy before adding required sources and script nonces.

Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
What to watch

Check browser console violations and verify that the final policy does not rely on unsafe-inline or broad wildcards.

02

Transport security

Stage carefully

Tell supporting browsers to use HTTPS for the host and its subdomains.

Strict-Transport-Security: max-age=31536000; includeSubDomains
What to watch

Send HSTS only over HTTPS. Add includeSubDomains only after every subdomain supports HTTPS; preload has separate requirements and consequences.

03

MIME sniffing

Recommended

Require browsers to honor declared MIME types in relevant script and style contexts.

X-Content-Type-Options: nosniff
What to watch

Verify accurate Content-Type headers too; nosniff does not repair an incorrect media type.

04

Referrer policy

Review privacy

Send full referrers on same-origin requests and only the origin cross-origin, while avoiding HTTPS-to-HTTP leakage.

Referrer-Policy: strict-origin-when-cross-origin
What to watch

Choose a stricter value if paths or query strings contain sensitive data.

05

Permissions policy

Adapt before use

Disable browser capabilities the application does not require.

Permissions-Policy: camera=(), microphone=(), geolocation=()
What to watch

Inventory real feature and iframe needs before rollout; unsupported directives are ignored by browsers.

06

Clickjacking defense

Recommended

Prefer CSP frame-ancestors over legacy X-Frame-Options alone.

Content-Security-Policy: frame-ancestors 'none'
What to watch

The page should refuse framing by unexpected origins. Verify with a controlled iframe test page.

07

Cross-origin opener policy

Adapt before use

Isolate the browsing context from cross-origin openers when the app needs stronger isolation.

Cross-Origin-Opener-Policy: same-origin
What to watch

Popup and postMessage flows may break; stage carefully and confirm intended cross-window behavior.

FIELD METHOD

From probe to defensible finding

A copied string is never the test by itself. Context, a negative control, repeatable evidence, and a root-cause fix turn an observation into a useful finding.

  1. 01
    Confirm scope

    Check the asset, account, test window, prohibited techniques, data rules, and stop conditions.

  2. 02
    Map the context

    Record where input travels and which parser, browser, query, template, or process handles it.

  3. 03
    Use a control

    Compare one changed input against a stable baseline and an expected-negative request.

  4. 04
    Capture minimal evidence

    Preserve the request, response, timestamp, account, environment, and observed security boundary.

  5. 05
    Stop and remediate

    Do not escalate after impact is clear. Explain the root cause, safe fix, and retest condition.