超初級CGIクラックガイド(8)
今度は「複数のデータファイルを扱える掲示板CGI」です。
例えばなんですがトップページがこんな具合になっているサイトで使われている掲示板はこのタイプですね。
さて。ここにこんなCGIがあったとしましょう。
つまり、bbs.cgiは自分(bbs.cgi)から見て「../bbsdata/*****」というファイルを開き、そのファイルから「過去の書き込み情報」を取り出す。
ついでにこのサーバーのpublic_htmlの外には「secretdata/secretdata.txt」という秘密のファイルもあるとしましょう。
前にも別のテキストで書きましたが「public_html」は「ウェブで公開されるフォルダ」です。「public_html/bbs.cgi」ってのがつまり「http://****.com/bbs.cgi」になる訳です。逆に言うと、public_htmlの外にあるファイルはウェブで公開されない。しかしCGIプログラムはサーバー内部で実行されるためこうしたファイルにもアクセスできる(超初級CGIクラックガイド(1)でも書きましたが)。書き込み人のIPアドレスをも含んだ書き込みデータファイルや秘密のファイル等「閲覧者には見せたくないファイル」はpublic_htmlの外に置けば安心なのですね。
さて。上のbbs.cgiのように、CGIに引き渡す値(getならquery_stringでpostなら標準入力ですね)を「読み込むファイル名」に使うCGIは概して危険性を持っています。
例えば、僕がこんなURLを開いたらどうなりますか?
この「秘密のデータファイル(secretdata/secretdata.txt)」の中身が
勿論bbs.cgiが「datafile=*****」の「*****」が正当かどうかを判別してからデータの読み込みを行えばこうした穴は発生しませんが。
興味がある人なら聞いたことあると思いますが1chのform.cgiの穴。アレはこの話からそれほど遠くない場所にあります。
- http://****.com/bbs.cgi?datafile=room1.dat
- http://****.com/bbs.cgi?datafile=room2.dat
- http://****.com/bbs.cgi?datafile=room3.dat
<a href="bbs.cgi?datafile=room1.dat">ヲタによるPC討論部屋</a>
<a href="bbs.cgi?datafile=room2.dat">赤裸々な恋愛相談室</a>
<a href="bbs.cgi?datafile=room3.dat">最近生え際が後退したと思う人の部屋</a>
こういうタイプのCGIというのは、部屋ごとに別のデータファイルを使っています。で、どのデータファイルを使うかをdatafile=*****の形で指定する訳です。<a href="bbs.cgi?datafile=room2.dat">赤裸々な恋愛相談室</a>
<a href="bbs.cgi?datafile=room3.dat">最近生え際が後退したと思う人の部屋</a>
- room1.datというデータファイルは「ヲタによるPC討論部屋」
- room2.datというデータファイルは「赤裸々な恋愛相談室」
- room3.datというデータファイルは「最近生え際が後退したと思う人の部屋」
さて。ここにこんなCGIがあったとしましょう。
ログ表示時、datafile=*****の「*****」というデータファイルから過去の書き込み情報を参照する。具体的な読み込み方法は超初級CGIクラックガイド(7)の掲示板CGIと同じ(別の言い方をすると、超初級CGIクラックガイド(7)のCGIでは一元的だった「読み込むデータファイル」を選択可能にしたのが今回のCGIです)。
サーバー内構造は以下。| +-- | [フォルダ] public_html / | bbs.cgi |
| | | ||
| +-- | [フォルダ] bbsdata / | room1.dat |
| | | room2.dat | |
| | | room3.dat | |
| | | ||
| +-- | [フォルダ] secretdata / | secretdata.txt |
ついでにこのサーバーのpublic_htmlの外には「secretdata/secretdata.txt」という秘密のファイルもあるとしましょう。
前にも別のテキストで書きましたが「public_html」は「ウェブで公開されるフォルダ」です。「public_html/bbs.cgi」ってのがつまり「http://****.com/bbs.cgi」になる訳です。逆に言うと、public_htmlの外にあるファイルはウェブで公開されない。しかしCGIプログラムはサーバー内部で実行されるためこうしたファイルにもアクセスできる(超初級CGIクラックガイド(1)でも書きましたが)。書き込み人のIPアドレスをも含んだ書き込みデータファイルや秘密のファイル等「閲覧者には見せたくないファイル」はpublic_htmlの外に置けば安心なのですね。
さて。上のbbs.cgiのように、CGIに引き渡す値(getならquery_stringでpostなら標準入力ですね)を「読み込むファイル名」に使うCGIは概して危険性を持っています。
例えば、僕がこんなURLを開いたらどうなりますか?
http://****.com/bbs.cgi?datafile=../secretdata/secretdata.txt
すると「datafile=*****」の「*****」は「../secretdata/secretdata.txt」となり、実際開かれるファイルはbbs.cgiから見て「../bbsdata/../secretdata/secretdata.txt」。即ちpublic_htmlの外にある(=本来閲覧者がアクセス不可能な)secretdata/secretdata.txtが「掲示板のログデータ」として開かれてしまう。この「秘密のデータファイル(secretdata/secretdata.txt)」の中身が
今日体重計乗ったら82KGだった。
来月までには70KG台にしよう。
でも,ダイエットって成功したことないんだよ,うまくいくかな・・・。
だとしたらbbs.cgiはコレを「書き込みデータ」として以下のように解釈しますね。来月までには70KG台にしよう。
でも,ダイエットって成功したことないんだよ,うまくいくかな・・・。
「今日体重計乗ったら82KGだった。」という名前の人が「」と書き込み(IPアドレスは「」)
「来月までには70KG台にしよう。」という名前の人が「」と書き込み(IPアドレスは「」)
「でも」という名前の人が「ダイエットって成功したことないんだよ」と書き込んだ(IPアドレスは「うまくいくかな・・・。」)
よってbbs.cgiの出力は以下です。「来月までには70KG台にしよう。」という名前の人が「」と書き込み(IPアドレスは「」)
「でも」という名前の人が「ダイエットって成功したことないんだよ」と書き込んだ(IPアドレスは「うまくいくかな・・・。」)
今日体重計乗ったら82KGだった。 >
来月までには70KG台にしよう。 >
でも > ダイエットって成功したことないんだよ
・・・もう分かったと思いますが、このbbs.cgiはサーバーにとって果てしなく危険な存在です。「datafile=*****」の「*****」に「本来想定されていない値」を指定されることで、サーバー上のファイルを閲覧者に見せてしまう。来月までには70KG台にしよう。 >
でも > ダイエットって成功したことないんだよ
勿論bbs.cgiが「datafile=*****」の「*****」が正当かどうかを判別してからデータの読み込みを行えばこうした穴は発生しませんが。
興味がある人なら聞いたことあると思いますが1chのform.cgiの穴。アレはこの話からそれほど遠くない場所にあります。

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