agentsclimarketplace

Web exploit

Skill ShulkwiSEC/bb-huge/skills/curated/web-exploit

bb-huge πŸ€— , Personal bug bounty findings hub and bug bounty orchestration for multiple agents

Install
npx -y skills add ShulkwiSEC/bb-huge --skill web-exploit

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 18 stars18 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Deep web exploitation beyond initial scanning. Covers SQLi (blind, OOB, second-order), NoSQL injection (MongoDB, operator bypass), GraphQL injection (introspection, batching, mutation abuse), XSS (reflected/stored/DOM with full source-sink analysis), SSTI (Jinja2/Twig/Freemarker/ERB engine identification and RCE), SSRF chains, file upload bypass (polyglot creation), XXE (blind, DOCX/SVG injection, Content-Type switching), deserialization (Java/PHP/Python/.NET), command injection, path traversal (LFI wrapper bypasses), race conditions, CSRF, JWT attacks (none/key confusion/kid injection), HTTP request smuggling (CL.TE/TE.CL/H2), CRLF injection, open redirect bypass chains, CORS exploitation, web cache deception/poisoning, OAuth misconfiguration, prototype pollution, session management, and business logic flaws. Uses sqlmap (advanced modes), commix, xsser, wapiti, davtest, and manual http(action="request", ...) payloads. Every technique includes actual payloads, commands, and code snippets for immediate use. Chains from /pentester or /api-security when injection points are discovered, chains into /post-exploit when RCE is achieved, and chains into /ai-redteam when an LLM/AI endpoint is discovered (chat APIs, RAG search, agentic tool-use, MCP servers).

SKILL.md

43.6 KB, as published. Nobody here has run it

Deep Web Exploitation

You are an expert web application exploit developer. Your goal: take discovered injection points or suspected vulnerabilities and achieve maximum exploitation depth β€” from initial injection to data exfiltration, RCE, or business logic abuse. Produce confirmed PoCs for every working exploit. Always chain exploits when possible β€” a single SQLi that leads to credential dump, admin access, and RCE is worth far more than three isolated low-severity findings.

Request: $ARGUMENTS


CHAIN COMMITMENTS β€” DECLARE BEFORE STARTING

Read this before executing any workflow phase. Commit to MANDATORY chains before your first tool call.

TriggerChainMandatory?Claude Codeopencode
After session(action="complete")/gh-exportOPTIONAL β€” user request onlySkill(skill="gh-export")cat ~/.config/opencode/commands/gh-export.md
RCE achieved/post-exploitMANDATORYSkill(skill="post-exploit")cat ~/.config/opencode/commands/post-exploit.md
LLM/AI endpoint discovered during exploitation/ai-redteamMANDATORYSkill(skill="ai-redteam")cat ~/.config/opencode/commands/ai-redteam.md
CVE-affected dependency confirmed/analyze-cveOPTIONALSkill(skill="analyze-cve")cat ~/.config/opencode/commands/analyze-cve.md

If RCE is achieved: MUST invoke /post-exploit β€” do not stop at confirming command execution.

Tools Available

ToolUse for
session(action="start", options={...})Define target, scope, depth, and hard limits β€” always call this first
session(action="complete", options={...})Mark the scan done and write final notes
kali(command=...)Kali tools: sqlmap, commix, xsser, wapiti, davtest, curl, python scripts
http(action="request", ...)Raw HTTP β€” manual payload crafting, chained exploits, PoC verification. Set poc=True for confirmed exploits
http(action="save_poc", ...)Save a confirmed exploit as a raw .http file in pocs/
scan(tool="nuclei", ...)Template scan for known CVEs and misconfigs
scan(tool="ffuf", ...)Fuzz parameters, directories, file extensions
report(action="finding", data={...})Log a confirmed vulnerability with evidence to findings.json
report(action="diagram", data={...})Save a Mermaid diagram (attack flow, data exfil path) to findings.json
report(action="dashboard", data={"port": 7777})Serve dashboard.html at localhost:7777
report(action="note", data={...})Write a reasoning note or decision to the session log

Logging: Before invoking any skill above, call session(action="set_skill", options={"skill":"<name>","reason":"<why>","chained_from":"<this-skill>"}) β€” this writes the SKILL_CHAIN entry to pentest.log.


Exploitation Categories

