XSS (Cross-site scripting) vulnerability
XSS attacks allow attackers to inject scripts into web pages, executing actions like data theft or unauthorized transfers. Use encoding and secure coding practices to defend - summarized with AI.
About
XSS attacks enable attackers to inject client-side scripts into web pages viewed by other users.
The main effects of this vulnerability are the possibility of:
- execution of any actions in the context of the logged-in user
- reading any data in the context of the logged-in user
Attack scenario
- 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
- On the victim’s bank website, JavaScript code starts executing to intercept the user’s data or execute a transfer on his behalf to the attacker’s account
It is worth noting that performing operations on behalf of the victim may be invisible to the victim, as it may take place in the background using the bank’s API or the attacker may perform it in some time with the data needed for authentication, tokens, cookies, etc.
XSS types
Reflected XSS
It is one where HTML/JavaScript code contained in any parameter (e.g. GET, POST or cookie) is displayed in response.
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, in case of not finding it, we get a return message placed in HTML ex.1
<div>No result found for <b>foo</b></div>
We can try to put in URL
?search=<script>alert('XSS')</script>
.DOM XSS
This is when its execution is possible due to the use of dangerous functions in JavaScript, such as
eval
orinnerHtml
. Below “Live example” shows DOM XSS attack based oninnerHtml
function.Stored XSS
It is one where the malicious code gets written on the server side. For example, we may send comment with malicious code to a blog post that is uploaded to the server. His task is, for example, to wait for the administrator’s moderation to steal his session data, etc.
Injection methods
In the tag content
onerror=alert('XSS')
into1
<img src onerror=alert('XSS') />
In the content of the attribute
" onmouseover=alert('XSS')
into1
<div class="" onmouseover=alert('XSS')"></div>
In the content of the attribute without the quotes
x onclick=alert('XSS')
into1
<div class=x onclick=alert('XSS')></div>
In the
href
attributejavascript:alert('XSS')
into1
<a href="javascript:alert('XSS')"></a>
In the string inside JavaScript code
";alert('XSS')//
into1
<script>let username="";alert('XSS')//";</script>
In the attribute with the JavaScript event
');alert('XSS')//
where'
is a single quote, into1
<div onclick="change('');alert('XSS')//')">John</div>
In the
href
attribute inside the JavaScript protocol%27);alert(1)//
where%27
is a single quote, into1
<a href="javascript:change('%27);alert(1)//')">click</a>
Live example
https://codesandbox.io/s/xss-vulnerability-iedok
Defense methods
- Data encoding using built-in functions found in many programming languages.
- Using template systems with automatic encoding. Most of the popular framework that use such systems protect us from XSS injection (Django, Templates, Vue, React etc.).
- Do not use functions like
eval
orFunction
by passing untrusted user data to them. - Do not use functions and properties that assign HTML code directly to the DOM tree elements, eg
innerHTML
,outerHTML
,insertAdjacentHTML
,document.write
. Instead, you can use functions that assign text directly to these elements, such astextContent
orinnerText
. - Be careful when you redirect the user to a URL that is under his control. Risk of injection
location = 'javascript('XSS')'
. - Filter HTML using libraries such as
DOMPurify
. - Be careful about uploading
.html
or.svg
files. You can create a separate domain from which the uploaded files will be served. - Use the
Content-Security-Policy
mechanism. - Take look at anti-XSS filters built into most popular browsers.