skills/xss/SKILL.md
Use when testing Cross-Site Scripting or routing XSS work into reflected, stored, or DOM lanes. Load this first for XSS triage, then load reflected-xss, stored-xss, or dom-xss based on where attacker-controlled input lands.
npx skillsauth add ghostonbutterbread/bug-bounty-harness xssInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this as the XSS routing card. It should classify the XSS shape, load the right lane skill, and keep payload choice tied to the actual render context.
Core posture: XSS testing is controlled rule-breaking. Be creative with payload shape, encodings, parser confusion, sanitizer breakouts, framework quirks, and browser/server differences. Be conservative with impact, ownership, rate, cleanup, and human-visible side effects.
Read shared state in this order before testing when the files exist:
notes/summary.mdnotes/observations.mdchecklist.md (XSS items only)todo.md (XSS items only)Also load:
general-security-testing-policylive-testing-policyinjection-testing-policy once a render sink, stored render point, DOM sink,
sanitizer, markdown/HTML parser, or browser/server parser boundary is
plausiblewaf-live-policy when payloads are blocked, filtered, normalized, challenged,
or mutatedLoad the smallest matching lane:
| Signal | Load | Why |
| --- | --- | --- |
| Marker appears in the immediate HTTP response | reflected-xss | Immediate render/context breakout and browser proof. |
| Marker is saved and appears later in another view, notification, admin page, email, export, or feed | stored-xss | Persistence, render-point discovery, cleanup, and blast-radius control. |
| Marker reaches client-side sources/sinks such as URL, hash, storage, postMessage, router state, or JS-generated HTML | dom-xss | Browser source-to-sink verification and framework behavior. |
| More than one is plausible | Load all relevant lanes, but keep notes separated by lane. |
Do not treat these lanes as mutually exclusive. A stored value can become DOM XSS at render time; a reflected value can be inert in raw HTML but exploitable after client-side parsing; a DOM route can also call server APIs.
Use context-specific payloads, not generic spraying. Start with the shared payload-selection reference:
skills/xss/references/payload-selection.mdUseful local sources:
/home/ryushe/projects/bug_bounty_harness/prompts/xss-playbook.md/home/ryushe/projects/bug_bounty_harness/prompts/xss-payloads.md/home/ryushe/Shared/word_lists/xss/payloads.txt/home/ryushe/.axss/knowledge.db when curated rows existUse agents/xss_framework.py for broad XSS work. It handles discovery,
reflection screening, reflected/stored/DOM lanes, and optional browser
verification.
python /home/ryushe/projects/bug_bounty_harness/agents/xss_framework.py \
--target https://target.example/search?q=test \
--program target \
--mode full \
--rate-limit 2
Use agents/xss_hunter.py for narrower parameter-focused passes.
python /home/ryushe/projects/bug_bounty_harness/agents/xss_hunter.py \
--target https://target.example/search?q=test \
--program target \
--depth deep \
--rate-limit 5
reflected-xss, stored-xss, or dom-xss.waf-live-policy and bypass/mutation work when filtering or
parsing behavior becomes the interesting surface.For /hybrid, /deep-hunt, URL-batch, or route-cluster runs, XSS workers must
default to source-to-sink mapping before payload volume. The goal is to explain
why a payload family matches the observed sink, not to spray generic payloads.
Required sequence:
location, storage, postMessage, data islands, API responses, and any
framework state that can carry attacker-controlled bytes.innerHTML/outerHTML/insertAdjacentHTML,
URL-bearing attributes, iframe/embed HTML, framework raw-HTML helpers, and
sanitizer trust-bypass helpers.postMessage.attempts.jsonl with payload family,
source, sink/context, encoding/normalization result, browser result, and
stop reason. If no execution occurs, record the exact boundary.Do not mark an XSS lane complete from raw HTTP alone when browser-only routing, Cloudflare/challenge behavior, or framework rendering is material to the route. Do not continue increasing payload count after a representative set proves the context is inert; switch to a new source/sink hypothesis or stop.
Record:
Confirmed: JavaScript execution occurred in a browser or equivalent checker.Likely: source, sink, and context are strong but browser execution is blocked.Potential: controllable reflection/storage/source-to-sink exists, but the
exploit path is not proven.False positive: the value is inert, safely encoded, unreachable, or blocked
in the tested context.testing
Systematic live request mutation: flip booleans, field ops, headers, content-type, parser differentials, replay vs intercept, null/empty testing. Inherits live-testing-policy scope/rate/ownership rules.
development
Test password reset, forgot-password, reset-token, email reset, and account recovery flows for account takeover risks.
tools
Targeted param/field discovery using tech stack clues, naming conventions, and controlled-rate ffuf — then feeds findings into request-exploration for mutation. Not brute-force; informed and scoped.
testing
Ghost-only workflow for creating approved bug bounty test accounts and saving credential references.