XSS入門:反射型・蓄積型・DOM型と対策
属性値に出力するときのXSS
この回でやること
属性値に利用者の文字を出すときのXSSを見ます。引用符の有無で必要な変換が変わることと、hrefやsrcのjavascript形式の危うさを扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
属性値は、入力欄の value のように、利用者の文字を出すもう1つの文脈です。この回は、引用符の有無と href や src の扱いを軸に、本文と属性で何が変わるかを見ます。
この回を終えると、属性に出す1行を見て、どこから抜けられるかを指さして言えるようになります。
引用符を閉じられると属性から抜けられる
属性値を引用符で囲んでいる場合、危ないのはその引用符です。値の中にダブルクォートを入れられると、そこで属性が閉じ、続けて別の属性を足せます。
HTML
<input value="" onmouseover="...">利用者の入力にダブルクォートを含めると、value が途中で閉じ、onmouseover のようなイベントハンドラ属性を差し込まれます。マウスを乗せると、そこに書いたJSが動きます。だから引用符で囲んだ属性では、囲みと同じ引用符を " へ変換します。
引用符で囲まないともっと危ない
属性値を引用符で囲んでいないと、空白1つで属性が終わります。閉じる引用符すら要らず、空白のあとに onerror などを足せます。だから属性値は必ず引用符で囲む、というのがまず土台です。
本文文脈で見た不等号の変換だけでは、属性の中は守れません。まず引用符で囲み、そのうえで囲みと同じ引用符を変換します。文脈が変われば、守るべき文字も変わります。
hrefとsrcのjavascript形式
もう1つ、href や src に利用者由来の文字を入れる場合の穴があります。引用符を閉じなくても、href の値を javascript から始まるスキームの形にされると、リンクを押した瞬間にJSが動きます。
HTML
<a href="javascript:...">プロフィール</a>練習用のショップで、プロフィールのサイトURLをそのまま href に出す作りだと、利用者がこの形を入れて成立します。だから href や src は、http か https で始まるものだけを通し、それ以外のスキームを弾きます。