トップページに戻る
tokix.netはネットワーク・セキュリティ周辺から半径rな雑文を垂れ流す不定期更新個人サイト>>このサイトについて

超初級CGIクラックガイド

<<トップカテゴリー「NetChildren」に戻る

超初級CGIクラックガイド(1) (>>この記事のみを表示)

この世で一番分かりやすいクラックはCGIクラックだと思います。単純な理由です。この世に存在するほぼ全てのクラックは「裏技」です。例えばFC版ドラクエ4でコイン買う時に極端に多い枚数を指定すると値段が安くなるって裏技があったの覚えてますか?あの原理は単純ですよね。

「買い物でいくら払うか」という変数が0-16777215の領域までしか用意されていない。だから20000000Gの買い物ならば値段は20000000-16777215Gになる。

「(プログラムの)原理が分かる」ということは「裏技の原理が分かる」ということです。そして「クラックは裏技だ」というのは「デバッグ(?)されてたら通用しないよ」という意味でもあります。

しかし普通のWinユーザーはUNIXの動作原理は勿論Winの動作原理・IEの動作原理等々を知っている訳ではありません。ただ高級言語(我々人間に理解しやすい言語)で記述されたCGIなら動作原理が見えやすいと思うんです。サイト運営しててCGI組める人なら尚更。

この世で一番分かりやすいクラックはCGIクラックだと思います。そういう意味です。


まずCGI組めない人向けの解説から始めます。組める方はごめんなさい。

CGIとは一言で言えば「状況に応じカスタマイズされたhtmlファイルを閲覧者に引き渡すための手段」です。普通、例えばindex.htmlをメモ帳とかホームページビルダーとかで作ってアップすればそのページにアクセスした人は皆同じindex.htmlを見ますよね。CGIを使えば

  • 書き込み状況によって掲示板のログ表示が刻一刻と変化する
  • アクセスによってカウンターのアクセス数が刻一刻と変化する

といった芸当が可能な訳です。そしてCGIとは出力htmlカスタマイズ手段である訳ですからその作業は

  • 内部処理(=色々な処理を経てカスタマイズ)
  • 出力(=カスタマイズしたモノを出力)

という二段階に分けられる。

JavaScript知らなければかえって悩むこともないと思うんですが中途半端にかじってる人(ソースコピペで自サイトに設置したりしてる人)のために書いておくと、「CGIとJavaScriptって何が違うんだ」という問いに対するこの連載における答えは

  • CGIの内部処理は閲覧者から見えない出力しか見えない(JavaScriptの処理はhtmlに記述されますよね)
  • CGIは閲覧者がアクセスできないサーバー上のファイルにもアクセスできる

の二つということで。この二つって実は同じことです。「CGIはサーバーサイド、JavaScriptはクライアントサイド」という一言で説明できますが、まぁ分からなければ別にいいです。

さて。CGIの処理とはつまりプログラムです。凄く簡単なCGIソースを書きます。

#!/usr/bin/perl

これはperlで書いたCGIですよという宣言(約束事)

@time = localtime(time);

$sec=$time[0];

$min=$time[1];

$hour=$time[2];

内部処理

print "Content-type:text/html\n\n";

ここから出力ですよという宣言(約束事)

print "<html><head></head><body>現在時刻は$hour:$min:$sec</body></html>";

出力


一応書いておくと、ここで「約束事」と定義した二行はかなり乱暴な説明を行っています。「とりあえずCGIの基本原理をちゃちゃっと分かって貰うために手っ取り早い説明」であってそれ以上ではないので本気で勉強しようと思う人は他のサイトを見て下さい。

まぁ「localtimeって何?」とかに一切答えてないですけど「何をしてるか」ってことは大体分かりますよね?このCGIを10時23分41秒に実行すれば

<html><head></head><body>現在時刻は10:23:41</body></html>

というhtmlソースを受け取ることになる訳です。

さて。今のCGIには「プログラム」としての重要な要素が欠けています。「出力htmlをカスタマイズ」といってもそれは「アクセスした時刻によって」でしかない。「閲覧者の意志によるモノ」が一切含まれない。

CGIに「閲覧者の意志」を伝えるための方法はformです。

超初級CGIクラックガイド(2) (>>この記事のみを表示)

超初級CGIクラックガイド(1)に引き続きCGIを組んだことがない人向けに概要を書いています。今回はformに関して。


