【パストラバーサル編】保存場所の外へ出さないファイル処理|CTF思考フレームワーク #31

ダウンロードURLのファイル名を変えるだけで、本当に別のファイルが読めるの?

アプリが入力をそのままパスとして扱うと、許可したフォルダの外へ移動する指定を受け入れてしまう場合があるんだ。
パストラバーサルは、ダウンロード、画像表示、ログ閲覧、テンプレート選択など、ファイル名やパスを受け取る機能で発生します。
重要なのは「特定の文字列を消す」ことではなく、最終的に参照するファイルが許可された領域内にあると確認することです。
📚 CTF思考フレームワーク シリーズ
#31 【パストラバーサル編】保存場所の外へ出さないファイル処理 / 全86記事。全シリーズ記事はこちら。
難易度:中級 / 読了目安:9分 / 学習順:#31
- ファイル参照機能のどこを見るべきか理解する
- 文字列置換だけでは不十分な理由を知る
- 安全なファイル識別子設計を学ぶ
- 相対パス:現在位置を基準にファイル位置を示す表記です。
- 正規化:異なるパス表記を一つの確定した形へ整理する処理です。
- LFI:アプリが意図しないローカルファイルを読み込んでしまう問題です。
🔍 観察フェーズ:まず何を見る?

最初から攻撃方法を探すのではなく、どの機能や設定が外から見えているかを整理するところから始めるよ。

いきなり試すんじゃなくて、まず「どこが入口になり得るか」を整理するんだね。
💡 仮説フェーズ:なぜ危険になり得る?

観察した内容から、被害につながる条件を仮説として並べるよ。
単純な文字列置換は、エンコードやOSごとの区切り文字、正規化順序の違いで抜けが生じます。
機密設定や鍵、ログなどが読まれると、次の侵害の足がかりになります。
アップロードや解凍処理でも、保存先の外へ書き込めると同じ考え方の問題が起きます。
🔬 検証フェーズ:安全に確かめる

検証の目的は、実在サービスを攻撃することではなく、自分のラボで仕組みと防御の効き方を理解することだよ。
自作の検証用ダウンロード機能で、許可フォルダ内のファイルだけをIDで取得する設計と、入力をパスへ直接連結する設計を比較します。

許可された環境で、結果だけじゃなく「なぜそうなったか」まで確認するんだね。
⚔️ 攻撃フェーズ:成立すると何が起きる?

ここでは実サービスへの手順ではなく、成立した場合の影響を押さえよう。
攻撃者にとって利用価値のある入口や情報が増え、次の侵害につながる可能性があります。
設定や権限の範囲によっては、情報漏えい・改ざん・業務停止などへ影響が広がります。
検知や記録が不足していると、侵害の発見や原因調査が遅れます。
🛡️ 防御フェーズ:守る側はどうするか

守りは「気をつける」では終わらせず、設定・実装・監視に落とし込もう。
利用者にはファイルパスを渡させず、内部IDから許可済みファイルへ対応付ける
必要な場合は正規化した絶対パスが基底ディレクトリ配下か確認する
アプリ実行ユーザーが読めるファイル範囲を最小化する
🤝 大事なお約束
この記事で扱う確認・検証は、自分の環境、CTF、または明示的に許可された演習環境だけで行ってください。他人のサービスや端末に無断で試す行為は、不正アクセス等に該当するおそれがあります。学んだ知識は守る側で活用しましょう。
📝 まとめ
ファイル処理の安全性は、禁止文字の一覧ではなく「許可領域の外へ出られない」ことを検証できるかで決まります。
