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']などページ作成絡みのパラメータしか確認していませんが、ひょっとしたら他のパラメータにもチェックが甘い/ないものがあるかもしれません。