サイト Mustache-Security は、KnockoutJSのXSS脆弱性を説明しています...この脆弱性は、eval(または同等の)を使用して、data-bind属性のテキストを実行可能なスクリプトに変換することで発生します。ほとんどの例は、データバインド属性に挿入された場合に悪意のあるスクリプトが実行される可能性がある攻撃を示しています。
例(HTML/JavaScript/KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="click: alert(1)"></div>
<div data-bind="value: alert(2)"></div>
<div data-bind="style: alert(3)"></div>
...
<select data-bind="options: alert(99)"></select>
<script>
ko.applyBindings();
</script>
例を定義したとおりに再現することはできますが、通常は、KnockoutJSを使用するときにJavaScriptをデータバインド属性に配置しないようにします。私はJavaScriptオブジェクトの監視可能なプロパティを参照して、ビューの動作をレイアウトから分離することを好みます。このアプローチを使用すると、JavaScriptが実行可能ではないことがわかりました。
例(HTML/JavaScript/KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="value: firstName"></div>
<script>
var ViewModel = function() {
this.firstName = ko.observable('alert(2)');
}
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
私のアプリケーションは、KnockoutJSを使用したという理由だけでXSSの危険にさらされていますか、それともサーバー側のコードを使用して、信頼できない入力をデータバインド属性に入れる方法を見つける必要がありますか?
例(ASP.NET/HTML/JavaScript/KnockoutJS):
<div data-bind="value: <%=Request.QueryString("id")%>"></div>
攻撃者がJavaScriptを使用してページにスクリプトを挿入できれば、DOMを直接簡単に操作でき、KnockoutJSがXSSのリスクを増大させることはないと思います。
他に何か不足していますか?著者が説明するXSSの脆弱性を防ぐために他に何をする必要がありますか?
mustache-security で説明されている攻撃は、<script>
タグを含むHTTPリクエストをドロップすることでXSSを阻止しようとするWebアプリケーションファイアウォール(WAF)のバイパスを説明しています。ページがKnockoutJSを使用している場合、攻撃者は<div>
タグの代わりに<script>
タグを使用してコード実行を取得できます。
http://localhost/xss?id=<div data-bind="html: '\x3cimg\x20src=x\x20onerror=alert\x281\x29\x3e'"></div>
上記の攻撃が機能するには、山かっこ<>
を使用してHTMLタグを挿入できることが攻撃者にとっての必要条件となります。