CGIのセキュリティホール


 掲示板、チャット、フォームメールなど、CGIプログラムは、コードの書き方次第によっては、ネットを暗躍する愚連隊にいたずらされてしまう危険性もあります。

 セキュリティホールと言えば、ブラウザのバグがよく大げさに騒がれています。いわゆるクラッカーはこれらのバグを悪用してコンピュータをハングアップさせたり、有害プログラムを送り込んだりすることがあります。

 しかし、いわゆるクラッカーでなくてもごく簡単にいたずらを仕掛けられる、CGIのセキュリティホールの危険は、もっと多く見られているというのに、なぜか軽視されることが多いのです(クラッカーほどの知識はない、ごく普通の人がいたずらするケースが多いため、私は「ネット愚連隊」と呼んでいます。最近は中学生坊主みたいだという意味の俗語で「厨房」と呼ぶ事もあるようですが……)。

 実際、どのようなプログラムはまずいのか、どのような弱点を突かれるのかに関しては、情報がほとんど公開されていません。 また、その情報不足が、残念ながらセキュリティホールに関する問題意識から目を背けさせる結果になってしまっています。

 中には、設置してある掲示板やチャットにセキュリティホールがあるのが明白で、連日いたずらされているにもかかわらず、対策を完全に放棄してしまっている無責任な掲示板運営者もかつていたのを見た事があります。ネット愚連隊はそのようなセキュリティの甘い掲示板を悪用して、他の掲示板にいたずらを仕掛けることもあります。

 このページは、皆さんがネット愚連隊の悪の手口を知り、それに立ち向かっていく上での貴重な資料となることでしょう。


掲示板に書き込む内容は、タグのチェックを!

 最初に、掲示板やチャットのセキュリティホールから説明しましょう。このようなタグが書き込める掲示板のリスクを知っておきましょう。


タグのチェックは本文だけでなく他の項目も忘れずに!

 せっかく本文にタグチェックをしていても、名前の部分はタグを素通りさせてしまっていたチャットプログラムを見たことがあります。この場合、名前部分に有害タグを仕込んで攻撃されてしまいますし、現にそのようなケースを何度か見たことがあります。

 タグチェックは本文だけでなく、他の項目も忘れないように行ないましょう。

 また、メールアドレスに"(ダブルクオーテーション)が入ってないかどうかを、きちんとチェックしているでしょうか。これをチェックしないと、掲示板荒らしの格好の道具になってしまうことがあります。

 名前を$name、メールアドレスを$emailという変数に入れている場合、恐らく「<a href="mailto:$email">$name</a>」と書くことでしょう。しかし、この$emailという変数にダブルクオーテーションが入っていたらどうなるでしょうか。

 例えば掲示板荒らしが名前欄に「祭りだワッショイ」、メールアドレス欄に「baka@baka.baka" style="font-size:1000pt」などと書いたらどうなるでしょうか。「<a href="mailto:baka@baka.baka" style="font-size:1000pt">祭りだワッショイ</a>」となり、「祭りだワッショイ」という1000ポイントの巨大文字が掲示板を埋め尽くすなどという事態になります。応用次第ではもっと危険ないたずらだってできます。


文字数制限はCGI側でも行うように!

 フォームに入力する最大文字数は、HTMLタグでも指定可能ですが、実はCGI側でも文字数チェックが必要です。掲示板ではきちんと文字数制限をしていても、人気投票フォーム等では、有名どころのフリーCGIスクリプトでさえチェックが甘く、荒らしの格好のターゲットになっていることがよくあります。

 自分のウェブサイト以外からでもCGIにデータ送信できることを忘れてはいけません。ローカルにHTMLファイルを保存し、最大文字数制限を取り外してCGIにデータ送信するという手口を使えば、人気投票の名前欄に1000文字だって10000文字だって入れ放題です。きちんと対策しましょう。


method=getは要注意!

 CGIプログラムがフォームなどから各種パラメータを受け取る方式として、method=getとmethod=postの2種類があります。 method=getはパラメータをURLの後にくっつけて送る方式、method=postはUNIXの標準入出力を使う方式です。

 もしhttp://www.somewhere.com/cgi-bin/bbs.cgiという、method=get方式の掲示板プログラムがある時、こんなパラメータをブラウザに入力するとどうなるでしょうか。考えてみてください。

http://www.somewhere.com/cgi-bin/bbs.cgi?name=ネット愚連隊&value=死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね

 現に、こんなURLを使って掲示板にいたずらをしてしまうという手口は過去に多く見られました。具体的には、A HREFタグに入れてリンクにしてしまったり、後述するIMGタグを使う方式が多く見られます。

 これはmethod=postにすることによって問題解決できます。

 アクセスカウンタ、検索プログラムなどはmethod=getでも危険が少ないですが、利用者がファイルに書き込んだりメールを送ったりするようなプログラム、例えば掲示板、チャット、フォームメールなどでは、このようにmethod=getが悪用される危険性があります。この種のプログラムでは、method=postの使用できないサーバ(今ではほとんど見かけません)を除き、できるだけmethod=postを使いましょう。

 また、「method=getかmethod=postかを環境変数REQUEST_METHODで知り、それぞれに応じて処理する」という方法は、method=postで作ったはずのプログラムでもmethod=getを許可してしまうことになってしまいます。プログラムをmethod=postに設定したなら、REQUEST_METHODがgetで書き込まれた場合、書き込みを禁止しましょう。


IMGタグの危険な裏技にご用心!

 IMGタグには、表示画像としてGIFファイルやJPEGファイルだけではなく、CGIプログラムの出力した画像(例えばアクセスカウンタなど)を表示することができます。しかしIMGタグには、表示する画像として指定したCGIプログラムが画像を出力するものでなくても、なぜか実行できてしまう、という危険な裏技があります。

 これを悪用して、前述の掲示板自動書込URLをSRC=の部分に記述してしまういたずらを、かつてよく見かけました。ブラウザが画像を読み込もうとすると、画像はもちろん表示されませんが、その代わり掲示板に自動的に書き込んでしまうというカラクリです。 この手口には気を付けましょう。

 対策としては、method=getでの書き込みを禁止する方法が一番効果的です(method=postが使えるサーバの場合)。もしそれができない場合は、「"?"が入っているIMGタグ」の書き込みを拒否すれば、少なくとも自分の掲示板には、危険な自動書込タグを仕掛けられる危険がなくなります。


ネット愚連隊も顔負け! ネズミ講の迷惑広告

 ネズミ講の迷惑広告や有料ポルノサイトの広告などを勝手に掲示板に書き込まれてしまうケースも時々あります。 特に前者はかなりの長文なのでやっかいな代物です。うっとうしい長文の迷惑広告を書き込まれないよう、掲示板に書き込める文字数を制限しましょう。

 また、掲示板を設置したら頻繁に見回りをすることをおすすめします。万一、危ない情報が書かれてしまったら、迷惑がかかったり「うるさい人々」に見付かる前に、早く消さないと危険です。サンゴ礁の偽写真事件で有名になった某大手新聞社の記者が、酒鬼薔薇君の本名の掲載されていた掲示板を発見した時、(掲示板管理者はその種の掲示を消すよう努めていたにもかかわらず)どんな無思慮な記事を書いたかは、皆さんの記憶に新しいはずです。


戻る