PHP を使ったページにおけるプログラミングエラーを攻略するワームが登場

PHP を使ったページにおけるプログラミングエラーを攻略するワームが登場しているようです。PHP の Include() あるいは Require() を誤用したページを利用して繁殖しているようです。

セキュリティホール memo

よくわからないのですが…たぶん

<?php
if(isset($action)) include($action);

ってなコードが危ないようです…ってあたりまえですから! でも広がりを見せてるってことはそれなりに使われてるってことなんだろうな。

<form action="?">
<select name="datafilename">
 <option value="a.txt">A
 <option value="b.txt">B
</select><input type=submit></form>
ファイルの中身は
<pre>
<?php
if(isset($_GET['datafilename']))  include( $_GET['datafilename'] );
?>

みたいなスクリプト、初心者が書きそうだな…。こんな使い方でも $datafilename が "../../../../../../etc/passwd" とか設定できるんで、ちゃんとチェックしましょうね。
さらに言うと、datefilename="http://www.nazoking.xxx/xxxxx.php" とかやられて、http://www.nazoking.xxx/xxxxx.php の中身(出力結果)が

<?

ハードディスクをフォーマットしてワームを植え付けるスクリプト

?>

をだったりするとどうなるか、考えてみてください。
一番安全なのは

  • $_GET['datafilename'] が、 a.txt か b.txt 以外の値ならエラー表示

だけど、 c.txt とか増えるかも…って時は、

  • ディレクトリを上らないか? (realpath関数でパスの ../ とかの組み合わせを展開して、それで得た文字列の前部分がデータフォルダを指していればOK
  • [a-z]\.txt という正規表現に一致すればOK

などなど。