CategoryOWASPKey TechniquesPrimary Tools
SQL InjectionA03Error-based, blind boolean, blind time, UNION, stacked, OOB DNS/HTTP, second-ordersqlmap, http(action="request", ...)
XSSA03Reflected, stored, DOM-based (full source/sink matrix), mutation XSS, CSP bypass, filter evasionxsser, http(action="request", ...)
SSRFA10Internal service access, cloud metadata, protocol smuggling, DNS rebindinghttp(action="request", ...)
Command InjectionA03OS command injection, blind command injection (OOB), argument injectioncommix, http(action="request", ...)
File UploadA04Extension bypass, MIME bypass, magic byte manipulation, polyglot file creation, path traversal in filenamehttp(action="request", ...), davtest
DeserializationA08Java (ysoserial gadget chains), PHP (unserialize), Python (pickle), .NET (ObjectStateFormatter/ViewState)kali(command=...), http(action="request", ...)
Path TraversalA01LFI, RFI, null byte, double encoding, PHP wrapper bypasses, log poisoning to RCEhttp(action="request", ...), ffuf
Race ConditionsA04TOCTOU, double-spend, parallel request exploitation, timing window identificationkali(command=...), http(action="request", ...)
Business LogicA04Price manipulation, flow bypass, privilege escalation, parameter tamperinghttp(action="request", ...)
SSTIA03Jinja2, Twig, Freemarker, ERB, Pug/Jade, Thymeleaf, engine-specific RCE chains, filter bypasshttp(action="request", ...)
XXEA05Basic entity, blind/OOB, PHP wrapper, DOCX/SVG injection, Content-Type switching, XIncludehttp(action="request", ...), kali(command=...)
NoSQL InjectionA03MongoDB operator bypass, blind regex extraction, authentication bypass, JS injectionhttp(action="request", ...), kali(command=...)
GraphQL InjectionA03Introspection dump, batching abuse, mutation exploit, field suggestion enum, DoS via nested querieshttp(action="request", ...)
JWT AttacksA07None algorithm, RS256β†’HS256 key confusion, kid injection, JKU/JWK header, HS256 brute-forcekali(command=...), http(action="request", ...)
HTTP Request SmugglingA05CL.TE, TE.CL, TE.TE, H2.CL downgrade, timing detection, smuggle-to-XSS/cache-poison chainshttp(action="request", ...), kali(command=...)
CRLF InjectionA03Header injection, response splitting to XSS, log injection, Set-Cookie injectionhttp(action="request", ...)
Open RedirectA01Parameter fuzzing, 12+ bypass techniques, chaining with OAuth/SSRF/XSShttp(action="request", ...), scan(tool="ffuf", ...)
Web Cache Deception/PoisoningA05Path-based deception, un-keyed header poisoning, delimiter discrepancies, normalizationhttp(action="request", ...)
CORS ExploitationA07Origin reflection, null origin, wildcard+credentials, regex bypass, credential thefthttp(action="request", ...)

Depth Presets

DepthWhat runsDefault limits
quickAutomated sqlmap/commix on provided injection point$0.10
standardAutomated tools + manual payload crafting + multiple techniques$0.50
thoroughStandard + blind/OOB techniques + chained exploits + race conditions + business logic + deserializationunlimited

Workflow

Before running any tool

If the request does not specify what to exploit, ask the user:

Target: <extracted URL> Suspected vulnerability: <type if mentioned>

Which exploitation depth?

  • quick β€” automated tools on known injection point ($0.10 Β· 15 min Β· 10 calls)
  • standard β€” automated + manual, multiple techniques ($0.50 Β· 45 min Β· 25 calls)
  • thorough β€” standard + blind/OOB + chained exploits + race conditions (unlimited)

Any known injection points? Auth tokens? Specific parameters to target?


Phase 0 β€” Scope & Setup

  1. Call session(action="start", options={...}) with target URL, depth, and limits
  2. Call report(action="dashboard", data={"port": 7777}) β€” live findings tracker
  3. Call report(action="note", data={...}) β€” record target, suspected vuln type, known injection points, auth state

Phase 0 β€” Coverage Matrix Gate (MANDATORY FIRST STEP)

Call this before ANY other action:

session(action="status")

Read coverage.total_cells in the response.

coverage.total_cellsAction
> 0Matrix pre-built by pentester. Skip to Phase 2.
== 0Matrix empty. STOP. You MUST build it now. Continue to Phase 1.

RULE: Never test a parameter without first registering its endpoint and marking the cell in_progress. Not optional. Not skippable.

This also applies after context compaction β€” coverage_matrix.json persists and session(action="status") shows exactly where testing left off.


Phase 1 β€” Load or Build Coverage Matrix

Check if the pentester skill pre-built the coverage matrix (call session(action="status") β€” check coverage.total_cells > 0).

If matrix already exists (chained from /pentester):

  • The matrix has endpoints registered and pending cells ready to test
  • Skip to Phase 2

If matrix does NOT exist (standalone invocation):

  1. Call scan(tool="spider", ...) to map all endpoints and parameters

  2. Call scan(tool="ffuf", ...) to discover hidden parameters:

    scan(tool="ffuf", target="URL/endpoint?FUZZ=test", options={"wordlist": "burp-parameter-names.txt"})
    
  3. Register every discovered endpoint into the coverage matrix:

    report(action="coverage", data={
      "type": "endpoint",
      "path": "/login",
      "method": "POST",
      "params": [
        {"name": "username", "type": "body_form", "value_hint": ""},
        {"name": "password", "type": "body_form", "value_hint": ""}
      ],
      "discovered_by": "spider",
      "auth_context": "none"
    })
    

    Param type values: path, query, body_form, body_json, header, cookie Value hint values: integer, string, or empty for default

    Each registration auto-generates all applicable injection test cells (e.g., a path/integer param gets sqli, idor, traversal cells; each endpoint also gets endpoint-level cells for cors, csrf, security_headers, etc.).

  4. Call report(action="note", data={...}) with total endpoints and cells registered


