Webアプリへの攻撃と対策、正しい組合せの見抜き方
情報セキュリティマネジメント試験 令和5年度 問7 / セキュリティ › セキュリティ実装技術
過去問にチャレンジ
Webアプリケーションにおけるセキュリティ上の脅威とその対策に関する記述のうち、適切なものはどれか。
- ア
OSコマンドインジェクションを防ぐために, Webアプリケーションが発行するセッションIDに推測困難な乱数を使用する。
- イ
SQLインジェクションを防ぐために,Webアプリケーション内でデータベースへの問合せを作成する際にプレースホルダを使用する。
- ウ
クロスサイトスクリプティングを防ぐために,Webサーバ内のファイルを外部から直接参照できないようにする。
- エ
セッションハイジャックを防ぐために,Webアプリケーションからシェルを起動できないようにする。
会話形式の解説
講師今回は、Webアプリケーションへの攻撃と対策の組合せとして、正しいものを選ぶ問題です。選択肢はどれも、前半に攻撃名、後半に対策が書かれています。
受験者4つとも、対策自体はどこかで聞いたことがあるものばかりです。どれも正しく見えて迷います。
講師そこが注目点です。対策はどれも正しいものですが、組み合わせた攻撃名が合っているかは別の話です。対策の側から「この対策が防ぐのは何の攻撃か」と逆に考えると、ずれが見つけやすくなります。
受験者では、推測しにくい乱数のセッションIDから考えます。セッションIDは利用者を見分けるための値なので、OSコマンドインジェクションとは関係がなさそうです。
講師その通りです。推測しにくいセッションIDが防ぐのは、利用者の通信を乗っ取るセッションハイジャックです。OSコマンドインジェクションは入力を通じてサーバのOSに命令を実行させる攻撃なので、セッションIDを変えても防げません。
受験者OSコマンドインジェクションを防ぐのは、シェルを起動できないようにする対策でしょうか。だとすると、それをセッションハイジャック対策とした選択肢もずれています。
講師そうです。シェルは、OSに命令を伝えるプログラムです。Webアプリケーションからシェルを起動しない設計は、OSコマンドインジェクションへの対策です。セッションハイジャックには、推測しにくいセッションIDやHTTPSによる通信の暗号化で備えます。
受験者セッションIDの対策とシェルの対策は、攻撃名が入れ替わっていたのですね。残りは、ファイルの直接参照を禁じる対策とプレースホルダです。
講師ファイルを外部から直接参照させない対策は、ファイルを不正に読み出すディレクトリトラバーサルへの対策です。クロスサイトスクリプティング、略してXSSとは別の攻撃です。
受験者XSSはどういう攻撃で、何で防ぐのですか。
講師XSSは、Webページに混入させたスクリプトを利用者のブラウザで実行させる攻撃です。基本の対策は出力時のエスケープ、つまり特殊な記号を無害な文字に置き換えることです。
受験者そうすると、プレースホルダでSQLインジェクションを防ぐという組合せが正しいと考えました。ただ、プレースホルダの仕組みがよく分かっていません。
講師SQLインジェクションは、入力値をSQL文の一部として使わせ、データベースを不正に操作する攻撃です。プレースホルダは、「?」などの記号を入れたSQL文のひな形を先に作り、実行時に値を当てはめる仕組みです。
受験者ひな形が先に決まっているので、入力に不正な文字が入っていても、SQL文の構造は変わらないということですか。
講師その理解で合っています。SQL文の構造と入力値が分かれるので、不正な文字を含む入力も命令ではなく単なる値として扱われます。したがって、プレースホルダとSQLインジェクションの組合せが正解です。
受験者整理すると、SQLインジェクションにはプレースホルダ、OSコマンドインジェクションにはシェルを起動しない設計、セッションハイジャックには推測しにくいセッションID、XSSには出力時のエスケープですね。
講師はい。加えて、ファイルの直接参照を禁じるのはディレクトリトラバーサル対策です。対策ごとに防げる攻撃を1つずつ結び付けて覚えておくと、この形の問題は解きやすくなります。
まとめ
Webアプリケーションへの攻撃と対策の組合せのうち、正しいものを選ぶ問題です。誤りの選択肢は対策自体は正しく、組み合わせた攻撃名だけが違っています。SQLインジェクションには、SQL文の構造と入力値を分けるプレースホルダが有効で、これが正解です。OSコマンドインジェクションにはシェルを起動しない設計、セッションハイジャックには推測しにくいセッションID、XSSには出力時のエスケープ、ファイルの直接参照の禁止はディレクトリトラバーサル対策と、対策ごとに防げる攻撃を結び付けて覚えておくと解きやすくなります。
解答・解説
正解はイです
この問題のテーマ
Webアプリケーションへの代表的な攻撃(OSコマンドインジェクション・SQLインジェクション・クロスサイトスクリプティング・セッションハイジャック)と、それぞれに効く対策の組合せを問う問題です。
解き方の考え方
まず、各選択肢の前半に書かれた攻撃名を確かめます。次に、後半の対策がどの攻撃を防ぐものかを考えます。最後に、前半の攻撃名と後半の対策が対応しているかを照らし合わせます。対策の側から「この対策が防ぐのは何の攻撃か」と逆に考えると、組合せのずれが見つけやすくなります。
選択肢ごとの解説
- ×ア OSコマンドインジェクションを防ぐために, Webアプリケーションが発行するセッションIDに推測困難な乱数を使用する。アは、推測しにくい乱数のセッションIDでOSコマンドインジェクション(入力を通じてサーバのOSに命令を実行させる攻撃)を防ぐという記述です。しかし、推測しにくいセッションIDが防ぐのは、利用者の通信を乗っ取るセッションハイジャックです。OSコマンドを実行させる攻撃は、セッションIDを変えても防げません。したがって、アは誤りです。
- ○イ SQLインジェクションを防ぐために,Webアプリケーション内でデータベースへの問合せを作成する際にプレースホルダを使用する。イは、SQLインジェクション(入力値をSQL文の一部として使わせ、データベースを不正に操作する攻撃)をプレースホルダで防ぐという記述です。プレースホルダは、「?」などの記号を入れたSQL文のひな形を先に作り、実行時に値を当てはめる仕組みです。そのため、SQL文の構造と入力値が分かれ、不正な文字を含む入力も命令ではなく単なる値として扱われます。したがって、イが正解です。
- ×ウ クロスサイトスクリプティングを防ぐために,Webサーバ内のファイルを外部から直接参照できないようにする。ウは、サーバ内のファイルを外部から直接参照させないことで、クロスサイトスクリプティング(XSS:Webページに混入させたスクリプトを利用者のブラウザで実行させる攻撃)を防ぐという記述です。ファイルの直接参照を禁じる対策は、ファイルを不正に読み出すディレクトリトラバーサルへの対策に当たります。一方、XSSはブラウザ側でスクリプトが動く攻撃なので、出力時のエスケープ(特殊な記号を無害な文字に置き換えること)などで防ぎます。したがって、ウは誤りです。
- ×エ セッションハイジャックを防ぐために,Webアプリケーションからシェルを起動できないようにする。エは、Webアプリケーションからシェル(OSに命令を伝えるプログラム)を起動させないことでセッションハイジャックを防ぐという記述です。しかし、シェルを起動しない設計は、OSコマンドインジェクションへの対策です。セッションハイジャックの対策は、推測しにくいセッションIDや、HTTPSによる通信の暗号化などです。したがって、エは誤りです。
補足
この問題の誤りの選択肢は、どれも対策自体は正しく、組み合わせた攻撃名だけが違っています。そのため、対策ごとに防げる攻撃を1つずつ結び付けて覚えておくと、解きやすくなります。
POINT
- SQLインジェクションには、SQL文の構造と入力値を分けるプレースホルダが有効です。
- OSコマンドインジェクションには、シェルを起動しない設計が有効です。
- セッションハイジャックには、推測しにくい乱数によるセッションIDが有効です。
- XSSには、出力時のエスケープが基本の対策です。
- ファイルの外部からの直接参照を禁じるのは、ディレクトリトラバーサルへの対策です。
