GETリクエスト中に%00を含めることで本来出来ないはずのことができるようになってしまいます。 私が確認しただけで、凍結ページの編集(さらに編集後は凍結が解除された状態になってしまいます)、不正な名前のページの作成が可能です。 PukiWiki1.4でこの問題を確認しましたが、ソースを見る限り1.3.x系列でも可能であり、早急に対策を施す必要があります。
http://ns1.php.gr.jp/pipermail/php-users/2003-January/012742.html
まず以下の関数をfunc.phpあたり*1に追加します。
function sanitize_null_character($param) { if(is_array($param)) { $result = array(); foreach($param as $key => $value) { $key = sanitize_null_character($key); $result[$key] = sanitize_null_character($value); } } else { $result = preg_replace('/\x00/','',$param); } return $result; }
その上で1.4であれば152行目、1.3.3であれば45行目(magic_quotes_gpc対策処理の直後)に以下のコードを挿入します。
$get = sanitize_null_character($get); $post = sanitize_null_character($post); $cookie = sanitize_null_character($cookie);
さらに、1.4なら191行目、1.3.3なら58行目(上記の挿入を行った後だと実際にはもう少し後ろになります。$argへの代入処理の直後の部分です。)に以下のコードを挿入します。
$arg = preg_replace('/\x00/','',$arg);
以上で完了ですが、今後のサニタイズ漏れを防ぐ意味で、QUERY_STRINGを処理して$argへの代入処理を行っている部分を
$arg = ""; if(sizeof($_GET)==1) { reset($get); list($arg,) = each($get); reset($get); }
以上のように書き換える方が適切でしょう。 この書き換えを行った場合、$arg = preg_~の挿入は必要ありません。