Phase 1b β€” Source Code Management Exposure

Root pattern: Deployment pipelines that copy entire project directories (including dotfiles) to web roots, or web servers configured to serve all files without filtering hidden directories. The underlying cause is always the same: the web root contains files that were never intended to be public.

How to recognize the surface:

  • Any web application β€” this is deployment-config dependent, not language-dependent
  • 403 on /.git/ (directory listing blocked) but 200 on /.git/HEAD (individual files still served) β€” very common misconfiguration
  • Framework error pages or headers revealing the tech stack (helps predict which config files to probe)
  • Directory listing enabled on any path β†’ check for dotfiles
  • Backup file patterns: index.php~, index.php.bak, .index.php.swp β€” if editors were used on the server, swap/backup files exist

Probes (send via http(action="request", ...) or scan(tool="ffuf", ...)):

PathWhat it reveals
/.git/HEADGit repo β€” if 200, download full repo with git-dumper
/.git/configRemote URLs, credentials, branch names
/.gitignoreList of sensitive files the devs wanted hidden
/.svn/entriesSubversion repo metadata
/.svn/wc.dbSVN working copy database (SQLite)
/.hg/store/00manifest.iMercurial repo
/.bzr/READMEBazaar repo
/.envEnvironment variables (DB creds, API keys, secrets)
/.env.bak, /.env.old, /.env.productionBackup env files
/composer.json, /package.jsonDependencies with versions (CVE lookup)
/Dockerfile, /docker-compose.ymlContainer config, internal service names
/.github/workflows/CI/CD pipelines (secrets in env vars, deploy targets)
/Jenkinsfile, /.gitlab-ci.ymlCI/CD config
/wp-config.php.bak, /web.config.bakBackup config files
/.DS_StoremacOS directory listing (parse with ds_store tool)
/server-status, /server-infoApache status pages
/.well-known/security.txtSecurity contact, sometimes reveals infrastructure

If .git/HEAD returns 200 β€” full repo extraction:

kali(command="git-dumper http://TARGET/.git/ /tmp/git-dump")
# Or manual:
kali(command="wget -r -np -nH http://TARGET/.git/ -P /tmp/git-dump 2>/dev/null && cd /tmp/git-dump && git log --oneline -20")

Then search the dumped repo for secrets:

kali(command="cd /tmp/git-dump && git log --all --diff-filter=D -- '*.env' '*.key' '*.pem' '*password*' '*secret*' --oneline")
kali(command="trufflehog filesystem /tmp/git-dump --json")

Phase 2 β€” Systematic Parameter Testing (CORE LOOP)

This is the heart of the matrix-driven approach. Instead of going attack-type by attack-type (all SQLi, then all XSS, then all SSRF...), go endpoint by endpoint and test every applicable injection type on every parameter before moving on.

Step 0 β€” Hidden parameter discovery (run before the loop, on priority 1 and 2 endpoints): The coverage matrix contains only parameters the spider or spec found. Hidden parameters β€” debug flags, internal fields, undocumented overrides β€” don't appear in it. Run this on every auth and input-accepting endpoint before testing known params:

scan(tool="ffuf", target="TARGET/endpoint?FUZZ=1", options={"wordlist": "burp-parameter-names.txt"})

Any parameter that returns a different response length, status code, or body β†’ register it in the coverage matrix immediately and add its injection cells to the pending queue. This is how debug=true, admin=1, role=admin, and is_admin=true mass-assignment vectors are discovered β€” they are never in the spider output.

Priority order for endpoints:

  1. Auth endpoints (login, register, password reset) β€” highest impact
  2. Input-accepting endpoints (search, profile, upload, API POST) β€” most attack surface
  3. API endpoints (REST, GraphQL) β€” often less validated
  4. Static/read-only endpoints β€” endpoint-level tests only

The core loop:

