- The attacker locates the XSS vulnerability on a website used by the victim, e.g., a bank's website
- The victim is currently logged on to this page
- The attacker sends the victim a crafted URL
- The victim clicks on the URL
It is worth noting that operations performed on behalf of the victim may be invisible to the victim, as they may take place in the background using the bank's API, or the attacker may perform them later with the data needed for authentication, tokens, cookies, etc.
1. Reflected XSS
A page with a text input to search for something that puts the parameter
?search=foo in the URL ending when querying the API. After entering any phrase, if it is not found, a return message is placed in HTML ex.
<div>No result found for <b>foo</b></div>\
We can try to put in the URL
2. DOM XSS
innerHtml. The "Live example" below shows a DOM XSS attack based on the
3. Stored XSS
This is one where the malicious code gets written on the server side. For example, we may send a comment with malicious code to a blog post that is uploaded to the server. Its task is, for example, to wait for the administrator's moderation and then to steal his session data, etc.
- In the tag content
<img src onerror=alert('XSS') />
- In the content of the attribute
" onmouseover=alert('XSS') into
<div class="" onmouseover=alert('XSS')"></div>
- In the content of the attribute without the quotes
<div class=x onclick=alert('XSS')></div>
- In the
&#39; is a single quote, into
- In the
%27 is a single quote, into
- Data encoding using built-in functions found in many programming languages.
- Using template systems with automatic encoding. Most of the popular frameworks that use such systems protect us from XSS injection (Django, Templates, Vue, React etc.).
- Do not use functions like
Function with untrusted user data.
- Do not use functions and properties that assign HTML code directly to the DOM tree elements, e.g.,
ocument.write. Instead, you can use functions that assign text directly to these elements, such as
- Be careful when you redirect the user to a URL that is under his control. Risk of injection
- Filter HTML using libraries such as
- Be careful about uploading
.svg files. You can create a separate domain from which the uploaded files will be served.
- Use the
- Take a look at the anti-XSS filters built into most popular browsers.
If you find this article interesting, follow Lukasz on Github: https://github.com/twistezo
Data fetching strategies in NextJS
Rails API & CORS. A dash of consciousness
Why you should (probably) use Typescript?