include() / require() に対する文字列挿入攻撃について

  • ページ: BugTrack
  • 投稿者: henoheno
  • 優先順位: 重要
  • 状態: 完了
  • カテゴリー: その他
  • 投稿日: 2004-12-30 (木) 15:48:02
  • バージョン:

メッセージ

  • ひとまず状態を「完了」にしておきます。疑問点があれば随時コメントして下さい。今後も各自検証のほど、よろしくお願いします :) -- henoheno 2005-01-02 (日) 14:00:54

以下は official:雑談/13 より移動。

phpスクリプトを狙った攻撃

PHPを狙う新たなワームが出現,Webページのプログラム・ミスを突く : IT Pro ニュース
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20041227/154332/
apacheのログの例
http://www.vbulletin.com/forum/showpost.php?p=783446&postcount=19
  • ウチには[25/Dec/2004:21:04:55 +0900] に来ました。pukiwikiは大丈夫ですよね? -- tito? 2004-12-27 (月) 22:35:08
    • 情報ありがとうございます :) include() や require() ねたですね。 -- henoheno 2004-12-27 (月) 23:27:43
    • 良い機会ですから簡単に見てみましょう。PukiWikiの中では include() は使われていません。あるのは全てrequire() あるいは require_once() です。 -- henoheno 2004-12-27 (月) 23:30:19
    • 第一階層にある index.php, pukiwiki.php がrequire() しているものは固定値です。 (LIB_DIR . pukiwiki.php) 外部からの入力は関係ありません。 -- henoheno 2004-12-27 (月) 23:31:36
    • lib/ ディレクトリ以下のファイルは全て固定値でロードされています (例: LIB_DIR . 'init.php') -- henoheno 2004-12-27 (月) 23:34:15
    • ウチにも来ましたcubic9.com:Blog/2004-12-27。ひとまずmod_rewriteで気休めの処置をして、標準パッケージのPukiWikiをgrepしてみましたが、不用意にincludeしているようなコードは見受けられませんでした。パッケージに含まれない自作のプラグインなどは改めてチェックする必要がありそうです。 -- でぃあばぁ 2004-12-27 (月) 23:34:28
    • プラグイン呼び出し周りについて。cmd= あるいは plugin= という形でプラグイン名を指定して、最終的に lib/plugin.php にて「require_once(PLUGIN_DIR . $name . '.inc.php');」している部分がありますが、見ての通り、左右に文字列を連結しています。また、*1ファイルが存在するかといったチェックが事前に行われます。さらに1.4.4においては、lib/ini.php で「英数字以外の入力を許さない」チェックを追加してあります。 -- henoheno 2004-12-27 (月) 23:42:23
    • 同梱しているプラグインや、スキンでのrequire()について。いずれも「require_once(PLUGIN_DIR.'attach.inc.php')」のように呼び出されており、固定の値です。 -- henoheno 2004-12-27 (月) 23:44:35
    • 後の細かい部分 (LANG_FILEなど) は設定ファイルから値を得るタイプのもので、外部入力ではないか固定値です(jcode関係など)。 -- henoheno 2004-12-27 (月) 23:47:40
    • こんなとこでしょうか :) -- henoheno 2004-12-27 (月) 23:51:07
    • ちょっと分量が増えてしまいましたね。ページ分けましょうか・・・ (^^; -- henoheno 2004-12-27 (月) 23:56:17
    • ということで、1.4.4以降に現状存在している require() 周りはおおむねよろしいんじゃないでしょうか。 -- henoheno 2004-12-27 (月) 23:58:21
    • 1.3系の方も、とくに状況は変わらないですね。 -- henoheno 2004-12-28 (火) 00:01:15
    • page= に関する入力値ですが、これは問答無用でページ名であると解釈しますから、解釈のしかたが間違っていないかぎりそのように扱われると思います。 -- henoheno 2004-12-28 (火) 00:05:16
  • 自作プラグインに関してですが、codehighlightではinclude()を使用しております。これまでも引数の左右に文字列を連結させていましたが、念をいれて関数の呼び出し時に文字列を連結させるように変更しました。 -- sky 2004-12-28 (火) 01:34:31
  • 検証&詳細な説明ありがとうございます。安心できました。 -- tito? 2004-12-28 (火) 21:51:52
  • 追記: PHP 4.0.3 以降では、php.ini あるいは httpd.conf で allow_url_fopen を無効(デフォルトは有効)にすることが可能である様です。 -- henoheno 2004-12-30 (木) 15:41:07

include() bypassing filter with php://input、および Null byte attack

  • こちらは allow_url_fopenは効かないそうです。 -- henoheno 2004-12-30 (木) 15:51:46
    • Null-byte attack については、lib/func.php にある input_filter() (旧名sanitize()) にて、除去処理が行われています。 -- henoheno 2004-12-30 (木) 15:57:53
      • 余談ですが上記備忘録で紹介されている sanitize() 関数と、input_filter(旧名sanitize()) が非常に良く似ていますね :) PukiWiki側のソースを見ると、ほぼ同じ形になったのは 2003/5/16 の様ですから、日付的にはPukiWikiの方の成立が早いことになっています。 (cvs-raw:func.php.diff?r1=1.38&r2=1.39) 同案多数ということで。-- henoheno 2004-12-30 (木) 16:07:17
  • こちらも、入力値の左側に何らかの固定値を連結しているようなケースには通用しなそうではありますね。連結している実体(変数や定数を展開した結果)が空文字列だったりすると無意味ですが・・・ (^^; -- henoheno 2004-12-30 (木) 16:18:17

*1 「plugin_ . $name . _action」といった形で関数が存在するかどうか このチェックはフィルタの役割をしていないので、今回の件とは無関係ですね (^^; -- henoheno

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-10 (土) 03:36:21
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.256 sec.

OSDN