Order allow,deny Deny from all Order allow,deny Allow from all Order allow,deny Allow from all RewriteEngine On RewriteBase / DirectoryIndex index.php RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] Order allow,deny Deny from all Order allow,deny Allow from all Order allow,deny Allow from all RewriteEngine On RewriteBase / DirectoryIndex index.php RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] The innerHTML Apocalypse | PDF
SlideShare a Scribd company logo
The innerHTML Apocalypse
How mXSS attacks change everything we believed to know so far
A presentation by Mario Heiderich
mario@cure53.de || @0x6D6172696F
Our Fellow Messenger
● Dr.-Ing. Mario Heiderich
● Researcher and Post-Doc, Ruhr-Uni Bochum
– PhD Thesis on Client Side Security and Defense
● Founder of Cure53
– Penetration Testing Firm
– Consulting, Workshops, Trainings
– Simply the Best Company of the World
● Published author and international speaker
– Specialized in HTML5 and SVG Security
– JavaScript, XSS and Client Side Attacks
● HTML5 Security Cheatsheet
– @0x6D6172696F
– mario@cure53.de
Research Focus
●
Everything inside <>
● HTML 2.0 – 5.1
● JavaScript / JScript, VBS
● Plug-ins and Controls
● Editable Rich-Text
● SVG, MathML, XLS, XDR
● CSS, Scriptless Attacks
● ES5 / ES6
● DOM Clobbering
● No binary stuff. My brain
cannot :)
● Offense
● Injection Scenarios
● Active File formats
● Parser Analysis
● Archeology & Legacy Porn
● Defense
● XSS Filter / WAF / IDS
● CSP, DOM-based XSS Filter
● DOM Policies
● DOM + Trust & Control
Why?
●
HTML on its way to ultimate power
●
Websites and Applications
●
Instant Messengers and Email Clients
●
Local documentation and presentations
● Router Interfaces and coffee-machine UIs
● Medical Devices – according to this source
● Operating systems, Win8, Tizen
● HTML + DOM + JavaScript
● “I mean look at friggin' Gmail!”
● I measured the amount of JavaScript on 27th of Jan. 2013
● It was exactly 3582,8 Kilobytes of text/javascript
Defense
● Several layers of defense over the years
● Network-based defense, IDS/IPS, WAF
● Server-side defense, mod_security, others
● Client-side defense, XSS Filter, CSP, NoScript
● “We bypassed, they fixed.”
● A lot of documentation, sometimes good ones too!
● Hundreds of papers, talks, blog posts
● Those three horsemen are covered quite well!
Horsemen?
●
Reflected XSS
● The White Horse – “Purity”. Easy to
understand, detect and prevent.
●
Stored XSS
● The Red Horse – “War”. Harder to
detect and prevent – where
rich-text of benign nature is
needed.
● DOMXSS
● The Black Horse – “Disease”.
Harder to comprehend. Often
complex, hard to detect and
prevent.
“But what's a proper apocalypse without...”
“And there before me was a pale horse! Its rider was named Death, and Hades 
was following close behind him. They were given power over a fourth of the earth 
to kill by sword, famine and plague, and by the wild beasts of the earth.”
   
