%00の含まれるGETリクエストによって引き起こされる問題

メッセージ

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_~の挿入は必要ありません。



*1 どのファイルに追加するのが適切か分からなかったので…
*2 ただの勘です
*3 GET,POST,COOKIE

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2003-02-24 (月) 20:38:24
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.205 sec.

SourceForge