本来ありえない名前のページが作成できる

メッセージ

POSTリクエストの内容をチェックしていないために本来ありえない名前のページが作成できます。 私がこの脆弱性の存在を確認したのは以下のファイルです。

このリストは1.4pre5のものですが、1.3.3でもほぼ同様と思われます。

対策案

file_write関数(file.php)の先頭に以下の処理を追加することで一応の回避策になります。

  global $_title_invalidwn,$_msg_invalidiwn;

  if (!is_pagename($page)) {
    die_message(
      str_replace(
        '$1',
        htmlspecialchars($page),
        str_replace('$2','WikiName',$_msg_invalidiwn)
      )
    );
  }

各プラグインの関数先頭にも適宜以下のような処理を加えた方がいいかもしれません。

  global $_title_invalidwn,$_msg_invalidiwn;

  if (!is_pagename($post['page'])) {
    return array(
      'msg'  => $_title_invalidwn,
      'body' => str_replace('$1',htmlspecialchars($post['page']),str_replace('$2','WikiName',$_msg_invalidiwn))
    );
  }

file_write関数で対処しているため必要ないとも言えますが、file_writeの対策だけでは「<><><><>で更新の衝突が起きました。」のような画面には辿り着けてしまうので、精神衛生上対策した方がよいかと思います。 1.3.3ならば以下のような感じでしょうか。

  // pukiwiki.php195行目付近(else if($post["write"])の直前)
  // ページ名が正当であるときのみ書き込みを許す
  else if($post["write"] && !preg_match("/^(($BracketName)|($WikiName))$/",$post["page"]))
  {
    $title = str_replace('$1',htmlspecialchars(strip_bracket($post["page"])),$_title_invalidwn);
    $body = $page = str_replace('$1',make_search($post["page"]), str_replace('$2','WikiName',$_msg_invalidiwn));
    $template = '';
  }

追記

$post['page']、$post['refer']などページ作成絡みのパラメータしか確認していませんが、ひょっとしたら他のパラメータにもチェックが甘い/ないものがあるかもしれません。



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

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

SourceForge