5

apache2 構成ファイルで機能を無効にしようとしていますが、何らかの理由で機能しません。他のphp_admin_value設定が機能していることを確認しましたが、disable_functionsを無視しているだけです

ここに私が持っているものがあります:

<Directory "/var/www/testdir/*">

php_admin_value open_basedir "/var/www/testdir"
php_admin_value disable_functions "exec,shell_exec"

</Directory>

open_basedir 管理者の値は期待どおりに機能しています (「../something」を含めることはできません) が、それでも、disable_functions フラグが設定されていないかのように実行ls -a ..または許可されます。exec('ls -a ..', $output); echo $output;

これを修正する方法についてのアイデアはありますか?

4

4 に答える 4

8

disable_functionsphp.iniファイルでのみ変更できます。

Name                Default Changeable          Changelog
disable_functions   ""      PHP_INI_SYSTEM only Available since PHP 4.0.1.

ただし、php_admin_value.htaccess ファイルでは使用できません。

于 2013-10-20T10:30:49.013 に答える
2

私はガンボに同意しません。php.ini から disable_function を確実に変更できます。ただし、既に定義されているものをオーバーライドすることはできません。その配列にのみ追加できます。たとえば、php.ini ファイルに disable_functions が含まれていない場合は、次のように追加できます。

php_admin_value[disable_functions] = link,symlink,popen,exec,system,shell_exec,show_source,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

逆に言えば、php.ini ファイルで popen を無効にしていると、php_admin_value を使用してオーバーライドすることはできません。

問題の根底にたどり着くために、php 5.5.9で少し試してみました。disable_function の php 値をオーバーライドしてみました。phpinfo() は、オーバーライド後に disable_function 行が空であることを示していました。php.ini ファイルに最初にリストされた機能はどれも使用できませんでした。

記録のために、私の試みは php5-fpm を使用し、プール構成を変更することでした。

于 2014-11-21T21:21:15.363 に答える
1

できることをすべて提供するために、この回答を追加したいと思います。

機能のロックダウンは、何​​らかの形で少なくとも機能を取り除く方法がまだあるdisable_functions可能性があることを確認するのは非常に悲しいことです。php.iniこうやって:

取り除きたいので、名前空間内に簡単にアクセスしexecたくないコードを作成します。ここで名前空間を呼び出し、内部で単純に空の関数を作成します。この関数へのアクセスを複雑にします(*)。execdisableFunctionNamespace

<?php
namespace disableFunctionNamespace;
function exec(){};

//here the code which should not be easily(*) able to call the exec function
exec("rm /* -rf");

?>

*)exec名前空間内で関数を呼び出そうとする簡単なダンプ試行は実際には失敗しますが、攻撃者は残念ながらグローバル名前空間に戻る/execのではなく単に呼び出すことで名前空間を逃れ、これにより関数のシャドウイングを回避することができます。現在の名前空間。したがって、一部の Linux で時々使用されるアプローチよりも、権限を削除するのはさらに不完全な試みです。execexecchroot

確かに、関数を無効にするために他の形式を使用するか、関数をホワイトリストに登録する方法があればそれ以上の方法を使用するという提案は非常に高く評価されますが、php がより安全になり、これは実際には望ましくないため、ありそうにありません;)

于 2014-03-14T12:54:41.237 に答える