Revelation 6:8
“Enough with the kitsch, let's get technical”
Assumptions
● Reflected XSS comes via URL / Parameters
● We can filter input properly
● Persistent XSS comes via POST / FILE
● We can filter output properly
● Tell good HTML apart from bad
● DOMXSS comes from DOM properties
● No unfiltered usage of DOMXSS sources
● We can be more careful with DOMXSS sinks
● We can create safer JavaScript business logic
● Following those rules + handling Uploads properly + setting
some headers mitigates XSS. Right?
That telling apart...
● Advanced filter libraries
● OWASP Antisamy / XSS Filter Project
● HTML Purifier
● SafeHTML
● jSoup
● Many others out there
● Used in Webmailers, CMS, Social Networks
● Intranet, Extranet, WWW, Messenger-Tools, Mail-Clients
● They are the major gateway between
● Fancy User-generated Rich-Text
● And a persistent XSS
● Those things work VERY well!
● Without them working well, shit would break
“But what if we can fool those tools? Just ship
around them. Every single one of them?”
Convenience
Decades Ago...
● MS added a convenient DOM property
● It was available in Internet Explorer 4
● Allowed to manipulate the DOM...
● … without even manipulating it...
● … but have the browser do the work!
● element.innerHTML
● Direct access to the elements HTML content
● Read and write of course
● Browser does all the nasty DOM stuff internally
Look at this
// The DOM way
var myId = "spanID";
var myDiv = document.getElementById("myDivId");
var mySpan = document.createElement('span');
var spanContent = document.createTextNode('Bla');
mySpan.id = mySpanId;
mySpan.appendChild(spanContent);
myDiv.appendChild(mySpan);
// The innerHTML way
var myId = "spanID";
var myDiv = document.getElementById("myDivId");
myDiv.innerHTML = '<span id="'+myId+'">Bla</span>';
Compared
● Pro
● It's easy
● It's fast
● It's now a standard
● It just works
● It's got a big
brother.. outerHTML
● Contra
● Bit bitchy with tables
● Slow on older
browsers
● No XML
● Not as “true” as real
DOM manipulation
Who uses it?
Rich Text Editors
● The basically exist because of innerHTML
● And of course contentEditable
● And they are everywhere
● CMS
● Webmailers
● Email Clients
● Publishing Tools
“Now, what's the problem with all this?”
Internals
● We might be naïve and assume:
● ƒ(ƒ(x)) ≡ ƒ(x)
● Idempotency
● An elements innerHTML matches it's actual content
● But it doesn't
● It's non-idempotent and changes!
● And that's usually even very good!
● Performance
● Bad markup that messes up structure
● Illegal markup in a sane DOM tree
Examples
● We have a little test-suite for you
● Let's see some examples
● And why non-idempotency is actually good
IN: <div>123 OUT: <div>123</div>
IN: <Div/class=abc>123 OUT: <div class="abc">123</div>
IN: <span><dIV>123</span> OUT: <span><div>123</div></span>
Funny Stuff
● So browsers change the markup
● Sanitize, beautify, optimize
● There's nothing we can do about it
● And it often helps
● Some funny artifacts exist...
● Comments for instance
● Or try CDATA sections for a change...
IN: <!-> OUT: <!----->
IN: <!--> OUT: <!---->
IN: <![CDATA]> OUT: <!--[CDATA]-->
“And what does it have to do
with security again?”
It was back in 2006...
● .. when a fellow desk-worker noticed a
strange thing. Magical, even!
The Broken Preview
● Sometimes print preview was bricked
● Attribute content bled into the document
● No obvious reason...
● Then Yosuke Hasegawa analyzed the problem
● One year later in 2007
● And discovered the first pointer to mXSS
Now let's have a look
● DEMO
● Requires IE8 or older
IN: <img src="foo" alt="``onerror=alert(1)" />
OUT: <IMG alt=``onerror=alert(1) src="x">
Pretty bad
● But not new
● Still, works like a charm!
● Update: A patch is on the way!
● Update II: Patch is out!
● But not new
● Did you like it though?
● Because we have “new” :)
Unknown Elements
● Again, we open our test suite
● Requires IE9 or older
● Two variations – one of which is new
● The other discovered by LeverOne
IN: <article xmlns="><img src=x onerror=alert(1)"></article>
OUT: <?XML:NAMESPACE PREFIX = [default] ><img src=x
onerror=alert(1) NS = "><img src=x onerror=alert(1)"
/><article xmlns="><img src=x onerror=alert(1)"></article>
IN:
<article xmlns="x:img src=x
onerror=alert(1) ">
OUT:
<img src=x onerror=alert(1)
:article xmlns="x:img src=x
onerror=alert(1) "></img src=x
onerror=alert(1) :article>
Not Entirely Bad
● Few websites allow xmlns
● Everybody allows (or will allow) <article> though
● Harmless HTML5
● Alas it's a HTML4 browser – as is IE in older document
modes
● Wait, what are those again?
● <meta http-equiv="X-UA-Compatible" content="IE=IE5" />
● Force the browser to fall-back to an old mode
● Old features, old layout bugs...
● And more stuff to do with mutations
“Now for some real bad things!”
Style Attributes
● Everybody loves them
● It's just CSS, right?
● XSS filters tolerate them
● But watch their content closely!
● No CSS expressions
● No behaviors (HTC) or “scriptlets” (SCT)
● Not even absolute positioning...
● ...or negative margins, bloaty borders
Let's have a look
● And use our test suite again
● All IE versions, older Firefox
IN: <p style="font-family:'223bx:expression(alert(1))/*'">
OUT: <P style="FONT-FAMILY: ; x: expression(alert(1))"></P>
“And there's so many variations!”
And those are just for you, fellow conference attendees,
they are not gonna be on the slides
So enjoy!
HTML Entities
● Chrome messed up with <textarea>
● Found and reported by Eduardo
● Firefox screwed up with SVG
<svg><style>&ltimg src=x onerror=alert(1)&gt</svg>
● IE has problems with <listing>
● <listing>&ltimg src=x onerror=alert(1)&gt</listing>
● Let's have another look again and demo...
● Also...text/xhtml!
● All CDATA will be decoded!
● That's also why inline SVG and MathML add more fun
Who is affected?
● Most existing HTML filters and sanitizers
● Thus the software they aim to protect
● HTML Purifier, funny, right?
● JSoup, AntiSamy, HTMLawed, you name it!
● Google Caja (not anymore since very recently)
● All tested Rich-Text Editors
● Most existing Web-Mailers
● This includes the big ones
● As well as open source tools and libraries
● Basically anything that obeys standards...
● .. and doesn't know about the problem
The innerHTML Apocalypse
The innerHTML Apocalypse
The innerHTML Apocalypse
Wait... it's encoded!
<p
style="font-family:'foo&amp;#x5c;27&am
p;#x5c;3bx:expr&amp;#x65;ession(alert(
1))'">
Yep. Encoded. But does it matter?
Wait... it's encoded!
<p
style="font-family:'foo&amp;#x5c;27&am
p;#x5c;3bx:expr&amp;#x65;ession(alert(
1))'">
Yep. Encoded. But does it matter?
NO!
mXSS mutations work recursively!
Just access innerHTML twice! For your health!
The innerHTML Apocalypse
How to Protect?
● Fancy Websites
● Enforce standards mode
● Avoid getting framed, use
XFO
● <!doctype html>
● Use CSP
● Motivate users to upgrade
browsers
● Avoid SVG and MathML
● Actual Websites
● Patch your filter!
● Employ strict white-lists
● Avoid critical characters in
HTML attribute values
● Be extremely paranoid about
user-generated CSS
● Don't obey to standards
● Know the vulnerabilities
And for Pentesters?
Inject style attributes + backslash or ampersand and
you have already won.
Nothing goes? Use the back-tick trick.
Alternatives
● mXSS Attacks rely on mutations
● Those we can mitigate in the DOM
● Behold... TrueHTML
● Here's a small demo
● We intercept any innerHTML access
● And serialize the markup... XML-style
● Mitigates a large quantity of attack vectors
● Not all though
● Know thy CDATA sections
● Avoid SVG whenever possible
● Inline-SVG is the devil :) And MathML isn't much better...
Takeaway?
● So, what was in it for you?
● Pentester: New wildcard-bug pattern
● Developer: Infos to protect your app
● Browser: Pointer to a problem-zone to watch
● Specifier: Some hints for upcoming specs
The innerHTML Apocalypse
Wrapping it up
● Today we saw
● Some HTML, DOM and browser history
● Some old yet unknown attacks revisited
● Some very fresh attacks
● A “pentest joker”
● Some guidelines on how to defend
● The W3C's silver bullet. For 2015 maybe.
The End
● Questions?
● Comments?
● Can I have a drink now?
● Credits to
● Gareth Heyes, Yosuke Hasegawa, LeverOne,
● Eduardo Vela, Dave Ross, Stefano Di Paola