CGIに「閲覧者の意志」を伝えるための方法はformです。

今の気持ちをどうぞ


<input type="text" name="test1" value="ティッシュはネピアだと思うよな?">

次世代マシン、どれを買う!?


<select name="test2">

<option value="ps">PlayStation

・・・

</select>

書き込み失敗したCDRは

投げて遊ぶ

割って遊ぶ


<INPUT TYPE=radio name="test3" value="throw!!" checked>投げて遊ぶ<br>

<INPUT TYPE=radio name="test3" value="destroy!!">割って遊ぶ<br>


<input type="submit" value="cgiを実行だ!(押しても意味無いです)">

formってのは例えば上記のような感じですね。formを使うことで「閲覧者の意志によってCGIの出力htmlをカスタマイズする」ということが可能になります。formから「閲覧者の意志」をCGIに送信し実行する訳です。

簡単なformのソースを書いてみます。

<form action="cgidesu.cgi" method="get">

<input type="text" name="test">

<input type="submit">

</form>

これで「閲覧者の意志をcgidesu.cgiに送信し実行するform」になるんですが、強調文字部分に注目して下さい。

method="get"

これは「どうやってフォーム内のデータをCGIに送信するか」の指定です。二種類あるんですよ、送信方法には。

  • get
  • post

超初級CGIクラックガイド(3) (>>この記事のみを表示)

formのmethod・・・「どうやってフォーム内のデータをCGIに送信するか」の指定・・・には二種類ある。
  • get
  • post
送信方法によって、「閲覧者の意志」がどのようにCGIに伝わるのかが変わってくる。

□:formのmethodがgetの場合(もしくはmethod指定が省略されている場合)
環境変数query_stringにセットされる
・・・という説明はよくありますがCGI組めない人間からすれば意味不明だと思うので書くと、
http://www.tokix.net/search.cgi?keyword=profeel&language=japanese
こういうURLをネットサーフ中に見たことありませんか?アレです。「?」以降が環境変数query_stringです。
上記は
  • 「http://www.tokix.net/search.cgi」というCGIに
  • 「keyword=profeel&language=japanese」というquery_stringを送信し実行する
という意味なんですね。で、まぁ「profeelを含むページは存在しません」とか言われる訳ですかね。
<form action="http://www.tokix.net/search.cgi" method="get">
<input type="text" name="keyword">
<select name="language">
<option value="japanese">日本語
<option value="english">英語
<input type="submit">
</form>




こんなformの上(text入力スペース)に「profeel」と打って下(選択欄)から「日本語」を選択してsubmit



してもいいですし、
http://www.tokix.net/search.cgi?keyword=profeel&language=japaneseを直接指定してもいい。その二つはCGIにとって同じことです。別の言い方をすればmethod=getなformというのはユーザーの「?」以降の入力の手間を軽減するために存在する。
検索の度「http://www.tokix.net/search.cgi?keyword=profeel&language=japanese」とかブラウザに打ち込むのは大変ですからね。

超初級CGIクラックガイド(4) (>>この記事のみを表示)

前回までで書いたように、method=getなform内の閲覧者の書き込み(や選択状況)はURLの一部として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>
が「検索結果へのリンク」になる訳です。
ところで。
特定のURLを閲覧者に(非自覚的に)開かせる方法はたくさんあります。
  • 上記のようにAタグを使いリンクとして
  • metaタグのリフレッシュを使い強制的にページ移動
  • フレームを使って指定
  • imgタグのsrcで指定
方向性としてこんな感じでしょうか。htmlだけでなくJavaScriptや.htaccess設定を使えばもっと話は広がりますが。
「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」と書いて送信したならば
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」という書き込みを行います。
<meta http-equiv="refresh" content="3; url=http://www.tokix.net/cgi-bin/bbs.cgi?myname=baka&content=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のフレーム内部に表示されるため、このサイトが元々フレームを使っているならば多くの閲覧者は自分が書き込みを行ったことに気付かないでしょう。
<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を指定しているので多くの閲覧者は気付かないでしょう。
そしてこのエラーはあくまで「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」。・・・という説明も本当はかなり乱暴なんですが今回はそういうことで。
勿論、こんな方法が上手くいく掲示板は殆どないと思います。掲示板管理側からすれば
  • 書き込み時のmethodはpostを使う
  • 書き込み時にリファラー(どのURLから書き込みが行われたか、という情報)を参照して正当なformがあるURLでなければ弾く
