HOME»情報処理安全確保支援士掲示板»令和4年午後Ⅱ問1設問1(1)
投稿する
»[1335] 令和3年春期試験問題 午後Ⅰ 問1 投稿数:18
»[1334] 集え、Revengers(再挑戦者)の同志たちよ! 投稿数:3
令和4年午後Ⅱ問1設問1(1) [1337]
太郎さん(No.1)
標題について、解説を読んでもよくわかりません。どなたか解説いただけますと幸いです。
なぜ、POSTではなくGETになるのか、なぜimgタグが無効になるのか、よくわからないです。
なぜ、POSTではなくGETになるのか、なぜimgタグが無効になるのか、よくわからないです。
2024.02.05 21:35
pixさん(No.2)
★SC ダイヤモンドマイスター
IPAの正答は
「ア リクエストライン:GET /confirm?"><img src=1 onerror=alert(1)><"」でした。
このリクエストがライブラリMのコードによって処理されると
<meta property="og:url" content="(h)ttps://www.b-sha.co.jp/confirm?"><img src=1 onerror=alert(1)><"">
に展開されます。
このHTMLは以下の3つのパートに分割することができます。
格納されます。queryStringには格納されません。
GETであればqueryStringに格納されますので、XSSの検査をすることができます。
imgタグがエラー(無効)になる理由ですが、本来"src="にはイメージの存在する
URLを記述します。
"src=1"は全くでたらめのURLです。そもそもURLとしての体をなしていません。
そのためエラーとみなされ、"onerror=alert(1)"が実行されます。
もしXSS対策をしていないのであれば、画面に"1"が表示されることになります。
「ア リクエストライン:GET /confirm?"><img src=1 onerror=alert(1)><"」でした。
このリクエストがライブラリMのコードによって処理されると
<meta property="og:url" content="(h)ttps://www.b-sha.co.jp/confirm?"><img src=1 onerror=alert(1)><"">
に展開されます。
このHTMLは以下の3つのパートに分割することができます。
<meta property="og:url" content="(h)ttps://www.b-sha.co.jp/confirm?">
<img src=1 onerror=alert(1)>
<"">
スレ主様の質問ですが、もしPOSTであればクエリ部分はリクエストボディ部分に<img src=1 onerror=alert(1)>
<"">
格納されます。queryStringには格納されません。
GETであればqueryStringに格納されますので、XSSの検査をすることができます。
imgタグがエラー(無効)になる理由ですが、本来"src="にはイメージの存在する
URLを記述します。
"src=1"は全くでたらめのURLです。そもそもURLとしての体をなしていません。
そのためエラーとみなされ、"onerror=alert(1)"が実行されます。
もしXSS対策をしていないのであれば、画面に"1"が表示されることになります。
2024.02.05 22:31
太郎さん(No.3)
ご回答ありがとうございます。なんとなく理解したのですが、前半部分の「○○に展開されます」の○○の部分がよくわかってないです。例えば、選択肢アでは、「/confirm?"><img src=1 onerror=alert(1)><"」が記載されていますが、ライブラリMのコードによって処理されるとなぜ末尾が「alert(1)><"">」と、「">」だけがくっついている形になるのか、理解できていません。ライブラリMのコードに\やダブルクォーテーションが多くあり、理解できてないです。すみません、教えていただけますと幸いです。
2024.02.05 23:22
pixさん(No.4)
★SC ダイヤモンドマイスター
この投稿は投稿者により削除されました。(2024.02.06 02:38)
2024.02.06 02:38
pixさん(No.5)
★SC ダイヤモンドマイスター
この.out.printlnを変形します。
out.println("<meta property=\"og:url\" content=\"(h)ttps://"+serverName+"/"
+scriptName+"?"+queryString+"\">");
内側の表示対象となる文字列のみを並べ替えます。
変数は分かりやすいように${}でくくります。
実際に表示されるときを考慮して
\" -> "
" -> (なし)
に置き換えます。
通常以下のようなリクエストラインが想定されます。
しかし、以下のリクエストラインは
out.println("<meta property=\"og:url\" content=\"(h)ttps://"+serverName+"/"
+scriptName+"?"+queryString+"\">");
内側の表示対象となる文字列のみを並べ替えます。
変数は分かりやすいように${}でくくります。
実際に表示されるときを考慮して
\" -> "
" -> (なし)
に置き換えます。
<meta property="og:url" content="(h)ttps:// +
${serverName} +
/ +
${scriptName} +
? +
${queryString} +
">
${serverName} +
/ +
${scriptName} +
? +
${queryString} +
">
通常以下のようなリクエストラインが想定されます。
GET /confirm?a=1
これは以下のように分解されます。serverName = www.b-sha.co.jp
scriptName = confirm
queryString = a=1
そして以下のように展開されます。scriptName = confirm
queryString = a=1
<meta property="og:url" content="(h)ttps://www.b-sha.co.jp/confirm?a=1">
しかし、以下のリクエストラインは
GET /confirm?"><img src=1 onerror=alert(1)><"
以下のように分解されます。serverName = www.b-sha.co.jp
scriptName = confirm
queryString = "><img src=1 onerror=alert(1)><"
そのため、queryStringの前後はscriptName = confirm
queryString = "><img src=1 onerror=alert(1)><"
? +
"><img src=1 onerror=alert(1)><" +
">
となり、最終的に以下のように展開されます。"><img src=1 onerror=alert(1)><" +
">
?"><img src=1 onerror=alert(1)><"">
2024.02.06 02:39
pixさん(No.6)
★SC ダイヤモンドマイスター
一点補足いたします。
本攻撃はHTMLインジェクションによるXSSです。
通常であれば、以下のようなHTMLになるところを、
本攻撃はHTMLインジェクションによるXSSです。
通常であれば、以下のようなHTMLになるところを、
confirm?a=1">
以下のように別のHTMLを無理やりねじ込みます。confirm?"><img src=1 onerror=alert(1)><"">
2024.02.06 07:57
太郎さん(No.7)
ご回答いただきありがとうございます。概ね理解することができました。1点、下記が腑に落ちなかったです。
----
実際に表示されるときを考慮して
\" -> "
" -> (なし)
に置き換えます。
----
末尾の"\">");について、\の前のダブルクォーテーションがなぜついているのか理解できませんでした。\"については、ダブルクォーテーションをエスケープ処理で表示した理解ですが、\の手前の"がわからず。。。
すみません、教えていただけますと幸いです。
----
実際に表示されるときを考慮して
\" -> "
" -> (なし)
に置き換えます。
----
末尾の"\">");について、\の前のダブルクォーテーションがなぜついているのか理解できませんでした。\"については、ダブルクォーテーションをエスケープ処理で表示した理解ですが、\の手前の"がわからず。。。
すみません、教えていただけますと幸いです。
2024.02.07 21:01
pixさん(No.8)
★SC ダイヤモンドマイスター
この投稿は投稿者により削除されました。(2024.02.08 06:12)
2024.02.08 06:12
pixさん(No.9)
★SC ダイヤモンドマイスター
ダブルクォーテーションは
・out.println()に引数として渡す文字列の" (")
・画面に表示するための" (\")
の2つが混在しています。
そのため分かりずらいのかと思われます。
表示するための" (\")が分かりずらいのであれば、仮に■として置き換えてみます。
・out.println()に引数として渡す文字列の" (")
・画面に表示するための" (\")
の2つが混在しています。
そのため分かりずらいのかと思われます。
表示するための" (\")が分かりずらいのであれば、仮に■として置き換えてみます。
out.println("<meta property=■og:url■ content=■(h)ttps://"+serverName+"/"+scriptName+"?"+queryString+"■>");
serverName = www.b-sha.co.jp
scriptName = confirm
queryString = ■><img src=1 onerror=alert(1)><■
最終的な出力はscriptName = confirm
queryString = ■><img src=1 onerror=alert(1)><■
<meta property=■og:url■ content=■(h)ttps://www.b-sha.co.jp/confirm?■><img src=1 onerror=alert(1)><■■>
となります。
2024.02.08 06:13
太郎さん(No.10)
ご回答いただきありがとうございます。すみません、やはり末尾の下記の部分がわからないです。
"■>"
最後の"については、記載いただいた通り、頭にある"<metaの部分のけつの部分(下記)だと思っていますが、
・out.println()に引数として渡す文字列の" (")←抜粋
"■>"の部分の■の手前の"は何を指しているのかわからないです。すみません、もし上記の回答でそれも回答済みであれば、私が理解できてないです。恐れ入りますが、教えていただけますと助かります。
"■>"
最後の"については、記載いただいた通り、頭にある"<metaの部分のけつの部分(下記)だと思っていますが、
・out.println()に引数として渡す文字列の" (")←抜粋
"■>"の部分の■の手前の"は何を指しているのかわからないです。すみません、もし上記の回答でそれも回答済みであれば、私が理解できてないです。恐れ入りますが、教えていただけますと助かります。
2024.02.08 15:41
太郎さん(No.11)
上記疑問点の補足です。
文字列は"で囲み、変数は"で囲む必要はない理解のため、"/"や"?"はダブルクォーテーションで囲み、serverName等の変数はダブルクォーテーションで囲まなくてもいい理解です。すみません、この理解自体誤ってましたらご指摘いただけますと幸いです。
文字列は"で囲み、変数は"で囲む必要はない理解のため、"/"や"?"はダブルクォーテーションで囲み、serverName等の変数はダブルクォーテーションで囲まなくてもいい理解です。すみません、この理解自体誤ってましたらご指摘いただけますと幸いです。
2024.02.08 16:46
pixさん(No.12)
★SC ダイヤモンドマイスター
申し訳ありませんが、文字列について誤解されているようです。
ここからして誤っています。
"■>"が一つの文字列です。
元のout.println()の引数を分割すると以下のように
3つの変数
6つの文字列連結記号
から構成されています。
文字列と文字列の間に変数を挟み込む構成にとなっております。
文字列の部分は固定の値です。変数は可変の値です。
これらを + でつなげた結果をout.println()で出力しています。
>最後の"については、記載いただいた通り、頭にある"<metaの部分のけつの
>部分(下記)だと思っていますが、」
ここからして誤っています。
"■>"が一つの文字列です。
元のout.println()の引数を分割すると以下のように
文字列 :"<meta property=■og:url■ content=■(h)ttps://"
文字列連結記号:+
変数 :serverName
文字列連結記号:+
文字列 :"/"
文字列連結記号:+
変数 :scriptName
文字列連結記号:+
文字列 :"?"
文字列連結記号:+
変数 :queryString
文字列連結記号:+
文字列 :"■>"
4つの文字列文字列連結記号:+
変数 :serverName
文字列連結記号:+
文字列 :"/"
文字列連結記号:+
変数 :scriptName
文字列連結記号:+
文字列 :"?"
文字列連結記号:+
変数 :queryString
文字列連結記号:+
文字列 :"■>"
3つの変数
6つの文字列連結記号
から構成されています。
文字列と文字列の間に変数を挟み込む構成にとなっております。
文字列の部分は固定の値です。変数は可変の値です。
これらを + でつなげた結果をout.println()で出力しています。
2024.02.08 19:37
太郎さん(No.13)
大変ありがとうございます。ようやく理解できました。根本的に私の理解が誤ってました。上記でとても腑に落ちました。最初の"は(h)ttps://"のところで一旦終端される形ですね。なるほど。。今までご丁寧にありがとうございました。
2024.02.08 20:16
その他のスレッド
»[1336] R3秋 午後II 問2 問4(3) 投稿数:4»[1335] 令和3年春期試験問題 午後Ⅰ 問1 投稿数:18
»[1334] 集え、Revengers(再挑戦者)の同志たちよ! 投稿数:3