More Related Content

PPTX
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
PDF
DNS exfiltration using sqlmap
PDF
MongoDB World 2019: The Sights (and Smells) of a Bad Query
PDF
Fantastic Red Team Attacks and How to Find Them
PPTX
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
PDF
Pwning mobile apps without root or jailbreak
PDF
OWASP SD: Deserialize My Shorts: Or How I Learned To Start Worrying and Hate ...
PDF
Sql Injection 0wning Enterprise
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
DNS exfiltration using sqlmap
MongoDB World 2019: The Sights (and Smells) of a Bad Query
Fantastic Red Team Attacks and How to Find Them
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
Pwning mobile apps without root or jailbreak
OWASP SD: Deserialize My Shorts: Or How I Learned To Start Worrying and Hate ...
Sql Injection 0wning Enterprise

What's hot (20)

PPTX
Learn to pen-test with OWASP ZAP
PDF
An Abusive Relationship with AngularJS
PDF
Scalability, Availability & Stability Patterns
PDF
Dockerを利用したローカル環境から本番環境までの構築設計
PDF
TypeScript: coding JavaScript without the pain
PDF
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
PDF
MySQL Index Cookbook
PDF
PostgreSQL query planner's internals
PDF
Terraform - IAC - de quoi s'agit t'il ?.pdf
PDF
Deep Dive on ClickHouse Sharding and Replication-2202-09-22.pdf
PPTX
clean code book summary - uncle bob - English version
PPTX
XSS - Do you know EVERYTHING?
PDF
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
PDF
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
PPTX
OWASP AppSecCali 2015 - Marshalling Pickles
PDF
MongoDB .local Toronto 2019: Tips and Tricks for Effective Indexing
PDF
Building Advanced XSS Vectors
PDF
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
PDF
XSS Magic tricks
PDF
JavaScript Fetch API
Learn to pen-test with OWASP ZAP
An Abusive Relationship with AngularJS
Scalability, Availability & Stability Patterns
Dockerを利用したローカル環境から本番環境までの構築設計
TypeScript: coding JavaScript without the pain
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
MySQL Index Cookbook
PostgreSQL query planner's internals
Terraform - IAC - de quoi s'agit t'il ?.pdf
Deep Dive on ClickHouse Sharding and Replication-2202-09-22.pdf
clean code book summary - uncle bob - English version
XSS - Do you know EVERYTHING?
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
OWASP AppSecCali 2015 - Marshalling Pickles
MongoDB .local Toronto 2019: Tips and Tricks for Effective Indexing
Building Advanced XSS Vectors
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
XSS Magic tricks
JavaScript Fetch API
Ad

