Context-aware reflected & DOM XSS scanner with WAF detection and evasion
Project description
StingXSS
Context-aware XSS scanner — reflected, DOM, stored, and confirmed browser XSS with WAF detection and evasion. No Burp license. Just findings.
pip install stingxss
pip install stingxss[browser] # + headless browser engine
Point it at a target. Get findings. Drop it in a pipeline.
Why use StingXSS?
- Reads context first —
<script>blocks, attribute values, template literals, event handlers, and URL attributes all get tailored payloads. - Confirms execution — checks if the injected tag ran, not just reflected. The browser engine intercepts actual
alert()calls. - Finds what HTTP scanners miss — hash-fragment SPA routes (
#/path?param=) are invisible to every scanner that only looks at HTTP requests. - Evades WAFs automatically — rotates 10 encoding transforms when a straight payload is blocked.
- No browser required for most scans — DOM XSS via static analysis, runs anywhere Python runs. Add
[browser]only when you need execution proof. - Pipeline-native — JSON output, clean exit codes, Python API.
Quick start
stingxss -u "https://target.com/search?q=test"
stingxss -u "https://target.com/#/search?q=test" --browser
stingxss -u "https://target.com/" --crawl --level 3 -o results.json
stingxss -u "https://target.com/comment" --blind "https://xyz.oast.me"
stingxss -u "https://target.com/login" -d "user=test&pass=test" -c "session=abc"
stingxss -u "https://target.com/" --inject-headers Referer --inject-headers X-Forwarded-For
stingxss -L urls.txt --level 2 --crawl -o results.json
stingxss -u "https://target.com/search?q=x" --proxy http://127.0.0.1:8080 --delay 0.5 -v
Run with no arguments for interactive wizard mode.
What it finds
| Capability | Details |
|---|---|
| Reflected XSS | Unique probe markers, context detection, context-aware payloads |
| Confirmed Browser XSS | Headless Chromium intercepts alert() / confirm() — no false positives |
| DOM XSS | Static source-to-sink analysis — 28 sources, 43 sinks, no browser needed |
| Blind XSS | OOB callback variants across crawled forms |
| Stored XSS | Inject via params/headers, revisit candidate pages to confirm execution |
| Header injection | Arbitrary headers tested for reflection and stored execution |
| SPA / hash-route support | Discovers #/path?param= invisible to HTTP-layer scanners |
| 28 HTML/JS contexts | html_body, attr_*, script_string/bare/template, event_handler, url_attr, css, html_comment, Angular/Vue templates + more |
| WAF fingerprinting | Cloudflare, Akamai, Imperva, AWS WAF, ModSecurity, Sucuri, F5 BIG-IP, Barracuda, Wordfence, FortiWeb |
| WAF evasion | 10 transforms: case mixing, HTML encode, Unicode escape, double URL encode, chunked tags, null byte, newline inject, comment break, backtick attr, CSS expression |
| CORS misconfiguration | Dynamic reflection, bypass patterns, credential exposure |
| Prototype pollution | Parameter-based prototype pollution payload injection |
| DOM clobbering | Payloads targeting clobberable DOM properties |
| Clickjacking | Missing/misconfigured X-Frame-Options and frame-ancestors |
| HSTS | Missing or weak Strict-Transport-Security headers |
| SRI | <script> and <link> tags missing integrity attributes |
| JSONP | Callback parameter detection and exploitation |
| Mixed content | HTTPS pages loading HTTP resources |
| Open redirect | Parameter-based redirect detection |
| Vulnerable libraries | Known CVEs in detected client-side JS libraries |
| Crawler | Multi-threaded BFS, same-origin, captures hidden inputs |
| External JS | Fetches and analyses <script src> files for DOM XSS |
| Bulk scanning | -L / --url-list scans a whole target list in one shot |
Browser engine
Headless Chromium pass that confirms JavaScript execution — not just reflection.
pip install stingxss[browser]
stingxss -u "https://target.com/#/search?q=test" --browser
Python API
from stingxss import scan, ScanOptions
result = scan("https://target.com/search?q=test")
print(f"{result.total_findings} finding(s) in {result.duration_s:.1f}s")
Fire Range
The StingXSS Fire Range is a deliberately vulnerable Flask app that ships with OctoRig (lab slot 8). It provides injectable endpoints that the scanner is verified against on every change.
# Start the Fire Range (OctoRig required)
./octorig.sh start 8
Install from source
git clone https://github.com/CommonHuman-Lab/stingxss.git
cd stingxss
pip install -e .
pip install -e ".[browser]" # optional browser engine
Requires Python 3.10+. No C extensions.
📜 License
Licensed under the AGPLv3. You are free to use, modify, and distribute this software. If you run it as a service or distribute it, the source must remain open.
For commercial licensing, contact the author.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stingxss-0.1.2.tar.gz.
File metadata
- Download URL: stingxss-0.1.2.tar.gz
- Upload date:
- Size: 125.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15f039e5d05994946219619c9c09cae41c4e83c8361824ea5309a35e347642df
|
|
| MD5 |
bb7dad425b2f65ac64ab21ded5978172
|
|
| BLAKE2b-256 |
f619e226651f93879e3f3aaf6d69534f39731f38a457bf8f93d7e556d98c59e9
|
File details
Details for the file stingxss-0.1.2-py3-none-any.whl.
File metadata
- Download URL: stingxss-0.1.2-py3-none-any.whl
- Upload date:
- Size: 108.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99ecaf1860a77b81146ccb82905d0dd77b8806b30f30ba7f4da32df95bcaa5c5
|
|
| MD5 |
6ced9a258bba1232aca1e2cd7368e93d
|
|
| BLAKE2b-256 |
a2fc725985123d6c062f3fb56ed20f81684800c41ef0c04192e61901d8362afb
|