概要
download_attachment アクションで params[:filename] を受け取り send_file に直接渡す脆弱版を注入する。../../etc/passwd 等のパスで任意ファイルを読み出せる。
詳細
| 項目 |
値 |
| slug |
path_traversal |
| カテゴリ |
File Access |
| 難易度 |
Medium |
| CWE |
CWE-22 |
安全版(現在の実装)
Active Storage の redirect_to rails_blob_path のみを使用。ファイルパスを直接扱わない。
脆弱版(注入する実装)
params[:filename] をパス結合して send_file で返す。ディレクトリトラバーサルの検証なし。
def download_attachment
path = Rails.root.join("storage", params[:filename])
send_file path
end
テスト方針
- SAFE:
../../etc/passwd を含むリクエストが拒否される
- VULN:
../../etc/passwd でファイル内容が返る
注入方式
Module#prepend で TasksController#download_attachment を上書き
参考
概要
download_attachmentアクションでparams[:filename]を受け取りsend_fileに直接渡す脆弱版を注入する。../../etc/passwd等のパスで任意ファイルを読み出せる。詳細
path_traversal安全版(現在の実装)
Active Storage の
redirect_to rails_blob_pathのみを使用。ファイルパスを直接扱わない。脆弱版(注入する実装)
params[:filename]をパス結合してsend_fileで返す。ディレクトリトラバーサルの検証なし。テスト方針
../../etc/passwdを含むリクエストが拒否される../../etc/passwdでファイル内容が返る注入方式
Module#prependでTasksController#download_attachmentを上書き参考