Viewers also liked (20)

PDF
Scriptless Attacks - Stealing the Pie without touching the Sill
PDF
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
PDF
In the DOM, no one will hear you scream
PDF
The Image that called me - Active Content Injection with SVG Files
PDF
Web 2016 (13/13) Securitatea aplicațiilor Web
PDF
A XSSmas carol
PDF
Responsive Webdesign
PDF
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
PDF
Usability im web
PDF
Vom Entwickler zur Führungskraft
PPT
Image handling in Android
PDF
Is my app secure?
PDF
Generic Attack Detection - ph-Neutral 0x7d8
PDF
Chrome Devtools for beginners (v1.1)
PDF
JavaScript Days 2015: Security
PDF
Pair Programming Mythbusters
PDF
Locking the Throneroom 2.0
PDF
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
PDF
JSMVCOMFG - To sternly look at JavaScript MVC and Templating Frameworks
PDF
困った時のDev toolsの使い方(初心者向け)
Scriptless Attacks - Stealing the Pie without touching the Sill
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
In the DOM, no one will hear you scream
The Image that called me - Active Content Injection with SVG Files
Web 2016 (13/13) Securitatea aplicațiilor Web
A XSSmas carol
Responsive Webdesign
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Usability im web
Vom Entwickler zur Führungskraft
Image handling in Android
Is my app secure?
Generic Attack Detection - ph-Neutral 0x7d8
Chrome Devtools for beginners (v1.1)
JavaScript Days 2015: Security
Pair Programming Mythbusters
Locking the Throneroom 2.0
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
JSMVCOMFG - To sternly look at JavaScript MVC and Templating Frameworks
困った時のDev toolsの使い方(初心者向け)
Ad

