XSS例題(下書き中)

課題草案(第四版)

アリスのサーバにはtext/html(charsetはUTF-8)でサーブされるHTML4.01相当のHTML文書を吐き出すサービスがある。以下はそのHTMLの一部分なのだが、第三者であるイブは、一定の条件に従った文字を出力できることに気がついた。

<script type="text/javascript">
ここらへんにイブが何か書ける
</script>
文字について一文字ずつ投入して調べたところイブが出力できる文字は、以下の通りであった。
  • スペース
  • 改行
  • セミコロン
  • 三種類の括弧 ( ) [ ] { }
  • ローマ字
  • 数字
イブは試みに、alert(1) 他、いろいろ出力したのだが、エラー表示となり駄目であった。つまり、( や ) については、書きだせる場合とそうではない場合があり、どうやらWAFによって、特定のケースではエラーとなりハネラレルことにイブは気がついた。アリスが設定したWAFは、非常に珍しいタイプのものであった。イブが調べた限りでは、以下のような設定になっている。
  • 関数に引数を渡すための括弧である、( や ) はエラー
  • メソッドにおいても上記同様
  • 一般に、関数オブジェクトに引数を渡す記述に使われる ( や ) はハネラレルようだ
  • 一方、ステートメントの構文に使われる( や ) は使える ≪if 文など≫註参照。
  • function キーワードもハネラレて書き下せない
  • Functionやconstructor も書き下せない
  • setter や getter も書き下せない
さて、イブがごにょごにょしているそばで、あなたはアドバイスをしてあげた。ほどなくしてイブは、アリスのこのHTMLに、とある文字列を出力することなどを行い、alert(0)することに成功した。あなたのアドバイスは如何なるものであったか?
なお、筆者が想定している解はすでにjsbin.com上にアップしてあり、はてなダイアリーからa要素でリンクすることで回答を示す予定である。

小括弧()についての註

この仮想的なWAFは、構文解析をしていて、【例えば】以下のようなケースでの ( ) を容認する。この考え方の圏内であればさまざまな変種を使ってよい。

<script type="text/javascript">
if (condition) {
statements
} else {
statements
}
for (initialization; condition; update) {
statements
}
for (variable in object) {
if (filter) {
statements
}
}
while (condition) {
statements
}
do {
statements
} while (condition);
switch (expression) {
case expression:
statements
default:
statements
}
with (eee) {
statements
}
</script>

解答例(第四版)

Firefox 4.0 on Windows 7 で動作確認しました。実際には、Firefox 1.6 の頃、すでに動作してます。下記のリンクかをクリックしてください。但し、別窓や別タブでは(永久ループしないように)細工がしてありますので、alert(1)しません。また、直接URLをアドレスバーにいれても動作しません。window.nameにスクリプトの断片を仕込んでいるからです。


  • 解答例(第四版)


  • Standard ECMA-357 ECMAScript for XML (E4X) Specification をサポートしているブラウザでは、The for-each-in Statement が使えます。 このステートメントを利用して、location に name を放り込んでいるわけです。等号の代替物として使ってみようか、というサンプルでした。