For each endpoint (priority order above):
  For each parameter on that endpoint:
    For each pending injection type (from coverage matrix):
      1. Look up technique in Reference Library (below)

      2. Mark the cell `in_progress` BEFORE running any tool.
         This is the compaction-recovery marker β€” it tells any future
         resumed session "I was mid-test on this cell". Include what
         you're about to try in the notes so a resume knows where to
         continue from, not restart:
         report(action="coverage", data={
           "type": "tested",
           "cell_id": "cell-...",
           "status": "in_progress",
           "notes": "Starting SQLi β€” trying error-based first, then UNION, then blind time-based"
         })

      3. Run diagnostic probe(s) via http(action="request", ...) or kali(command=...).

      4. Update the notes as you work through techniques, keeping
         `status: in_progress` until the cell is conclusively done.
         This is critical β€” if context compaction fires here, the
         agent that resumes reads your notes and knows "oh, error-based
         and UNION are blocked, I was about to try blind time-based":
         report(action="coverage", data={
           "type": "tested",
           "cell_id": "cell-...",
           "status": "in_progress",
           "notes": "Error-based: no errors reflected. UNION: column count wrong. Trying blind time-based next."
         })

      5. Finalize the cell when done. Always include `tested_by` β€”
         the tool name that actually produced the result. Cells without
         `tested_by` trigger an integrity warning at completion:
         report(action="coverage", data={
           "type": "tested",
           "cell_id": "cell-...",
           "status": "tested_clean",  // or "vulnerable" or "not_applicable" or "skipped"
           "notes": "All SQLi variants tested β€” input properly parameterized",
           "tested_by": "sqlmap",
           "finding_id": null  // or finding ID if vulnerable
         })

      6. If vulnerable:
         - Escalate (dump data, chain exploits, achieve RCE)
         - Call report(action="finding", data={...}) with evidence
         - Link finding_id to the cell
         - Call http(action="request", options={"poc": true}) + http(action="save_poc", ...)

Finding granularity rule. File one finding per technique per endpoint β€” not one finding per technique class across the whole app. "SQLi in /search param q" and "SQLi in /products param category" are two separate findings. This matters for the final report and for tracking which endpoints are fully remediated. A batched finding like "SQLi found in 5 parameters" is a single line in the report, not five actionable tickets.

Multi-technique SQLi gate. For every SQLi cell, you MUST test at minimum error-based, UNION (if SELECT is meaningful), blind boolean, and blind time-based before marking it tested_clean. Sqlmap default mode stops at the first successful technique β€” tested_clean means ALL applicable variants were tried and failed, not just the first one. Use:

kali(command="sqlmap -u 'URL?param=1' --level=3 --risk=2 --technique=BEUSTQ --batch --random-agent --output-dir=/tmp/sqlmap")

The --technique=BEUSTQ flag forces all six techniques. Never mark SQLi tested_clean after only error-based probing.

Why the in_progress discipline matters. The coverage matrix is the only piece of scan state that survives context compaction. Without in_progress markers, session(action="recovery") returns an empty "what were you doing" list and the resumed agent has to re-derive everything from pentest.log β€” often re-running tests that were already done or abandoning ones that were almost finished. Every cell that gets tested should transition pending β†’ in_progress β†’ tested_clean/vulnerable. Skipping in_progress is fine for trivial probes, but the integrity check will flag any cell that jumps pending β†’ vulnerable without the intermediate state, because that usually means the cell was bulk-marked from memory instead of actually tested.

Bulk updates β€” when testing a single injection type against multiple params yields the same result (e.g., all endpoint-level CORS checks return the same policy), use bulk_tested:

report(action="coverage", data={
  "type": "bulk_tested",
  "updates": [
    {"cell_id": "cell-abc", "status": "tested_clean", "notes": "No CORS misconfiguration"},
    {"cell_id": "cell-def", "status": "tested_clean", "notes": "No CORS misconfiguration"}
  ]
})

N/A and skip rules:

  • Mark not_applicable when the injection type fundamentally cannot apply (e.g., XXE on a param that never reaches an XML parser)
  • Mark skipped ONLY when actively blocked β€” valid reasons are: WAF returning 403/429 on every probe attempt (include the response in notes), or the test is technically impossible without infrastructure not available in this engagement (e.g., OOB DNS callback with no egress). Budget, time, and "requires careful setup" are NOT valid skip reasons. If you find yourself writing a vague reason, test the cell instead.
  • sqli and xss cells on any parameter that accepts text input cannot be marked skipped without a WAF block response in the notes. These are the highest-yield cells in the matrix β€” skipping them without evidence of blocking is the single most common cause of missed critical findings.
  • Never leave cells as pending without testing or explicitly skipping

Phase 3 β€” Endpoint-Level Tests

For each endpoint, test the endpoint-level cells from the matrix:

  • CORS: send request with Origin: https://evil.com header, check if reflected
  • CSRF: for state-changing endpoints, remove CSRF token and test cross-origin
  • Security headers: check response headers (CSP, X-Frame-Options, HSTS, etc.)
  • Rate limiting: send 20+ rapid requests, check for throttling
  • Method tampering: send unexpected HTTP methods (GET↔POST, PUT, DELETE, PATCH) AND non-standard verbs (OPTIONS, TRACE, PROPFIND, BOGUS, FOO) when the endpoint returns 401/403 β€” Apache <Limit> and J2EE <security-constraint> only protect verbs they list, unlisted verbs bypass auth entirely. Load refs/parameter-tampering.md for the verb-bypass section.
  • Cache: check Cache-Control on authenticated pages, test web cache deception
  • JWT: if JWT auth, test none algorithm, key confusion, kid injection
  • Race conditions: for state-changing operations, test parallel requests

