著者: san < プログラミングの過程でプログラムが遭遇する問題と、アプリケーションの脆弱性を突破する方法 この記事では、PHP のサーバー側の機能を構成することで、PHP のセキュリティを強化します。 CGI スクリプトを作成するときは、さまざまなセキュリティ問題に注意し、ユーザー入力を厳密にフィルタリングする必要があります。しかし、靴を濡らさずに海岸を歩くことや、ゴマを失わずにゴマを食べることは不可能です。私のようなギャングが書いたスクリプトは言うまでもなく、有名な phpnuke、phpMyAdmin、その他のプログラムでも深刻な問題が発生しています。そこで、PHP スクリプトで重大な問題が発生したと仮定します。たとえば、少し前に、phpnuke は PHP スクリプトをアップロードする際に大きな問題を抱えていました。そのような場合、スクリプトがシステムを突破できないようにサーバーを設定するにはどうすればよいでしょうか。問題が発生しますか?
1. コンパイル時に既知の脆弱性のパッチに注意してください
4.0.5 以降、PHP のメール関数には 5 番目のパラメーターが追加されましたが、これは適切にフィルタリングされないため、PHP アプリケーションはセーフモードの制限を突破できます。したがって、4.0.5 および 4.0.6 を使用する場合は、コンパイル前に php ソース コード パッケージ内の ext/standard/mail.c ファイルを変更して、メール関数の 5 番目のパラメーターを無効にするか、シェル文字をフィルターする必要があります。 mail.c
ファイルの 152 行目、これは次の行です:
if (extra_cmd != NULL) {
その後に extra_cmd=NULL; または extra_cmd = php_escape_shell_cmd(extra_cmd);
次に php をコンパイルします。脆弱性は修正されました。
2. php.ini設定ファイルを修正します
phpディストリビューション版のphp.ini-distを元に修正します。
1)エラー処理とログ
エラー処理とログセクションでいくつかの設定を行うことができます。最初の検索:
display_errors = On
デフォルトでは、php はエラー メッセージの表示をオンにします。これを次のように変更しました。
display_errors = Off
エラー表示をオフにすると、php 関数の実行エラー メッセージは表示されなくなります。したがって、攻撃者がエラー メッセージからスクリプトの物理的な場所やその他の有用な情報を知ることをある程度防ぐことができ、少なくとも攻撃者のブラック ボックス検出に対して一定の障害が生じます。これらのエラーメッセージは、指定されたファイルに書き込み、次のように変更できます。 /apache/logs/php_error.log
error_log = /usr/apache/php_error.log
php_error.log ファイルに書き込まれます。
2)セーフモード
phpのsafe_mode関数は、多くの機能を制限または無効にし、phpの
セキュリティ問題を大幅に解決できます。 [セーフモード] セクションで:
safe_mode = Off
を見つけて、次のように変更します:
safe_mode = On
これにより、safe_mode 機能がオンになります。システムコマンドを実行できる Shell_exec() や `` などの一部の関数は禁止され、exec()、system()、passthru()、popen() などの他の実行関数は、ディレクトリ内のファイルの実行のみに制限されます。 safe_mode_exec_dir プログラムによって指定されます。本当にいくつかのコマンドまたはプログラムを実行したい場合は、以下を見つけてください:
safe_mode_exec_dir =
実行するプログラムのパスを次のように指定します:
safe_mode_exec_dir = /usr/local/php/exec
次に、プログラムを次の場所にコピーします。 /usr/local/php/exec ディレクトリにあるため、上記のような制限された機能もこのディレクトリ内のプログラムを実行できます。
セーフ モードでの制限された機能の詳細については、メインの PHP サイトの手順を参照してください:
http://www.php.net/manual/en/features.safe-mode.php
3) disable_functions
一部の機能の有害性についてよく知らず、使用していないため、単純にこれらの機能を禁止した場合。次の行を見つけます:
disable_functions =
無効にする機能を「=」の後に追加し、複数の機能を「,」で区切ります。
3. httpd.conf を変更する
php スクリプト プログラムが Web ディレクトリでのみ動作することを許可する場合は、httpd.conf ファイルを変更して php の操作パスを制限することもできます。たとえば、Web ディレクトリが /usr/local/apache/htdocs の場合、次の行を
httpd.conf に追加します:
php_admin_value open_basedir /usr/local/apache /htdocs
このように、スクリプトが /usr/local/apache/htdocs 以外のファイルを読み込もうとした場合、それは許可されません
エラー表示がオンになっている場合、
が実行されます。次のようなエラーが表示されます:
警告: open_basedir 制限が有効です。ファイルが 4 行目の
/usr/local/apache/htdocs/open.php に間違ったディレクトリにあります
など。
4. php コードをコンパイルする
Zend は php に多大な貢献をしており、php4 のエンジンは Zend に基づいており、ZendOptimizer や ZendEncode などの多くの php 拡張コンポーネントも開発しています。オプティマイザー ZendOptimizer は、
http://www.zend.com に登録するだけで無料で入手できます。以下は 4.0.5 および 4.0.6 の ZendOptimizer です。ファイル名はそれぞれのシステムのものです:
ZendOptimizer - 1[1].1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
ZendOptimizer-1[1].1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
ZendOptimizer-1[1]。 -PHP_4.0.5-Solaris-sparc.tar.gz
ZendOptimizer-1[1].1.0-PHP_4.0.5-Windows-i386.zip
オプティマイザーのインストールは非常に便利で、詳細な手順はパッケージ。 UNIX バージョンを例に挙げると、オペレーティング システムを確認し、パッケージ内の ZendOptimizer.so ファイルをディレクトリ (/usr/local/lib であると仮定) に解凍し、2 つの文を php.ini に追加します: optimization_level=15。
zend_extension="/usr/local/lib/ZendOptimizer.so"
以上です。 phpinfo() を使用して、Zend アイコンの左側に次のテキストを表示します。
with Zend Optimizer v1.1.0、Copyright (c) 1998-2000、by Zend Technologies
これで、オプティマイザーは正常に接続されました。
ただし、コンパイラ ZendEncode は無料ではありません。これは
http://www.PHPease.com の Ma Yong によって設計されたコンパイラ シェルです。商業目的で使用する場合は、
http://www.zend .com までご連絡ください。ライセンス契約を取得します。
PHP スクリプトがコンパイルされると、スクリプトの実行速度が大幅に向上し、スクリプト ファイル内で文字化けが確認されるだけになります。これにより、攻撃者がサーバー上のスクリプト プログラムをさらに分析することができなくなります。そして、それは元々 php スクリプトにプレーンテキストで保存されました
mysql パスワードなどのパスワードも機密に保たれます。ただし、サーバー側でスクリプトを変更するのは面倒です
ローカルで変更してからアップロードする方が良いです。
5. ファイルとディレクトリの権限設定
アップロードディレクトリに加えて、Web ディレクトリ内の他のディレクトリとファイルの権限は、nobody ユーザーに書き込み権限を与えないようにする必要があります。そうしないと、攻撃者がホームページ ファイルを変更する可能性があるため、Web ディレクトリのアクセス許可を適切に設定する必要があります
。 また、セーフモードでファイルを読み取る機能が制限されているため、PHP スクリプトの所有者は root であってはなりません
読み取るファイルの所有者は、現在実行中のスクリプトの所有者と同じである必要があります。それ以外の場合
エラー 表示がオンになっている場合、次のようなエラーが表示されます:
警告: SAFE MODE 制限が有効です。uid が 500 のスクリプトは、
が所有する /etc/passwd にアクセスできません。 uid 0 in /usr/local/apache/htdocs/ open.php
3 行目
このようにして、/etc/passwd などの多くのシステム ファイルが読み取られるのを防ぐことができます。
アップロード ディレクトリとアップロード スクリプトの所有者も同じに設定する必要があります。そうしないと、セーフ モード
でエラーが発生します。
6. Mysql の起動許可設定
mysql は root で起動しないでください。別の mysqladm ユーザーを作成するのが最善です。システム起動スクリプトに次のような文を追加できます
/etc/rc.local:
su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
このようにすると、システムの再起動後に自動的に使用されます。 mysqladmin ユーザーが mysql プロセスを開始します。
7. ログ ファイルとアップロード ディレクトリの確認
ログを表示することは、干し草の山から針を探すようなもので、人間の怠惰と大きく関係しています。 。 Web によってアップロードされたディレクトリ内のファイルも頻繁にチェックする必要があります。プログラムに問題があり、ユーザーがスクリプトの実行など、違法なファイルをアップロードした可能性があります。
8. オペレーティング システム自体のパッチ
システム内の既知の脆弱性にパッチを適用するのと同じように、これはシステム管理者の最も基本的な責任であり、最後の防御線でもあります。
上記の設定後は、難攻不落とは言えませんが、攻撃者のテストにもある程度迷惑をかけています。たとえphpスクリプトプログラムに重大な脆弱性があったとしても、攻撃者はそれを防ぎます。実際に損害を与える可能性があります。もっと奇妙で倒錯的な設定方法がある場合は、一緒に共有していただければ幸いです;)