PHP プログラムの一般的な脆弱性を攻撃する方法 (パート 2)_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:22:14
オリジナル
913 人が閲覧しました


[ライブラリ ファイル] 前に説明したように、include() と require() は主にコード ライブラリをサポートするためのものです。通常、頻繁に使用される関数を別のファイルに入れ、必要なときにこの別のファイルがコード ライブラリになるからです。その中の関数を使用するには、このコード ライブラリを現在のファイルに含めるだけです。 当初、PHP プログラムを開発してリリースするとき、コード ベースとメインのプログラム コードを区別するために、コード ベース ファイルに「.inc」拡張子を付けるのが一般的でした。しかし、すぐにこれは間違いであることがわかりました。ファイルを PHP インタープリターで PHP コードに正しく解析できません。このようなファイルをサーバー上で直接リクエストすると、そのファイルのソースコードが取得されます。これは、PHP が Apache モジュールとして使用される場合、PHP インタープリターがファイルの拡張子に基づいて PHP に解析するかどうかを決定するためです。コードの。拡張子はサイト管理者によって指定されます。通常は「.php」、「.php3」、「.php4」です。重要な構成データが適切な拡張子なしで PHP ファイルに含まれている場合、リモート攻撃者がこの情報を簡単に入手できます。 最も簡単な解決策は、ファイルごとに PHP ファイル拡張子を指定することです。これにより、ソース コードの漏洩を十分に防ぐことができますが、攻撃者がこのファイルを要求することにより、コンテキスト内で実行されるコードが独立して動作するようになる可能性があります。前述したすべての攻撃につながる可能性があります。 以下に明らかな例を示します。 main.php 内: libdir/load language.php 内: 「libdir/load language.php」が「main.php」によって呼び出される場合は非常に安全ですが、「libdir/load language」には「 .php」があるためです。 " 拡張子が付いているため、リモート攻撃者はこのファイルを直接要求し、"$langDir" と "$userLang" の値を任意に指定できます。 [セッション ファイル] PHP 4 以降では、セッションがサポートされています。その主な機能は、PHP プログラム内のページ間の状態情報を保存することです。たとえば、ユーザーが Web サイトにログインすると、そのユーザーがログインしたという事実と Web サイトに誰がログインしたかがセッションに保存され、ユーザーが Web サイトを閲覧すると、すべての PHP コードがこの状態情報を取得できます。 実際、セッションが開始されると (実際には、最初のリクエストで自動的に開始するように構成ファイルで設定されます)、ランダムな「セッション ID」が生成されます。リモート ブラウザがリクエストの送信時に常に送信する場合、この「セッション ID」を使用すると、セッションは常に維持されます。これは、Cookie を使用するか、各ページでフォーム変数 (「セッション ID」を含む) を送信することで簡単に実現できます。 PHP プログラムはセッションを使用して特別な変数を登録でき、その値は各 PHP スクリプトの終了後にセッション ファイルに保存され、各 PHP スクリプトの開始前にも変数にロードされます。以下に簡単な例を示します。PHP の新しいバージョンでは、「$session_auth」の値が自動的に「shaun」に設定されます。これは、ステートレス Web にとって非常に重要です。確かに非常に優れたツールですが、注意する必要もあります。 明らかな問題は、変数が実際にセッションから取得されたものであることを確認することです。たとえば、上記のコードで後続のスクリプトが次のようになっているとします。上記のコードは、「$session_auth」が設定されている場合、それがセッションから取得されたものであると想定しています。ビットはセッションからではなく、ユーザー入力によって設定されます。攻撃者がフォーム入力を通じてビットを設定すると、サイトにアクセスできるようになります。攻撃者は、この攻撃方法を使用する前に変数をセッションに登録する必要があることに注意してください。変数がセッションに配置されると、フォーム入力はすべて上書きされます。セッション データは通常、ファイルに保存されます (場所は設定可能で、通常は「/tmp」)。このファイルには、変数名、変数タイプ、変数値などが含まれます。データ。 。マルチホスト システムでは、ファイルが Web サーバーを実行しているユーザー (通常は誰も) として保存されるため、悪意のあるサイト所有者がセッション ファイルを作成して他のサイトにアクセスしたり、セッション ファイルの機密情報を検査したりする可能性があります。 。セッション メカニズムは、攻撃者が自分の入力をリモート システム上のファイルに保存するためのもう 1 つの便利な場所も提供します。ファイルが使用できない場合、攻撃者は PHP コードを含むファイルをリモート システムに配置する必要があります。アップロードが成功すると、通常はセッションを使用して自分の希望に従って変数に値を割り当て、その後セッション ファイルの場所を推測します。ファイル名が「php」であることがわかっているため、推測するだけで済みます。ディレクトリ。通常、ディレクトリは「/tmp」です。さらに、攻撃者は任意に「セッション ID」(「hello」など)を指定し、この「セッション ID」を使用してセッション ファイル(「/tmp/sess_hello」など)を作成することもできますが、「セッション ID」 「」は文字と数字の組み合わせのみです。 [データ型] PHP には緩いデータ型があり、変数の型は変数が配置されるコンテキストによって異なります。例: "$hello" は値 "" を持つ文字列変数として開始されますが、評価されると整数変数 "0" になり、予期しない結果が生じる場合があります。 "$hello" の値が "000" と "0" の間で異なる場合、empty() によって返される結果は true ではありません。 PHP の配列は連想配列です。つまり、配列のインデックスは文字列型です。これは、「$hello["000"]」と「$hello[0]」も異なることを意味します。 たとえば、ある場所で変数が「0」であるかどうかをテストし、別の場所でそれを確認するために empty() を使用するべきではありません。 [エラーが発生しやすい関数] PHP プログラムの脆弱性を分析する場合、ソース コードが入手できれば、エラーが発生しやすい関数のリストが非常に必要になります。これらの関数のパラメータをリモートで変更できれば、脆弱性が見つかる可能性が高くなります。以下は、エラーが発生しやすい関数のより詳細なリストです: require(): 指定されたファイルの内容を読み取り、PHP コードとして解釈します include(): 上記と同じ eval(): 指定された文字列に対して preg_replace() を実行します。 PHP コード : 「/e」スイッチと一緒に使用すると、置換文字列は PHP コードとして解釈されます exec(): 指定されたコマンドを実行し、実行結果の最後の行を返します passthru(): 指定されたコマンドを実行し、返されますすべての結果をクライアントに送信 Browser``: 指定されたコマンドを実行し、すべての結果を配列に返します。 system(): passthru() と同じですが、バイナリ データを処理しません。 Popen(): 指定されたコマンドを実行し、入力または出力を接続します。 PHP ファイル記述子に変換します fopen (): ファイルを開き、PHP ファイル記述子に対応します readfile(): ファイルの内容を読み取り、クライアントのブラウザーに出力します file(): ファイルの内容全体をファイルに読み込みますarray 翻訳者注: 実際、このリストはまだ完成していません。たとえば、「mail()」などのコマンドもコマンドを実行する可能性があるため、自分で追加する必要があります。 [PHP のセキュリティを強化する方法] 上で紹介したすべての攻撃は、PHP 4 のデフォルトのインストールでも十分に実行できますが、PHP の設定はいくつかの PHP オプションを設定することで非常に柔軟になります。これらの攻撃の一部に抵抗することは完全に可能です。以下に、実装の難易度に応じていくつかの構成を分類します。 *低難易度**中低難易度***中高難易度****高難易度 上記の分類は、単なる個人的な意見ですが、次のことを保証できます。 PHP を使用している すべてのオプションが提供されている場合、PHP の機能の多くは使用できなくなっているため、サードパーティのコードを使用する場合でも、PHP は非常に安全になります。 **** "register_globals" を "off" に設定します。このオプションは、PHP がユーザー入力用のグローバル変数を作成できないようにします。つまり、ユーザーがフォーム変数 "hello" を送信した場合、PHP は "$hello" を作成せず、単に "$hello" を作成します。 「HTTP_GET/POST_VARS[hello]」を作成します。これは PHP では非常に重要なオプションです。このオプションをオフにすると、プログラミングに大きな不便が生じます。 ***「safe_mode」を「on」に設定し、このオプションをオンにすると、次の制限が追加されます。 実行できるコマンドを制限する 2. 使用できる機能を制限する 3. スクリプトの所有権とターゲット ファイルの所有権に基づくファイル アクセス制限 4. ファイルのアップロードを無効にする これは ISP にとって優れたオプションであり、PHP のセキュリティを大幅に向上させることができます。 ** このオプションを「open_basedir」に設定すると、指定したディレクトリ外でのファイル操作を禁止でき、include() によるローカル ファイルやリモート ファイルへの攻撃を効果的に排除できますが、ファイル アップロードやセッション ファイルへの攻撃には注意する必要があります。 ** 「display_errors」を「off」に設定し、「log_errors」を「on」に設定すると、エラー メッセージが Web ページに表示されなくなりますが、ログ ファイルに記録されます。これにより、攻撃者による機能の攻撃を効果的に防ぐことができます。ターゲットスクリプトの検出。 * 「allow_url_fopen」を「off」に設定すると、リモート ファイル機能が無効になります。 さて、この記事はここで終わります。その他の関連情報を知りたい場合は、元の記事 http://www.securereality.com.au/studyinscarlet.txt を参照してください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/532333.html技術記事 [ライブラリ ファイル] 前に説明したように、include() と require() は主にコード ライブラリをサポートするためのものです。これは、通常、頻繁に使用される関数の一部を別のファイルに入れるためです...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート