XSS例題(下書き中)
課題草案(第四版)
アリスのサーバにはtext/html(charsetはUTF-8)でサーブされるHTML4.01相当のHTML文書を吐き出すサービスがある。以下はそのHTMLの一部分なのだが、第三者であるイブは、一定の条件に従った文字を出力できることに気がついた。
<script type="text/javascript">
ここらへんにイブが何か書ける
</script>
文字について一文字ずつ投入して調べたところイブが出力できる文字は、以下の通りであった。- スペース
- 改行
- セミコロン
- 三種類の括弧 ( ) [ ] { }
- ローマ字
- 数字
- 関数に引数を渡すための括弧である、( や ) はエラー
- メソッドにおいても上記同様
- 一般に、関数オブジェクトに引数を渡す記述に使われる ( や ) はハネラレルようだ
- 一方、ステートメントの構文に使われる( や ) は使える ≪if 文など≫註参照。
- function キーワードもハネラレて書き下せない
- Functionやconstructor も書き下せない
- setter や getter も書き下せない
なお、筆者が想定している解はすでに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 を放り込んでいるわけです。等号の代替物として使ってみようか、というサンプルでした。