のどちらかを使えば対策を取れるからです。
しかしこの発想を生かしたイタズラが一切不可能かというと、そうではないと思います。
逆の言い方をすれば
  • method=getでデータを受信する
  • 何らかの事情によりリファラーチェックを行っていない
上記二条件の両方を満たすCGI相手ならばこの方法(を応用したイタズラ)を使うことができるからです。

超初級CGIクラックガイド(5) (>>この記事のみを表示)

前回までで二回に渡りmethod=getの場合を解説してきたので、今回はmethod=postの場合に関して
□:formのmethodがpostの場合
標準入力にセットされる
・・・という説明もCGI組めない人からすれば呪文でしかないとは思います。ただ、method=postなformから送られたデータはアドレスには現れません。
<form action="http://www.tokix.net/search.cgi" method="post">
<input type="text" name="keyword">
<select name="language">
<option value="japanese">日本語
<option value="english">英語
</select>
<input type="submit">
</form>
このformの検索語入力スペースに何を書いてもsubmitした時のアドレスは「http://www.tokix.net/search.cgi」です。ただ「keyword欄に○○と書いてlamguage欄から××を選んだ」という情報はCGIに送信されます。「裏で送信されている」という説明で今回は勘弁して下さい。
さて。ちょっと話を戻しましょう。超初級CGIクラックガイド(3)の「getメソッド編」をもう一度読んで下さい。環境変数query_stringの中身はどのような形式になっていますか?
http://www.tokix.net/search.cgi?keyword=profeel&language=japanese
「keyword=profeel&language=japanese」というのは「name=閲覧者に指定された値&name=閲覧者に指定された値&・・・」という形式になってますね。超初級CGIクラックガイド(3)の例であればkeywordはtext入力欄から、languageは選択欄から送信される訳ですが送信段階では同じように扱われています。
これはpostメソッドでも同じです。
<form action="http://www.tokix.net/search.cgi" method="post">
<input type="text" name="keyword">
<select name="language">
<option value="japanese">日本語
<option value="english">英語
</select>
<input type="submit">
</form>
上に「profeel」と書き下から「日本語」を選んだならばpostした時「裏で送信されるデータ」は「keyword=profeel&language=japanese」です。

超初級CGIクラックガイド(6) (>>この記事のみを表示)

超初級CGIクラックガイド(3)超初級CGIクラックガイド(4)でform=getの場合、超初級CGIクラックガイド(5)でform=postの場合に関して説明してきました。そのどちらの場合にも、formからCGIに伝わるデータは「name=閲覧者に指定された値&name=閲覧者に指定された値&・・・」という形式です。「このデータはtext入力欄から送信されたのか選択欄から送信されたのか・・・」という識別はありません。
今回の話はmethodがgetであれpostであれ同じです(「query_stringとして伝わるか標準入力として伝わるか」という差はありますが)。
これを使ったイタズラを考えてみましょうか。

某コミニケーションサイトには「プロフィールカード」ってモノがありました。メンバー一人一人がプロフィールを書き込む訳です。設定画面がこんな感じ。
<form action="***.cgi" method="post"> ←別にgetメソッドでも話は同じですよ
<input type="text" name="myname">
<select name="address">
<option value="北海道">北海道
<option value="青森">青森

</select>
<input type="submit">
</form>
「住所」は選択式ですね。これじゃつまらない。住所くらい好きに設定したいじゃないですか。
そこで僕はこんなウェブページを作りました。
<form action="http://www.****.com/***.cgi" method="post">
<input type="text" name="myname">
<input type="text" name="address">
<input type="submit">
</form>
「上手くいくかなぁ」とドキドキしながら試してみたら上手くいきました。これで、「北海道」とか「青森」とかしか選べなかった「住所」を自分で自由に設定することが可能になったんです。
そしてこの方法が他メンバーにも普及ししばらくしたらこの穴は塞がれました。プロフィール変更CGI(上の「***.cgi」)で「address=*****の*****が不正ならば弾く」という処理を行うようになった(多分)からです。
次回でもうちょっと話を進めます。

超初級CGIクラックガイド(7) (>>この記事のみを表示)

form内にはtextやselect以外にtextareaをおくこともできます。textareaは複数行入力ができるので、つまり改行をCGIに送信することができます。

