正解:ウ
各選択肢の解説
アOSコマンドインジェクション
誤り。これは入力値をOSのコマンドの一部として実行させる攻撃です。どちらもサーバ上の ファイルが狙われうるので混同しやすいですが、その場合のログには「;」や「|」のような コマンドを区切る記号が現れます。この場面の値は、場所をたどるパス名として解釈されています。
イSQLインジェクション
誤り。これは入力値をデータベースへの命令(SQL文)の一部として実行させる攻撃です。 狙われるのはデータベースの中身で、ログには引用符や「OR 1=1」のような文字列が現れます。 この場面で取得されたのはデータベースではなく、サーバ上のファイルです。
ウディレクトリトラバーサル
正解。「../」は一つ上の階層を表すので、重ねると公開用のフォルダから抜け出せます。 ファイル名の指定をそのまま使っていたため、公開していない場所のファイルまで読まれました。
エバッファオーバーフロー
誤り。これは想定より長いデータを送り込み、確保されたメモリ領域からあふれさせる攻撃です。 ログには極端に長い値が現れます。この場面の値は短くても成立しており、 長さではなく「../」という中身が意味を持っています。
理解を深めるために
フォルダの外へ「階段を上る」攻撃
資料室の係に「この棚の、この名前の資料を出して」と頼む仕組みを考えます。 係が名前をそのまま信じて動くなら、「一つ上の階へ、さらに上へ、そこから金庫室の書類」と 書いた依頼でも取りに行ってしまいます。Webサイトで同じことを起こすのが ディレクトリトラバーサルです。
なぜ公開していないファイルまで読まれるのか
- ダウンロード機能は、パラメータで受け取ったファイル名を、公開用フォルダの場所につなげて開く
- 「../」はパス名で「一つ上の階層」を意味する。重ねると公開用フォルダの外へ出られる
- 受け取った値を確かめずに使うと、設定ファイルのように外に出すつもりのないファイルまで返してしまう
IPAの「安全なウェブサイトの作り方」は、根本的解決として、外部からパラメータでファイル名を 直接指定させない作りにすることや、ファイルを開くときは固定のフォルダを指定し、ファイル名に フォルダ名が含まれないようにすることを挙げています。ファイルのアクセス権限の管理や 「../」などの検出は、保険的対策という位置づけです。
混同しやすいものとの違い
| 攻撃 | 入力値が何として扱われるか | ログに現れやすい特徴 |
|---|---|---|
| ディレクトリトラバーサル | ファイルの場所(パス名) | 「../」の繰り返し |
| OSコマンドインジェクション | OSのコマンド | 「;」「|」などの区切り記号 |
| SQLインジェクション | データベースへの命令 | 引用符や「OR 1=1」 |
| バッファオーバーフロー | (中身より長さが問題) | 極端に長い値 |
どれも「入力値を確かめずに使った」点は同じです。入力値が何として解釈されたかを見ると見分けられます。