セキュリティスペシャリスト
問題はIPAからご確認ください。
https://www.ipa.go.jp/shiken/mondai-kaiotu/2021r03.html#aki_sc
答えはIPAの回答例となります。
設問1
(1)
HTTPヘッダインジェクションとは、クライアントから送信される値を適切に処理することなく、HTTPレスポンスヘッダに含めてしまう脆弱性攻撃。
改行コードは「%0%0A」になります
答え:ア
(2)
下線②は設問1(1)を参照
SQLインジェクションはデータベースと連動したWebアプリケーションなどに対する攻撃手法の一つで、検索文字列など外部から指定するパラメータの一部にSQL文の断片などを混入させ不正な操作を行うもの
SQL文は、動的に変化する値に「?」を使用します。この「?」のことをパラメータ変数やプレースホルダーと呼びます。
答え:プレースホルダ-
(3)
a は設問1(1)を参照
メールヘッダーインジェクションとは、メールの件名などの入力値を改ざんすることで、Bcc:
などのメールヘッダーを付加する攻撃のことをいいます。
対策としてはメールヘッダーを固定値にする・送信用APIを使用する・改行コードを削除となっているので
答え a:改行コード
設問2
(1)
GETリクエストのクエリ文字列に取得したidを指定するとなっているので、
「https://(省略)/select?id=xxx」のようにURLにプロジェクトIDが表示されるはずですので、
「id=xxx」の部分を書き換えるれば良いです。
プロジェクトIDは連番なので、推測もしやすいですので
答え:クエリ文字列のidに、未参加のプロジェクトのプロジェクトIDを指定する
(2)
脆弱な部分は「情報選択機能においてクエリ文字列で受け取ったプロジェクトIDをチェックせずに利用していることに起因していた。」とあり、
方法2でクエリ文字列で取得ではなく、ログイン後に生成されるセッションIDから取得した利用者情報から紐づくプロジェクトIDを取得するようになるので
答え:プロジェクトを示すパラメータを外部から指定できないから
:セッション情報からプロジェクトIDを取得するから
(3)
7:で「~プロジェクトID=?”;」としてプレースホルダを使っています。
Javaでプレースホルダを利用する場合、プリペアドステートメントを使います。
答え b:ウ
(4)
Cは設問2(3)を参照
8でプロジェクトIDをセットするSQLをstmtに格納しましたので
9でプロジェクトIDをセットするために、8で宣言した「stmt」にプロジェクトIDを代入しますので
答え c:stmt
設問3
前回のコードではSQLの条件がプロジェクトIDだけだと、プロジェクトIDが偽装されていた場合は
利用者と関係ないプロジェクトが確認可能でしたが、
修正して3で新たに情報番号を取得しています。
しかし、指定が情報番号だけだと、プロジェクトIDと同様に偽装された場合に同じ状態になりますので
7で取得しているプロジェクトIDを使用して情報番号とプロジェクトIDが一致する条件にすれば、判明している脆弱性は解消できます。
※SELECT (カラム名) FROM (テーブル名) WHERE (条件文);
答え d:情報番号=? AND プロジェクトID=?
コメント