ホームページ >バックエンド開発 >PHPチュートリアル >PHP 一時ファイルのセキュリティ分析_PHP チュートリアル
1. はじめに
一時ファイルは、名前が示すとおり、一時的に生成されるファイルであり、ファイルのライフサイクルは非常に短いです。
しかし、多くのアプリケーションは一時ファイルなしでは実行できません。一時ファイルには主に次の形式の一時ファイルが含まれます。
1. ファイルまたはグラフィック編集プログラムによって生成された中間ファイル
2. データベースにクエリを実行すると、生成された一時キャッシュ ファイルは以前の結果データを提供し、通常はリモート データベースまたはリモート XML サービスに使用されるデータベースへの再アクセスのコストを削減します。
3. ファイルがアップロードされると、ファイル名は php
のグローバル変数 $_FILES['userfile']['tmp_name'] の値になります。
4. http リクエストでは、セッションを保存するために使用される一時ファイルであり、これらのファイル名は通常 sessionid (sess_7483ae44d51fe21353afb671d13f7199 など) です
5. 異なるアプリケーション間または同じアプリケーション間でデータを転送する場合、相手がファイルベースの入力を必要とする場合は、一時ファイルを使用してデータを保存します
2.
一時ファイルの最大の特徴は、その非永続性です。さらに、セキュリティの観点から、次の側面から一時ファイルの他の特性やリスクに注意することができます。
1.一時ファイルの場所
通常、一時ファイルはデフォルトのパスに作成され、保存されます。一般的な Linux システムでは、一時ファイルを保持するディレクトリまたはパーティションが少なくとも 2 つあります。そのうちの 1 つは /tmp ディレクトリで、もう 1 つは /var/tmp です。新しい Linux カーネルを搭載したシステムでは、tmpfs ファイル システムを使用してマウントされる /dev/shm も存在する場合があります。場合によっては、一時ファイルがユーザーのホーム ディレクトリの下の非表示のサブディレクトリに配置されることもあります。デフォルトの一時ファイル ディレクトリを使用する利点は、システム プロセスが簡単に検索、読み取り、書き込みできることです。
ただし、デフォルトの一時ファイル保存ディレクトリは、システムのセキュリティを侵害するゾンビやルートキットの温床になる可能性があります。これは、ほとんどの場合、誰でも (またはどのプロセスでも) これらのディレクトリに書き込むことができ、安全でない権限の問題があるためです。たとえば、スティッキー ビットは誰もが知っていますが、これは削除防止ビットとして理解できます。ユーザーがファイルを追加できるようにしたいが、同時にファイルを削除できないようにしたい場合は、ファイルのスティッキー ビットを使用できます。このビットが設定されている場合、ユーザーがディレクトリに対する書き込み権限を持っていても、ファイルを削除することはできません。ほとんどの Linux ディストリビューションは、一時ディレクトリにスティッキー ビットを設定します。これは、ユーザー A がユーザー B に属するファイルをクリアできないことを意味します。また、その逆も同様です。ただし、ファイル自体の権限によっては、ユーザー A がそのファイルの内容を表示および変更することができます。2.
一時ファイルの永続化
前述したように、一時ファイルは永続的ではないため、プログラムの終了時に削除されます。ただし、次のような一時ファイルは強制的に永続化され、削除されない場合があります。 2.1 一時ファイルを削除する機会がなく、アプリケーションを閉じる前にクラッシュしました
2.2 アプリケーションはまだ実行中ですが、オペレーティング システムがクラッシュしました2.3 ファイルのコピー処理中に、スペースの問題によりコピーが失敗し、中間ファイルが削除されませんでした
2.4 通常、オペレーティング システムのプロセスはデフォルトの一時ファイル ディレクトリを定期的にクリアしますが、何らかの理由で削除が失敗する場合があります
2.5 適切に作成されていないアプリケーションは、一時ファイルを無視したり、削除し忘れたりする可能性があります
3. 一時ファイルの
リスク
役に立たない一時ファイルがサーバー上に幽霊のように存在し、ハードディスクを占有する一方で、他の人に不正に使用される可能性があります。 3.1
可視性皆さんご存知のとおり、個人データを公開するのは危険です。ユーザーが何らかの手段 (シェルや FTP など) を通じて一時ファイルを盗むと、ユーザーまたは企業の個人データが取得され、あなたに影響が及ぶ可能性があります。 例: 一時ファイル 2011_Confidential_Sales_Strategies.tmp は、2011 年の会社のビジネス戦略を公開する可能性があり、これは競合他社にとって非常に役立ちます。また、一時ファイル sess_95971078f4822605e7a18c612054f658 は、セッション ハイジャッカーにとって非常に役立ちます。
さらに、一時ファイルが覗かれる可能性がある他の状況もあります。スペル チェック サービス。返される URL は http://bad.example.com/spellcheck.php?tmp_file=spellcheck46 です。攻撃者はアクセスできます。 URL パラメーターを分析し、http://bad.example.com/spellcheck.php?tmp_file=spellcheck45 を使用して、前のユーザーの検証結果を確認します。
3.2
強制力通常、一時ファイルは実行可能ではありませんが、攻撃者が php スクリプトを一時ディレクトリにアップロードし、何らかの方法で実行すると、悲劇を引き起こす可能性があります。 3.3 一時ファイル
ハイジャック攻撃者は独自の目的で一時ファイルをハイジャックする可能性があります。彼はあなたの一時ファイルを置き換えたり、一時ファイルの後に何らかの情報を追加したりするかもしれません。 一時ファイルをハイジャックする目的は次のとおりです:
(1) あなた自身のデータではなく、アプリケーションにデータを処理させます
(2) システムパスワードファイルや、PHP セキュリティモードでは通常読み取れないその他のファイルなどの個人データを公開します
(3) データを削除し、リクエストの正常な進行を妨げる
(4) 虚偽のデータを作成して出力し、リクエストの結果を破棄します
(5) 虚偽のデータを提供することにより、そのデータを使用してさらなる処理を行うアプリケーションに損害を与える
(6) 出力を他の場所にリダイレクトして、攻撃者がシステム ファイルにアクセスしたり上書きしたりすることを容易にします
ハイジャックは通常、競合状態に関連しています。 2 つの異なるプロセスが同じファイル上で動作すると、競合状態が発生する可能性があります。たとえば、読み取りプロセスと書き込みプロセスが同時にデータを操作する場合、書き込みプロセスがその一部しか完了していない場合、このように読み取られる内容の一部は新しくなります。部分が古い、これはよく言われることです。ダーティデータを読み取ってください。
一時ファイルのハイジャックは、ハイジャッカーが時間と場所を正確に把握していなければ、ある程度の競合状態を引き起こし、このようなセキュリティ上の問題を引き起こします。
3. 一時ファイルの悪用を防ぐ
以前、一時ファイルの概念と一時ファイルの悪意のある使用によって引き起こされる可能性のある害について紹介しましたが、このセクションでは主に、一時ファイルの悪意のある使用を防ぎ、一時ファイルによって引き起こされる害を軽減するためのいくつかの戦略を紹介します。
1. 保管場所を調整します
一時ファイルの悪用を防ぐための最も重要かつ簡単な手順は、一時ファイルのディレクトリと名前を推測されにくくすることです。一時ファイルを悪意を持って使用する場合、攻撃者は一時ファイルの名前とパスを知っている必要があるため、攻撃者が一時ファイルの名前とパスを推測できないようにする必要があります。
一時ファイルのディレクトリを選択するときは、システムプロセスが簡単に検索、読み取り、書き込みできるように、一時ファイルをデフォルトのディレクトリに配置することをお勧めします。代わりに、ファイル名として適切で推測しにくい名前を考えることに重点を置きます。
PHP の tempnam() 関数は一時ファイルを作成でき、その自動生成されたファイル名は現在のディレクトリ内の他のファイル名と競合しません。この関数によって作成されるファイルのデフォルトのパーミッションは 600、つまり rw——- です。
例えば
実行後、myTempfile1afというファイルが生成されることがあります。2回目の実行時には、myTempfile1b0というファイルが生成されます。
おそらく、一部のプログラミング実践ガイドでは、tempnam() を使用してファイルを生成するときに、ファイルに含まれるデータ、またはこのデータを必要とするアプリケーションがファイル名を通じて確認できるように、ファイルに意味のあるプレフィックスを付けて名前を付けることを推奨しているでしょう。セキュリティの観点から見ると、攻撃者の方向性を示すことになるため、これは行わないことが最善です。
ここでは、特定の意味を持ち、攻撃者が推測しにくくするプレフィックスを導入する方法を次に示します。
このスクリプトは、uniqid() 関数を使用して /tmp/skiResort392942668f9b396c08.03510070 の形式でファイル名を生成し、chmod を通じてファイルのアクセス許可を 600 に設定します。
ユーザーのパスワードや実行時に生成されるランダムなトークンなどの情報を他のアプリケーションと共有する必要がある場合は、このキーを知っているアプリケーションのみがファイルの内容を読み取りまたは変更できるように、ファイル名を暗号化する必要がある場合があります。
以下は、暗号化されたファイル名ファイルを生成する簡単な例です。
リーリー2. アクセス権限を制限する
一時ファイルが実行されたり乗っ取られたりする可能性を減らすために、一時ファイルや一時ファイルディレクトリへのアクセス権限を設定する必要があります。通常は、一時ファイルのパーミッションを rw——-、一時ファイルディレクトリのパーミッションを rwx—— に設定します。さらに、次のように Apache 設定ファイルを設定してアクセスを制限することもできます (www ディレクトリに一時ファイルを配置する場合のみ)。
リーリー
3. 既知のファイルのみを書き込みますあなたは一時ファイルの作成者であり作成者であるため、どのファイルが存在し、そのファイルにどのようなコンテンツが含まれているかを常に知っておく必要があります。上記の方法は、一時的なファイルのハイジャックをより困難にするだけですが、ハイジャッカーがファイルを置き換えたり、ファイルの末尾にコンテンツを追加したりする可能性を完全に排除することはできません。そのため、ファイルを作成または書き込むときは、慎重に行う必要があります。ファイルの内容が要件を満たしているかどうかを確認します。
w+ を使用してファイルを作成する場合、次のように、書き込みを開始する前にファイルは空である必要があります
リーリー
一時ファイルへの初回の書き込みには成功したが、その後の書き込みプロセス中にハイジャッカーが一時ファイルに対して何らかの操作を実行した可能性もあります。この状況は、次のようなチェック コードを通じて確認できます。
リーリー
4.只读已知文件
与只写已知文件类似,在读文件前需要检查检验码是否一致,防止临时文件被篡改。除此之外,如果你使用了openssl,可以在写文件的时候,将合法证书放在文件的末尾,这样的读的时候可以先检查文件末尾是否存在合法的证书;如果你没有使用openssl,也可以写入一段特定的算法生成的token,原理类似。
5.检查上传的文件
判断文件是否是通过 HTTP POST 上传的
bool is_uploaded_file ( string $filename )
如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。 如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话,这种检查显得格外重要。
为了能使 is_uploaded_file() 函数正常工作,必须指定类似$_FILES['userfile']['tmp_name'] 的变量,而不是从客户端上传的文件名 $_FILES['userfile']['name']。需要注意的是is_uploaded_file返回false,不一定是上传文件被劫持了,也有可能是文件太大或者上传部分等,这些可以通过$_FILES['userfile']['error']查看。