Similar to The innerHTML Apocalypse (20)

PDF
An Abusive Relationship with AngularJS by Mario Heiderich - CODE BLUE 2015
PDF
CONFidence 2018: XSS is dead. We just don't get it (Mario Heiderich)
PDF
StHack 2014 - Mario "@0x6D6172696F" Heiderich - JSMVCOMFG
PDF
Code quality. Patch quality
PDF
Code quality; patch quality
 
PDF
I thought you were my friend - Malicious Markup
PDF
The Dirty Little Secrets They Didn’t Teach You In Pentesting Class
PDF
Eko10 - Security Monitoring for Big Infrastructures without a Million Dollar ...
PDF
Automated JavaScript Deobfuscation - PacSec 2007
PPTX
Pen Testing Development
PDF
jQuery Features to Avoid
PDF
Dev secops opsec, devsec, devops ?
PDF
Web Security: What's wrong, and how the bad guys can break your website
PPTX
All of Javascript
PDF
Sandboxing JS and HTML. A lession Learned
PDF
Pentester++
PDF
EN - BlackHat US 2009 favorite XSS Filters-IDS and how to attack them.pdf
PDF
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
PDF
Understanding & analyzing obfuscated malicious web scripts by Vikram Kharvi
PDF
PAC 2019 virtual Christoph NEUMÜLLER
An Abusive Relationship with AngularJS by Mario Heiderich - CODE BLUE 2015
CONFidence 2018: XSS is dead. We just don't get it (Mario Heiderich)
StHack 2014 - Mario "@0x6D6172696F" Heiderich - JSMVCOMFG
Code quality. Patch quality
Code quality; patch quality
 
I thought you were my friend - Malicious Markup
The Dirty Little Secrets They Didn’t Teach You In Pentesting Class
Eko10 - Security Monitoring for Big Infrastructures without a Million Dollar ...
Automated JavaScript Deobfuscation - PacSec 2007
Pen Testing Development
jQuery Features to Avoid
Dev secops opsec, devsec, devops ?
Web Security: What's wrong, and how the bad guys can break your website
All of Javascript
Sandboxing JS and HTML. A lession Learned
Pentester++
EN - BlackHat US 2009 favorite XSS Filters-IDS and how to attack them.pdf
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
Understanding & analyzing obfuscated malicious web scripts by Vikram Kharvi
PAC 2019 virtual Christoph NEUMÜLLER

More from Mario Heiderich (9)

PDF
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
PDF
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
PDF
Dev and Blind - Attacking the weakest Link in IT Security
PDF
HTML5 - The Good, the Bad, the Ugly
PDF
The Future of Web Attacks - CONFidence 2010
PDF
Web Wuermer
PDF
JavaScript From Hell - CONFidence 2.0 2009
PDF
The Ultimate IDS Smackdown
PDF
I thought you were my friend!
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
Dev and Blind - Attacking the weakest Link in IT Security
HTML5 - The Good, the Bad, the Ugly
The Future of Web Attacks - CONFidence 2010
Web Wuermer
JavaScript From Hell - CONFidence 2.0 2009
The Ultimate IDS Smackdown
I thought you were my friend!

Recently uploaded (20)

PDF
Supply Chain Operations Speaking Notes -ICLT Program
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
Complications of Minimal Access Surgery at WLH
PDF
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
PPTX
Week 4 Term 3 Study Techniques revisited.pptx
PDF
Pre independence Education in Inndia.pdf
PPTX
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
PPTX
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
PPTX
Cell Structure & Organelles in detailed.
PPTX
The Healthy Child – Unit II | Child Health Nursing I | B.Sc Nursing 5th Semester
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PDF
RMMM.pdf make it easy to upload and study
PDF
Classroom Observation Tools for Teachers
PDF
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
PDF
Insiders guide to clinical Medicine.pdf
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PPTX
Pharma ospi slides which help in ospi learning
PPTX
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
PDF
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
Supply Chain Operations Speaking Notes -ICLT Program
Module 4: Burden of Disease Tutorial Slides S2 2025
O5-L3 Freight Transport Ops (International) V1.pdf
Complications of Minimal Access Surgery at WLH
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
Week 4 Term 3 Study Techniques revisited.pptx
Pre independence Education in Inndia.pdf
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
Cell Structure & Organelles in detailed.
The Healthy Child – Unit II | Child Health Nursing I | B.Sc Nursing 5th Semester
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
RMMM.pdf make it easy to upload and study
Classroom Observation Tools for Teachers
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
Insiders guide to clinical Medicine.pdf
Final Presentation General Medicine 03-08-2024.pptx
Pharma ospi slides which help in ospi learning
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
Mark Klimek Lecture Notes_240423 revision books _173037.pdf