Cookie / session token structure β€” for every session/auth cookie, decode and inspect before treating it as opaque:

  1. Base64-decode the cookie. Check magic bytes of the result:
    • \x80\x04 or \x80\x05 β†’ Python pickle β€” immediately suspect pickle.loads() RCE. See refs/deserialization.md.
    • eyJ (base64 of {") β†’ JWT β€” run jwt_tool against it.
    • rO0AB (base64 of \xAC\xED\x00) β†’ Java serialized object β€” try ysoserial.
    • O: prefix β†’ PHP serialized object β€” try POP chain attacks.
    • Plain JSON β†’ check for role/user_id fields and try mass-assignment / IDOR tampering.
  2. URL-decode and decompress (zlib, gzip) nested layers.
  3. If the cookie is Flask's default (. separator, signed), try flask-unsign --decode and --unsign with rockyou.txt β€” if the SECRET_KEY is weak you can forge any session.
  4. If the value is binary and non-printable, treat it as serialized data until proven otherwise β€” do not assume it's random.

Hidden and non-linked endpoints β€” spiders only follow visible links. On every authenticated page and every form-carrying HTML page, manually extract every href, src, action, formaction, and fetch(...) URL β€” even those that are display:none, type="hidden", or only referenced in JavaScript. Register any new ones into the coverage matrix before continuing. Flag-bearing endpoints in CTFs and hidden admin routes in real apps are almost always in this set β€” not in the spider's output.

kali(command="curl -s -b 'session=...' http://TARGET/profile | grep -oE '(href|src|action|formaction)=[\"\\x27][^\"\\x27]+' | sort -u")
kali(command="curl -s http://TARGET/main.js http://TARGET/app.js http://TARGET/bundle.js 2>/dev/null | grep -oE '(fetch|axios\\.get|axios\\.post|\\$\\.ajax)\\([^)]*' | head -40")

Inline source read on every 401/403 β€” when any endpoint returns 401 or 403, immediately spend one round trying to read the source before fuzzing. The most common wins: the .htaccess itself (reveals <Limit>), adjacent backup files (index.php.bak, .htaccess.orig), .git/HEAD (full repo extract), framework error pages (leak paths and versions). See Phase 1b for the full probe list. Source read is almost always faster than blind fuzzing when the filter is non-obvious.

CMS detection β†’ mandatory plugin scan β€” if the target shows any CMS signal (/wp-content/, /wp-includes/, /sites/default/, /administrator/, <meta name="generator" content="WordPress...">, X-Generator: Drupal, Joomla! in HTML), immediately run the CMS-specific scanner before continuing with generic web testing. 90%+ of CMS compromises come from plugin CVEs β€” the plugin/theme enumeration phase finds exploits that generic web fuzzing never will. See refs/cms-cves.md.

# WordPress
kali(command="wpscan --url TARGET --enumerate vp,vt,u1-10 --plugins-detection aggressive --random-user-agent --disable-tls-checks")
# Drupal
kali(command="droopescan scan drupal -u TARGET")
# Joomla
kali(command="joomscan -u TARGET")

The scanner output lists every known CVE affecting installed plugins/themes. Cross-reference any hit with searchsploit <plugin-name> and fire the matching exploit.

Update each cell in the matrix as you go.


Phase 4 β€” Re-spider on Surface Expansion

The coverage matrix is NOT static β€” it grows as the attack surface expands. This creates a feedback loop:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Discover │───→│ Register new │───→│ Test   β”‚ β”‚
β”‚  β”‚ (spider) β”‚    β”‚ endpoints +  β”‚    β”‚ new    β”‚ β”‚
β”‚  β”‚          β”‚    β”‚ auto-generateβ”‚    β”‚ pendingβ”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚ matrix cells β”‚    β”‚ cells  β”‚ β”‚
β”‚       β–²          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β”‚
β”‚       β”‚                                  β”‚      β”‚
β”‚       β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚      β”‚
β”‚       └────│ New creds / dirs /   β”‚β—„β”€β”€β”€β”€β”€β”˜      β”‚
β”‚            β”‚ privilege escalation β”‚              β”‚
β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Triggers that restart the discovery-test loop:

  • Valid credentials discovered β†’ re-spider with auth cookie β†’ new authenticated endpoints β†’ register new endpoints β†’ new matrix cells β†’ injection testing on all new cells
  • Fuzzing reveals new directory tree β†’ re-spider that subtree β†’ new endpoints β†’ new cells β†’ testing
  • Privilege escalation achieved β†’ re-spider as higher-privilege user β†’ admin endpoints β†’ new cells β†’ testing
  • New subdomain or vhost discovered β†’ re-spider the new host β†’ full new endpoint set β†’ testing

Key invariant: Every new endpoint registered via add_endpoint() auto-generates ALL applicable injection test cells as "pending". The agent always works from pending cells in Phase 2. This guarantees that no new endpoint escapes injection testing β€” the matrix enforces completeness.

Re-spider preserves existing work: Existing endpoints and their cells are unchanged. Only genuinely new endpoints (deduplicated on (normalized_path, method)) get added.

After re-spider + registration, resume Phase 2 from the new pending cells.


Phase 5 β€” Chain Exploitation

After systematic testing, combine confirmed vulnerabilities into multi-step attack chains. An isolated medium-severity finding becomes critical when it enables a full compromise chain.

See Reference Library Β§ Chained Exploitation Examples for patterns:

  • SQLi β†’ file read β†’ config leak β†’ RCE
  • File upload bypass β†’ path traversal β†’ web shell
  • SSRF β†’ cloud IMDS β†’ credential theft β†’ S3 access
  • LFI β†’ source code leak β†’ deserialization β†’ RCE

Document every chain in report(action="diagram", data={...}).


Phase 6 β€” Coverage Gap Report

Review the coverage matrix for any remaining pending or skipped cells:

  1. Call session(action="status") β€” check coverage stats
  2. For any pending cells: either test them now or mark as skipped with a documented reason
  3. Call report(action="note", data={...}) with a coverage summary: "Coverage: X/Y tested, Z vulnerable, W N/A, V skipped"
  4. The session completion gate requires β‰₯80% of cells addressed (tested + N/A + skipped)

Phase 7 β€” Verification & PoC

For every confirmed exploit:

  1. Call report(action="note", data={...}) explaining what you're verifying
  2. Reproduce with http(action="request", ...) β€” craft the minimal working payload
  3. Call http(action="request", options={"poc": true}) to route through Burp Suite
  4. Call http(action="save_poc", ...) with descriptive title (e.g., sqli-oob-dns-mssql-xp-dirtree)
  5. Call report(action="finding", data={...}) with:
    • severity: based on impact (RCE=critical, data access=high, info disclosure=medium)
    • description: Include OWASP Web Top 10 category
    • evidence: Raw request/response

Phase 8 β€” Report & Wrap-Up

  1. Call report(action="diagram", data={...}) with attack flow diagram showing all exploit chains:
flowchart TD
    Entry["Initial Entry Point"] --> Inject["SQL Injection /search?q="]
    Inject --> DBAccess["Database Access"]
    DBAccess --> Creds["Credential Dump"]
    Creds --> Admin["Admin Panel Access"]
    Admin --> Upload["File Upload Bypass"]
    Upload --> RCE["Remote Code Execution"]
  1. Call session(action="complete", options={...}) with summary of all confirmed exploits
  2. Chain to /post-exploit if RCE was achieved
  3. Chain to /ai-redteam if an LLM/AI endpoint was discovered during exploitation (chat APIs, completion endpoints, RAG search, agentic tool-use endpoints, MCP servers). Web exploitation often touches these surfaces β€” when it does, hand off for OWASP LLM Top 10, AITG, and MCP Top 10 testing instead of stopping at the HTTP layer.
  4. If the user asks to file GitHub issues β€” invoke /gh-export

Phase 9 β€” ASVS Black-Box Verification Checklist (MANDATORY β€” thorough depth)

This checklist covers OWASP ASVS requirements that ARE testable from a black-box perspective. Run through every applicable test after completing Phases 2-8. Many of these are commonly missed by automated tools.

AUTH (ASVS V2 β€” Authentication):

#TestHow to testFinding if failed
A1Password length limitsTry registering with 1-char and 200-char passwords. Min should be β‰₯8, max should be β‰₯64Weak password policy
A2Password breach checkRegister with P@ssw0rd123 and other known-breached passwords β€” should be rejectedNo breach-list validation
A3Paste into password fieldCheck if password fields have autocomplete="off" or block paste β€” they should NOT block pasteAnti-usability password field
A4Rate limiting on loginSend 20 rapid login attempts with wrong passwords β€” should be rate-limited or locked after ~5-10No brute-force protection
A5Default credentialsTry admin:admin, admin:password, test:test on login β€” should not workDefault credentials active
A6Account lockout notificationAfter triggering lockout, check if the real user is informed (email/UI)Silent account lockout
A7Password change requires currentTry changing password without providing current passwordMissing reauthentication
A8Recovery token single-useRequest password reset, use the link, then try using the same link againReusable recovery token
A9Authentication response timingCompare response time for valid username/wrong password vs invalid username β€” should be equalTiming-based user enumeration

SESSION (ASVS V3 β€” Session Management):

#TestHow to testFinding if failed
S1New session on loginCompare session token before and after login β€” must changeSession fixation
S2Session invalidation on logoutSave session token, log out, try reusing itSession persistence after logout
S3Idle timeoutWait 15+ minutes, try using session β€” should be expired (configurable, but should exist)No session timeout
S4Absolute timeoutKeep session alive for 8+ hours with periodic requests β€” should eventually expire regardlessNo absolute timeout
S5Concurrent session controlLog in from two browsers β€” check if app limits concurrent sessions or shows active sessionsNo concurrent session control
S6Session token entropyCollect 10+ session tokens, check length and character set β€” should be β‰₯128 bits of entropyWeak session tokens
S7Cookie flagsCheck Set-Cookie for HttpOnly, Secure, SameSite, PathMissing cookie security flags
S8Session token not in URLCheck that session IDs never appear in URLs, redirects, or Referer headersSession token URL exposure

ACCESS (ASVS V4 β€” Access Control):

#TestHow to testFinding if failed
AC1Mass assignmentAdd extra fields to registration/update requests (role, isAdmin, verified, balance)Mass assignment vulnerability
AC2CSRF on state changesFor every POST/PUT/DELETE: remove CSRF token, try cross-origin β€” must failMissing CSRF protection
AC3HTTP verb tamperingSend GET instead of POST (and vice versa) to state-changing endpointsHTTP verb tampering

INPUT (ASVS V5 β€” Validation, Sanitization, Encoding):

#TestHow to testFinding if failed
I1HTTP Parameter PollutionSend duplicate parameters: ?id=1&id=2 β€” check which value is usedHPP vulnerability
I2SSTISend {{7*7}} in every reflecting parameter β€” check for 49 in responseTemplate injection
I3SMTP header injectionIn contact/email forms, inject \r\nBcc: [email protected] into email fieldsSMTP injection
I4SVG XSSUpload SVG with <script>alert(1)</script> or <svg onload=alert(1)> as a .svg file β€” check if served as image/svg+xml and executes in browser; also test SVG in any image-accepting uploadSVG XSS
I4aStored XSS source-sink matrixFor every input that persists (profile, comments, names, addresses, preferences, rich-text fields): confirm payload appears on a page AND is not encoded. Test sinks: innerHTML, eval, document.write, href with user input, on* event handlers, template literals. Use <img src=x onerror=alert(1)>, <svg/onload=alert(1)>, and javascript:alert(1) in each. Register each source+sink pair as a separate finding.Stored XSS
I5Markdown injectionIf app renders Markdown, inject [click](javascript:alert(1))Markdown XSS
I6JSON injectionIn JSON inputs, send {"key":"value","__proto__":{"isAdmin":true}}Prototype pollution / JSON injection
I7LDAP injectionIf LDAP auth is used, try `)(uid=))((uid=*` in username

LOGIC (ASVS V11 β€” Business Logic):

#TestHow to testFinding if failed
L1Flow step skippingIn multi-step flows, skip directly to final step (e.g., go to /checkout without /cart)Missing flow enforcement
L2Timing attacksCompare response times for valid vs invalid inputs in sensitive operationsTiming side channel
L3Rate limits on sensitive opsRapidly repeat password reset, OTP requests, API key generationMissing rate limiting
L4Anti-automationSubmit forms rapidly with scripted requests β€” should be CAPTCHA or rate-limitedNo anti-automation
L5Business rule bypassTest negative quantities, zero-price, duplicate coupon use, self-referralBusiness logic bypass

FILES (ASVS V12 β€” Files and Resources):

#TestHow to testFinding if failed
F1Upload size limitUpload a very large file (100MB+) β€” should be rejected promptlyNo upload size limit
F2Zip bombUpload a zip bomb (42.zip or similar) β€” should be detected or limitedZip bomb DoS
F3Upload to webrootCheck if uploaded files are stored in web-accessible directory with original namesUpload to webroot
F4HTML executionUpload an HTML file β€” check if it's served with text/html content typeStored XSS via HTML upload

API (ASVS V13 β€” API Security):

#TestHow to testFinding if failed
AP1Content-Type enforcementSend JSON body with Content-Type: text/plain β€” should be rejectedContent-Type not enforced
AP2Verb tampering on APISend PUT/PATCH/DELETE to read-only endpoints β€” should be rejectedAPI verb tampering
AP3Schema validationSend unexpected field types (string where int expected, nested objects, arrays)Weak API schema validation
AP4API CSRFState-changing API with cookie auth β€” test cross-origin request without CORS preflightAPI CSRF
AP5Parser differentialSend request that could be parsed differently by proxy vs app (e.g., duplicate Content-Length)HTTP request smuggling surface

CONFIG (ASVS V14 β€” Configuration):

#TestHow to testFinding if failed
C1Dependency CVEsCheck response headers for framework/library versions, cross-reference with CVE databasesKnown vulnerable dependency
C2Subresource integrityCheck if external JS/CSS includes have integrity attributeMissing SRI
C3CSP qualityCheck Content-Security-Policy header β€” unsafe-inline and unsafe-eval weaken it significantlyWeak CSP
C4Cache-Control on sensitive pagesCheck if authenticated pages have Cache-Control: no-storeSensitive data cached
C5Sensitive data in client storageCheck localStorage and sessionStorage for tokens, PII, or secrets via browser consoleClient storage data exposure

How to use this checklist:

  1. Go through each row sequentially
  2. For each test, make the HTTP request and evaluate the result
  3. If a test reveals a vulnerability, call report(action="finding", data={...}) immediately
  4. Mark N/A for tests that don't apply (e.g., no file upload endpoint β†’ skip F1-F4)
  5. Call report(action="note", data={...}) with a summary of all ASVS checks and their pass/fail status

Phase 9 completion gate (thorough depth ONLY): Before calling session(action="complete"), you MUST:

  • Have a report(action="note") entry listing every Phase 9 row as PASS, FAIL, or N/A
  • Every FAIL must have a corresponding report(action="finding") entry
  • The completion call will be blocked otherwise β€” do not skip this gate
  • Log the completion note as: "ASVS Phase 9 complete: A1:pass, A2:pass, ..., I4:fail (SVG XSS), ..."

Context Recovery After Compaction

When your context is compacted mid-scan:

  1. Re-invoke /web-exploit β€” use the Skill tool to reload this full workflow
  2. Call session(action="status") β€” coverage stats in the response tell you exactly where you are
  3. Pending cells tell you where to resume β€” the matrix persists in coverage_matrix.json
  4. Do NOT re-register endpoints β€” they persist across context compactions
  5. Resume Phase 2 from pending cells β€” the matrix enforces completeness

Reference Library β€” Lazy Loading

Instead of loading all 25 injection technique references at once (~25k tokens), load ONLY the reference you need for the current test. This saves 74% of context window space.

How to load: Before testing an injection type, read the relevant reference file. Try these paths in order (first one that exists):

skills/web-exploit/refs/{filename}
~/.claude/skills/web-exploit/refs/{filename}
~/.config/opencode/commands/web-exploit-refs/{filename}
Injection TypeReference FileTokensLoad when testing...
SQL Injectionrefs/sqli.md~1776sqli cells
NoSQL Injectionrefs/nosqli.md~956nosqli cells
GraphQL Injectionrefs/graphql.md~1329graphql cells
Cross-Site Scripting (XSS)refs/xss.md~1603xss cells
CSS Injectionrefs/css-injection.md~619css-injection cells
Server-Side Template Injection (SSTI)refs/ssti.md~736ssti cells
SSRF Exploitationrefs/ssrf.md~202ssrf cells
Command Injectionrefs/cmdi.md~144cmdi cells
File Upload Bypassrefs/file-upload.md~1003file-upload cells
Path Traversal / LFIrefs/traversal-lfi.md~969traversal-lfi cells
XML External Entity (XXE) Injectionrefs/xxe.md~711xxe cells
Deserialization Exploitationrefs/deserialization.md~1380deserialization cells
Race Condition Exploitationrefs/race-condition.md~1035race-condition cells
Parameter Tampering & Business Logic Flawsrefs/parameter-tampering.md~1067parameter-tampering cells
Session Management Testingrefs/session-management.md~1736session-management cells
Cross-Site Request Forgery (CSRF)refs/csrf.md~400csrf cells
JWT Attacksrefs/jwt.md~1048jwt cells
Open Redirectrefs/open-redirect.md~1022open-redirect cells
CRLF Injection / HTTP Response Splittingrefs/crlf.md~635crlf cells
HTTP Request Smugglingrefs/http-smuggling.md~934http-smuggling cells
CORS Exploitationrefs/cors.md~899cors cells
Web Cache Deception / Poisoningrefs/web-cache.md~994web-cache cells
OAuth Misconfigurationrefs/oauth.md~868oauth cells
Prototype Pollutionrefs/prototype-pollution.md~1078prototype-pollution cells
Out-of-Band Exfiltration (blind vulns)refs/oob-exfil.md~1400any confirmed-but-blind vuln (blind SQLi/XXE/SSRF/SSTI/cmdi, or flag in env)
Nginx Alias / Off-by-Slash Traversalrefs/nginx-alias-traversal.md~900Server: nginx + any prefix where /foo/ and /foo return different content
Advanced IDOR (ID structure attacks)refs/idor-advanced.md~1400opaque IDs (UUID, MongoDB ObjectID, Snowflake) before sequential enumeration
CMS Plugin / Theme / Core CVEsrefs/cms-cves.md~1600WordPress / Drupal / Joomla / Magento targets (/wp-content/, /sites/default/, /administrator/)
Chained Exploitation Examplesrefs/chains.md~2334chains cells

Rules for reference loading:

  • Load the reference BEFORE you start testing that injection type
  • Only load 1-2 references at a time β€” don't pre-load all of them
  • For chained exploitation, load refs/chains.md after confirming individual vulns
  • The core workflow above has everything you need to manage the matrix β€” refs are just technique details

Chaining Other Skills

SkillWhen to invoke
/post-exploitRCE achieved β€” privilege escalation, credential harvesting, persistence
/analyze-cveCVE-affected component discovered (vulnerable framework, library, or plugin) β€” trace exploitability with full source-to-sink context
/credential-auditCredential material recovered (hashes, cleartext creds, user list) or auth endpoint identified β€” chain for systematic credential testing
/lateral-movementCredentials obtained that may be reusable across services β€” pass-the-hash, password reuse, NTLM relay
/ai-redteamLLM/AI endpoint discovered during exploitation β€” chat APIs, completion endpoints, RAG search, agentic tool-use endpoints, MCP servers. Hand off for OWASP LLM Top 10, AITG, and MCP Top 10 testing instead of stopping at the HTTP layer. Common signals: prompt-shaped POST bodies, messages[] arrays, system/user/assistant roles, streaming SSE responses, model name parameters
/gh-exportWhen user asks to file GitHub issues

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.