令和4年午後Ⅱ問1設問1(1)

太郎さん  
(No.1)
標題について、解説を読んでもよくわかりません。どなたか解説いただけますと幸いです。
なぜ、POSTではなくGETになるのか、なぜimgタグが無効になるのか、よくわからないです。
2024.02.05 21:35
pixさん 
SC ダイヤモンドマイスター
(No.2)
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つのパートに分割することができます。
<meta property="og:url" content="(h)ttps://www.b-sha.co.jp/confirm?">
<img src=1 onerror=alert(1)>
<"">
スレ主様の質問ですが、もしPOSTであればクエリ部分はリクエストボディ部分に
格納されます。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さん 
SC ダイヤモンドマイスター
(No.4)
この投稿は投稿者により削除されました。(2024.02.06 02:38)
2024.02.06 02:38
pixさん 
SC ダイヤモンドマイスター
(No.5)
この.out.printlnを変形します。
out.println("<meta property=\"og:url\" content=\"(h)ttps://"+serverName+"/"
+scriptName+"?"+queryString+"\">");

内側の表示対象となる文字列のみを並べ替えます。
変数は分かりやすいように${}でくくります。
実際に表示されるときを考慮して
\" -> "
" -> (なし)
に置き換えます。
<meta property="og:url" content="(h)ttps:// + 
${serverName} +
/ + 
${scriptName} +
? + 
${queryString} +
">

通常以下のようなリクエストラインが想定されます。
GET /confirm?a=1
これは以下のように分解されます。
serverName = www.b-sha.co.jp
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の前後は
? + 
"><img src=1 onerror=alert(1)><" +
">
となり、最終的に以下のように展開されます。
?"><img src=1 onerror=alert(1)><"">
2024.02.06 02:39
pixさん 
SC ダイヤモンドマイスター
(No.6)
一点補足いたします。
本攻撃は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さん 
SC ダイヤモンドマイスター
(No.8)
この投稿は投稿者により削除されました。(2024.02.08 06:12)
2024.02.08 06:12
pixさん 
SC ダイヤモンドマイスター
(No.9)
ダブルクォーテーションは
・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)><■
最終的な出力は
<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()に引数として渡す文字列の" (")←抜粋

"■>"の部分の■の手前の"は何を指しているのかわからないです。すみません、もし上記の回答でそれも回答済みであれば、私が理解できてないです。恐れ入りますが、教えていただけますと助かります。
2024.02.08 15:41
太郎さん  
(No.11)
上記疑問点の補足です。
文字列は"で囲み、変数は"で囲む必要はない理解のため、"/"や"?"はダブルクォーテーションで囲み、serverName等の変数はダブルクォーテーションで囲まなくてもいい理解です。すみません、この理解自体誤ってましたらご指摘いただけますと幸いです。
2024.02.08 16:46
pixさん 
SC ダイヤモンドマイスター
(No.12)
申し訳ありませんが、文字列について誤解されているようです。
>最後の"については、記載いただいた通り、頭にある"<metaの部分のけつの
>部分(下記)だと思っていますが、」
ここからして誤っています。
"■>"が一つの文字列です。

元のout.println()の引数を分割すると以下のように
文字列        :"<meta property=■og:url■ content=■(h)ttps://"
文字列連結記号:+
変数          :serverName
文字列連結記号:+
文字列        :"/"
文字列連結記号:+
変数          :scriptName
文字列連結記号:+
文字列        :"?"
文字列連結記号:+
変数          :queryString
文字列連結記号:+
文字列        :"■>"
4つの文字列
3つの変数
6つの文字列連結記号
から構成されています。
文字列と文字列の間に変数を挟み込む構成にとなっております。
文字列の部分は固定の値です。変数は可変の値です。
これらを + でつなげた結果をout.println()で出力しています。
2024.02.08 19:37
太郎さん  
(No.13)
大変ありがとうございます。ようやく理解できました。根本的に私の理解が誤ってました。上記でとても腑に落ちました。最初の"は(h)ttps://"のところで一旦終端される形ですね。なるほど。。今までご丁寧にありがとうございました。
2024.02.08 20:16

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop