tl;dr
- HTML injection to XSS
html=</h1></div><code id=intigriti><b><i(('>&xss=));alert(document.domain)
Challenge Author: 0xTib3rius
Hosted Challenge: here
Challenge Description
Find a way to execute arbitrary javascript on this page and win Intigriti swag.
1 | The solution... |
Solutions
Looking into Source
CSP
default-src 'none'; script-src 'unsafe-eval' 'strict-dynamic' 'nonce-f48c09cf37317ddd2191e934acf68955'; style-src 'nonce-c89004c13cf2feff4e3fe90c26c8aec9'
here in CSP we have nonce so direct injection of script tag not possible and unsafe-eval which allows the use of eval() and similar methods for creating code from strings.
1 | window.addEventListener("DOMContentLoaded", function () { |
When Dom contents is loaded variable e gets assigned with )]} + user input and it create a script tag and appends the contents of variable e which means we can possibly get XSS But )]} causes syntax error which prevents from further execution of JS.
Checking the if condition it is clear that we could append contents in front of variable e e = f + e; but this is only possible when c.id === "intigriti".If we are able to manipulate e as ((')]}'));alert(document.domain) script get executed and we get XSS.
My initial idea was to embed the whole <div id="container"> using <img src=' but it failed due to <div class="a">'"</div> where it closes the single quote .Then using <iframe id="intigriti" srcdoc=' i was able to control c = document.getElementById(“body”).lastElementChild; but not l = c.lastElementChild; which was null.
when my html input is </h1></div><code id=intigriti> script tag renders as <script type="text/javascript">pan>)]}'null</script> where pan refers to span is the last element of <div id="container">
when my html input is </h1></div><code id=intigriti><b> the <div id="container"> got rendered inside the bold tag this is because browser trying to fix unclosed tag and finally ends messing up. Now script tag rendered as <script type="text/javascript">div>)]}'null</script>
When i added one more tag with existing html ie </h1></div><code id=intigriti><b><i> script tag rendered as <script type="text/javascript"></i>)]}'null</script> now we have control over rendering script tag.
This happens because <i> got rendered inside <b> and javascript selected it as lastElementChild.
Payload:
html=</h1></div><code id=intigriti><b><i(('>xss=));alert(document.domain);
Final Exploit:
https://challenge-1021.intigriti.io/challenge/challenge.php?html=</h1></div><code id=intigriti><b><i(('>&xss=));alert(document.domain);
Rating:
9/10