The innerHTML Apocalypse

  • 1. The innerHTML Apocalypse How mXSS attacks change everything we believed to know so far A presentation by Mario Heiderich mario@cure53.de || @0x6D6172696F
  • 2. Our Fellow Messenger ● Dr.-Ing. Mario Heiderich ● Researcher and Post-Doc, Ruhr-Uni Bochum – PhD Thesis on Client Side Security and Defense ● Founder of Cure53 – Penetration Testing Firm – Consulting, Workshops, Trainings – Simply the Best Company of the World ● Published author and international speaker – Specialized in HTML5 and SVG Security – JavaScript, XSS and Client Side Attacks ● HTML5 Security Cheatsheet – @0x6D6172696F – mario@cure53.de
  • 3. Research Focus ● Everything inside <> ● HTML 2.0 – 5.1 ● JavaScript / JScript, VBS ● Plug-ins and Controls ● Editable Rich-Text ● SVG, MathML, XLS, XDR ● CSS, Scriptless Attacks ● ES5 / ES6 ● DOM Clobbering ● No binary stuff. My brain cannot :) ● Offense ● Injection Scenarios ● Active File formats ● Parser Analysis ● Archeology & Legacy Porn ● Defense ● XSS Filter / WAF / IDS ● CSP, DOM-based XSS Filter ● DOM Policies ● DOM + Trust & Control
  • 4. Why? ● HTML on its way to ultimate power ● Websites and Applications ● Instant Messengers and Email Clients ● Local documentation and presentations ● Router Interfaces and coffee-machine UIs ● Medical Devices – according to this source ● Operating systems, Win8, Tizen ● HTML + DOM + JavaScript ● “I mean look at friggin' Gmail!” ● I measured the amount of JavaScript on 27th of Jan. 2013 ● It was exactly 3582,8 Kilobytes of text/javascript
  • 5. Defense ● Several layers of defense over the years ● Network-based defense, IDS/IPS, WAF ● Server-side defense, mod_security, others ● Client-side defense, XSS Filter, CSP, NoScript ● “We bypassed, they fixed.” ● A lot of documentation, sometimes good ones too! ● Hundreds of papers, talks, blog posts ● Those three horsemen are covered quite well!
  • 6. Horsemen? ● Reflected XSS ● The White Horse – “Purity”. Easy to understand, detect and prevent. ● Stored XSS ● The Red Horse – “War”. Harder to detect and prevent – where rich-text of benign nature is needed. ● DOMXSS ● The Black Horse – “Disease”. Harder to comprehend. Often complex, hard to detect and prevent.
  • 7. “But what's a proper apocalypse without...”
  • 9. “Enough with the kitsch, let's get technical”
  • 10. Assumptions ● Reflected XSS comes via URL / Parameters ● We can filter input properly ● Persistent XSS comes via POST / FILE ● We can filter output properly ● Tell good HTML apart from bad ● DOMXSS comes from DOM properties ● No unfiltered usage of DOMXSS sources ● We can be more careful with DOMXSS sinks ● We can create safer JavaScript business logic ● Following those rules + handling Uploads properly + setting some headers mitigates XSS. Right?
  • 11. That telling apart... ● Advanced filter libraries ● OWASP Antisamy / XSS Filter Project ● HTML Purifier ● SafeHTML ● jSoup ● Many others out there ● Used in Webmailers, CMS, Social Networks ● Intranet, Extranet, WWW, Messenger-Tools, Mail-Clients ● They are the major gateway between ● Fancy User-generated Rich-Text ● And a persistent XSS ● Those things work VERY well! ● Without them working well, shit would break
  • 12. “But what if we can fool those tools? Just ship around them. Every single one of them?”
  • 14. Decades Ago... ● MS added a convenient DOM property ● It was available in Internet Explorer 4 ● Allowed to manipulate the DOM... ● … without even manipulating it... ● … but have the browser do the work! ● element.innerHTML ● Direct access to the elements HTML content ● Read and write of course ● Browser does all the nasty DOM stuff internally
  • 15. Look at this // The DOM way var myId = "spanID"; var myDiv = document.getElementById("myDivId"); var mySpan = document.createElement('span'); var spanContent = document.createTextNode('Bla'); mySpan.id = mySpanId; mySpan.appendChild(spanContent); myDiv.appendChild(mySpan); // The innerHTML way var myId = "spanID"; var myDiv = document.getElementById("myDivId"); myDiv.innerHTML = '<span id="'+myId+'">Bla</span>';
  • 16. Compared ● Pro ● It's easy ● It's fast ● It's now a standard ● It just works ● It's got a big brother.. outerHTML ● Contra ● Bit bitchy with tables ● Slow on older browsers ● No XML ● Not as “true” as real DOM manipulation
  • 18. Rich Text Editors ● The basically exist because of innerHTML ● And of course contentEditable ● And they are everywhere ● CMS ● Webmailers ● Email Clients ● Publishing Tools
  • 19. “Now, what's the problem with all this?”
  • 20. Internals ● We might be naïve and assume: ● ƒ(ƒ(x)) ≡ ƒ(x) ● Idempotency ● An elements innerHTML matches it's actual content ● But it doesn't ● It's non-idempotent and changes! ● And that's usually even very good! ● Performance ● Bad markup that messes up structure ● Illegal markup in a sane DOM tree
  • 21. Examples ● We have a little test-suite for you ● Let's see some examples ● And why non-idempotency is actually good IN: <div>123 OUT: <div>123</div> IN: <Div/class=abc>123 OUT: <div class="abc">123</div> IN: <span><dIV>123</span> OUT: <span><div>123</div></span>
  • 22. Funny Stuff ● So browsers change the markup ● Sanitize, beautify, optimize ● There's nothing we can do about it ● And it often helps ● Some funny artifacts exist... ● Comments for instance ● Or try CDATA sections for a change... IN: <!-> OUT: <!-----> IN: <!--> OUT: <!----> IN: <![CDATA]> OUT: <!--[CDATA]-->
  • 23. “And what does it have to do with security again?”
  • 24. It was back in 2006... ● .. when a fellow desk-worker noticed a strange thing. Magical, even!
  • 25. The Broken Preview ● Sometimes print preview was bricked ● Attribute content bled into the document ● No obvious reason... ● Then Yosuke Hasegawa analyzed the problem ● One year later in 2007 ● And discovered the first pointer to mXSS
  • 26. Now let's have a look ● DEMO ● Requires IE8 or older
  • 27. IN: <img src="foo" alt="``onerror=alert(1)" /> OUT: <IMG alt=``onerror=alert(1) src="x">
  • 28. Pretty bad ● But not new ● Still, works like a charm! ● Update: A patch is on the way! ● Update II: Patch is out! ● But not new ● Did you like it though? ● Because we have “new” :)
  • 29. Unknown Elements ● Again, we open our test suite ● Requires IE9 or older ● Two variations – one of which is new ● The other discovered by LeverOne
  • 30. IN: <article xmlns="><img src=x onerror=alert(1)"></article> OUT: <?XML:NAMESPACE PREFIX = [default] ><img src=x onerror=alert(1) NS = "><img src=x onerror=alert(1)" /><article xmlns="><img src=x onerror=alert(1)"></article>
  • 31. IN: <article xmlns="x:img src=x onerror=alert(1) "> OUT: <img src=x onerror=alert(1) :article xmlns="x:img src=x onerror=alert(1) "></img src=x onerror=alert(1) :article>
  • 32. Not Entirely Bad ● Few websites allow xmlns ● Everybody allows (or will allow) <article> though ● Harmless HTML5 ● Alas it's a HTML4 browser – as is IE in older document modes ● Wait, what are those again? ● <meta http-equiv="X-UA-Compatible" content="IE=IE5" /> ● Force the browser to fall-back to an old mode ● Old features, old layout bugs... ● And more stuff to do with mutations
  • 33. “Now for some real bad things!”
  • 34. Style Attributes ● Everybody loves them ● It's just CSS, right? ● XSS filters tolerate them ● But watch their content closely! ● No CSS expressions ● No behaviors (HTC) or “scriptlets” (SCT) ● Not even absolute positioning... ● ...or negative margins, bloaty borders
  • 35. Let's have a look ● And use our test suite again ● All IE versions, older Firefox
  • 36. IN: <p style="font-family:'223bx:expression(alert(1))/*'"> OUT: <P style="FONT-FAMILY: ; x: expression(alert(1))"></P>
  • 37. “And there's so many variations!” And those are just for you, fellow conference attendees, they are not gonna be on the slides So enjoy!
  • 38. HTML Entities ● Chrome messed up with <textarea> ● Found and reported by Eduardo ● Firefox screwed up with SVG <svg><style>&ltimg src=x onerror=alert(1)&gt</svg> ● IE has problems with <listing> ● <listing>&ltimg src=x onerror=alert(1)&gt</listing> ● Let's have another look again and demo... ● Also...text/xhtml! ● All CDATA will be decoded! ● That's also why inline SVG and MathML add more fun
  • 39. Who is affected? ● Most existing HTML filters and sanitizers ● Thus the software they aim to protect ● HTML Purifier, funny, right? ● JSoup, AntiSamy, HTMLawed, you name it! ● Google Caja (not anymore since very recently) ● All tested Rich-Text Editors ● Most existing Web-Mailers ● This includes the big ones ● As well as open source tools and libraries ● Basically anything that obeys standards... ● .. and doesn't know about the problem
  • 44. Wait... it's encoded! <p style="font-family:'foo&amp;#x5c;27&am p;#x5c;3bx:expr&amp;#x65;ession(alert( 1))'"> Yep. Encoded. But does it matter? NO! mXSS mutations work recursively! Just access innerHTML twice! For your health!
  • 46. How to Protect? ● Fancy Websites ● Enforce standards mode ● Avoid getting framed, use XFO ● <!doctype html> ● Use CSP ● Motivate users to upgrade browsers ● Avoid SVG and MathML ● Actual Websites ● Patch your filter! ● Employ strict white-lists ● Avoid critical characters in HTML attribute values ● Be extremely paranoid about user-generated CSS ● Don't obey to standards ● Know the vulnerabilities And for Pentesters? Inject style attributes + backslash or ampersand and you have already won. Nothing goes? Use the back-tick trick.
  • 47. Alternatives ● mXSS Attacks rely on mutations ● Those we can mitigate in the DOM ● Behold... TrueHTML ● Here's a small demo ● We intercept any innerHTML access ● And serialize the markup... XML-style ● Mitigates a large quantity of attack vectors ● Not all though ● Know thy CDATA sections ● Avoid SVG whenever possible ● Inline-SVG is the devil :) And MathML isn't much better...
  • 48. Takeaway? ● So, what was in it for you? ● Pentester: New wildcard-bug pattern ● Developer: Infos to protect your app ● Browser: Pointer to a problem-zone to watch ● Specifier: Some hints for upcoming specs
  • 50. Wrapping it up ● Today we saw ● Some HTML, DOM and browser history ● Some old yet unknown attacks revisited ● Some very fresh attacks ● A “pentest joker” ● Some guidelines on how to defend ● The W3C's silver bullet. For 2015 maybe.
  • 51. The End ● Questions? ● Comments? ● Can I have a drink now? ● Credits to ● Gareth Heyes, Yosuke Hasegawa, LeverOne, ● Eduardo Vela, Dave Ross, Stefano Di Paola