ここに、こんな一行掲示板があったとしましょう。
書き込み時
text欄から「名前」と「書き込み内容」を取得し環境変数から「書き込み人のIP」を取得しデータファイルに書き込む。
データファイルでは「名前,内容,IPアドレス」を一行に。書き込みがある度どんどん下に追記。こんな感じ。
taro,こんにちはー。今日いい天気ですねー,12.34.56.78
hanako,こっちは雨だボケ,23.45.67.89
ログ表示時
データファイルから一行ずつデータを取り出しそれを「,」で区切って「名前,内容,IPアドレス」にして「名前」と「内容」を「名前 > 内容」の形式で表示する。で古い順に表示。こんな感じ。
taro > こんにちはー。今日いい天気ですねー
hanako > こっちは雨だボケ
IPアドレスは管理者しか見れないようになってる訳ですね。

さて。 もしここで、本来はtext欄から送られる(つまり改行がない)「書き込み内容」を僕がtextarea欄から
こんな風に送信したらデータファイルはどうなりますか?
taro,こんにちはー。今日いい天気ですねー,12.34.56.78
hanako,こっちは雨だボケ,23.45.67.89
tokix,僕は雨が好きです
飴はもっと好きです,34.56.78.90
当然こうなりますね。するとログ表示時、行ごとに書き込みを区切り「,」でデータを区切るCGIは書き込みをこのように判断します。
  1. 「taro」が「こんにちはー。今日いい天気ですねー」と書き込み(IPアドレスは「12.34.56.78」)
  2. 「hanako」が「こっちは雨だボケ」と書き込み(IPアドレスは「23.45.67.89」)
  3. 「tokix」が「僕は雨が好きです」と書き込み(IPアドレスは「」)
  4. 「飴はもっと好きです」が「34.56.78.90」と書き込んだ(IPアドレスは「」)
ログ表示はこうなりますね。
taro > こんにちはー。今日いい天気ですねー
hanako > こっちは雨だボケ
tokix > 僕は雨が好きです
飴はもっと好きです > 34.56.78.90
CGIが「書き込み内容内に改行コードがあったら弾く(もしくはデータファイル書き込み時に<br>等に置換する)」という処理を取っていればダメですが。

超初級CGIクラックガイド(6)と今回で書いた話は結果を見れば「遊び」と「自爆(わざわざ自分のIPを晒している)」の二例ですが、「CGI相手のイタズラを発想する例(そしてCGIを自作するならば何に気を付けるべきなのかという例)」だと考えて頂ければ。

超初級CGIクラックガイド(8) (>>この記事のみを表示)

今度は「複数のデータファイルを扱える掲示板CGI」です。
  • http://****.com/bbs.cgi?datafile=room1.dat
  • http://****.com/bbs.cgi?datafile=room2.dat
  • http://****.com/bbs.cgi?datafile=room3.dat
というように、datafile=*****の*****を変えることで一つのCGI(上記ならbbs.cgi)で複数部屋を扱える。
例えばなんですがトップページがこんな具合になっているサイトで使われている掲示板はこのタイプですね。
<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=*****の形で指定する訳です。
  • 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
つまり、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を開いたらどうなりますか?
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はコレを「書き込みデータ」として以下のように解釈しますね。
「今日体重計乗ったら82KGだった。」という名前の人が「」と書き込み(IPアドレスは「」)
「来月までには70KG台にしよう。」という名前の人が「」と書き込み(IPアドレスは「」)
「でも」という名前の人が「ダイエットって成功したことないんだよ」と書き込んだ(IPアドレスは「うまくいくかな・・・。」)
よってbbs.cgiの出力は以下です。
今日体重計乗ったら82KGだった。 >
来月までには70KG台にしよう。 >
でも > ダイエットって成功したことないんだよ
・・・もう分かったと思いますが、このbbs.cgiはサーバーにとって果てしなく危険な存在です。「datafile=*****」の「*****」に「本来想定されていない値」を指定されることで、サーバー上のファイルを閲覧者に見せてしまう。
勿論bbs.cgiが「datafile=*****」の「*****」が正当かどうかを判別してからデータの読み込みを行えばこうした穴は発生しませんが。
興味がある人なら聞いたことあると思いますが1chのform.cgiの穴。アレはこの話からそれほど遠くない場所にあります。

