shell.phpを使ってブラウザからコマンドラインアクセス
On 1月 5, 2022 by admin時には、ブラウザからシェルアクセスしたいことがあります。 これは、セキュリティ設定が許可している場合、PHP を使用して実現することができます。 私はこの機能を shell.php で実装しました (Github で入手可能)。 上のスクリーンショットでは、ブラウザからのシェルアクセスがどのように動作するかを見ています。 このスクリプトでは、マウスを使ってファイルのアップロード、ダウンロード、表示、編集、削除、ディレクトリの zip および解凍、サーバー上のディレクトリのトラバースができますが、キーボードを使ってカスタム コマンドを入力することも可能です。 また、マシンが適切にファイアウォールで保護されていることを確認してください (ポート 80 はインターネットから到達可能であってはなりません)。 悪意のある目的には使用しないでください!
Known issues
スクリプトが動作しない場合、スクリプトが依存している PHP “passthru” 関数が無効になっていることが原因である可能性があります。 無効な PHP 関数をリストアップするには、次の PHP コードを実行してください:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
既製の Ubuntu 14.04 では次のように出力されます:
bool(false)Array( => 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 =>)Array( =>)
PHP シェル実行コマンド
もし passthru()
で実行できないなら、他のいくつかのコマンドも試してみることにします。 以下のコマンドは類似している。
-
exec()
コマンド出力の最終行を返す -
passthru()
コマンド出力を直接ブラウザに渡す -
system()
コマンド出力を直接ブラウザに渡して最終行を返す -
shell_exec()
コマンド出力を返す -
proc_open()
popen() に似ているが、より高度な制御 -
pcntl_exec()
プログラムの実行
popen() コマンドのプロセスへの読み取りまたは書き込みパイプを開く
open_basedir
もし上記のスクリプトが怖いと感じたら、その場合は、以下のようにします。 このような場合、サーバー上でこのプログラムが実行されないようにすることができます。 セーフモード (非推奨) を有効にする、”disable_functions” php.ini 変数および/または Suhosin の関数実行ブラックリストを使用することでこれを行うことができます。
PHP インストールのセキュリティに関してよく書かれた記事を見つけたので、チェックしてみてください! 実行可能な関数を制限する以外に、彼らは “open_basedir” php.ini 設定変数も推奨しています。 これは、PHPがアクセスできるファイルを指定されたディレクトリツリーに制限するものです。
また、”/tmp” ディレクトリを “nodev”, “nosuid”, “noexec” フラグで保護するのも良いアイデアです。
Suhosin が見つからない?
Note that “php5-suhosin” package (a PHP security extension) is no longer installed or available on Debian-based systems. セキュリティ上の改善の一部は、最新の PHP バージョン (5.4 および 5.5) に取り入れられています。 Ubuntu 14.04 (PHP 5.5.9) に (Github から) Suhosin をインストールしたい場合は、このチュートリアルに従います。
LWN.net で Suhosin 削除に関する論争についてもっと読むことができます。 これは、PHP コードをユーザーコンテキスト (例: ユーザー “maurits”) で実行し、ユーザー “www-data” としては実行しないことを意味します。 これを実現する方法を説明した素晴らしい記事を見つけました。 最も簡単な解決策は、
sudo apt-get install libapache2-mpm-itk
を実行し、すべての「VirtualHost」設定に「AssignUserID」ディレクティブを追加することです。 これは最も安全な解決策ではないかもしれないことに注意してください。
結論
既知のセキュリティホールの悪用を防ぐために、常に PHP を最新のバージョンに更新し、パッチを当てる必要があります。 disable_functions”、”open_basedir”、Suhosin、ファイルシステムフラグなどのツールは、攻撃対象領域を減らし、未知のセキュリティホールの利用を防止します。 これらのツールを使って、階層化されたセキュリティ戦略を実装することができます。 また、特権分離も忘れてはいけません。
コメントを残す