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

  • ページ: BugTrack
  • 投稿者: hirofummy?
  • 優先順位: 緊急
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2003-02-23 (日) 01:15:30
  • バージョン:

メッセージ

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


  • POSTやCOOKIEを利用して同様の攻撃が可能かどうかは私はよく分からないのですが、できそうな気もする*2のでサニタイズしておきました。して損ということもないでしょうし。 -- hirofummy? 2003-02-23 (日) 01:22:16
  • cvsに投入しました。確認をお願いします。 -- ぱんだ 2003-02-23 (日) 14:34:58
  • 確認しました。preg_replace('/\x00/','',$arg)じゃなくてsanitize_null_characterすればいいんですよね…私って頭のネジが足りないのかも X( -- hirofummy? 2003-02-23 (日) 15:14:57
  • 「サニタイズ漏れ」を防ぐ、という意味では$HTTP_SERVER_VARSもGPC*3と同じように$serverのような変数にサニタイズしたものを代入しておいてプログラム内ではそちらを使うようにする、というのが一番いいかもしれません。 -- hirofummy? 2003-02-23 (日) 15:25:21
  • この問題に対処した版を1.3.4 としてリリースしたりするんでしょか?$BracketName 修正漏れ同様、修正告知に留めるかな? -- 2003-02-23 (日) 16:35:49
  • セキュリティに関係するfixなので、リリースしたほうがいいでしょうね。 -- reimy 2003-02-23 (日) 21:30:58
  • 開発日記/2003-02-23でリリース内容の検討中です。 -- ぱんだ 2003-02-24 (月) 20:38:24

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

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

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.213 sec.

OSDN