超初級CGIクラックガイド(9) (>>この記事のみを表示)

超初級CGIクラックガイド(1)で書いたんですが、CGIというモノには二つの特徴があります。
「CGIとJavaScriptって何が違うんだ」という問いに対するこの連載における答えは
  • CGIの内部処理は閲覧者から見えない出力しか見えない(JavaScriptの処理はhtmlに記述されますよね)
  • CGIは閲覧者がアクセスできないサーバー上のファイルにもアクセスできる
の二つということで。この二つって実は同じことです。「CGIはサーバーサイド、JavaScriptはクライアントサイド」という一言で説明できますが、まぁ分からなければ別にいいです。
「後者が何を意味するのか」というのは前回書きましたね。CGIを上手く利用してやれば、本来は閲覧者がアクセス不能なファイルを覗くことも可能かもしれない(超初級CGIクラックガイド(8)では書きませんでしたが、「覗くことも可能かもしれない」ということは即ち「書き込むことも可能かもしれない」ということです)。
今回は前者について。
僕はこれまで「ここにこんな(処理を行う)CGIがあったとします」と最初にCGIの内部処理を明かし、その上で「その処理を行うならばどのような穴が発生しうるか」を書いてきました。
しかし実際には、「あるサイトで動いているCGIがどのような処理を行っているのか」ということはそのサイトの管理者しか知らない情報です。KENT-WEBのYY-BOARDや2apesのapeboard等「配布CGI」ならば同じプログラムを入手することは可能ですけどね。オリジナルのCGIじゃお手上げです。

オリジナルのCGIの内部処理を推測し穴を予想する
ここが頭の使い所なんです。

一つだけ例を挙げておきます。
超初級CGIクラックガイド(7)の話を思い出して下さい。textareaから(改行コードを含んだ)データを送信しデータファイルのデータを狂わせる話です。
ここに、こんな一行掲示板があったとしましょう。
と僕は話を始めました。何故「掲示板」ではなく「一行掲示板」なのか分かりましたか?
「掲示板」の本来の書き込みformはこんな感じでしょう。
名前<input type="text" name="myname">
本文<textarea name="content"></textarea>
そして「一行掲示板」の本来の書き込みformはこんな感じでしょう。
名前<input type="text" name="myname">
本文<input type="text" name="content">
当然、CGIが「書き込み内容内に改行コードがあったら弾く(もしくはデータファイル書き込み時に<br>等に置換する)」という処理を取っていればダメですが。
この世に存在するほぼ全てのクラックは「裏技」です。「裏技」とは「プログラムサイドの処理の穴を予想/利用し本来想定されていない動作を行わせる」ということです(「コナミコマンドで無敵に」とかはここでは「裏技」と言わないことにします、あれは「裏技」というより「イースターエッグ」「隠し要素」だ)。
書き込み内容内に改行コードがあったら、データファイル書き込み時に<br>等に置換する
これは、本来的に改行コードが送信される可能性のある複数行入力可能な掲示板では「必須の処理」です。そして本来的には改行コードが送信されることのない一行掲示板では「悪意ある利用者の存在を仮定した時に必要になる処理」です。
これが
ここに、こんな一行掲示板があったとしましょう。
と話を始めた理由です。
次に僕は
データファイルでは「名前,内容,IPアドレス」を一行に。書き込みがある度どんどん下に追記。
と掲示板の処理を明記しました。これは「実際配布されている各種掲示板CGIスクリプトのソースを読んだ経験上」です。そのような処理を行っている掲示板が多いですし、実際自分でスクリプトを書こうとするとコレが様々な面で効率の良い方法であることが分かります。よって「(処理が見えない)目の前にある掲示板もこのようにデータを保存しているのではないか」という推測が可能になる。

超初級CGIクラックガイド(7)の掲示板の話はこのようにして書かれています。これを「例」として、今回の連載を終えようと思います。
※参考:会員制サイトにおけるパスワード
「サーバー上で動作しているCGIの内部処理を予測する」という話の例として
「クラック」というモノは「映画の主人公がやっているよく分からない超能力」や「ツールを落として起動してボタン押すとできること」ではない。
この世で一番分かりやすいクラックはCGIクラックだと思います。
と最初に書きました。その意味が少しでも伝われば嬉しいです。
dammy

Credit

SeeAlso

OtherSubCategory

Footprint

Navigation