OWASP XSS防止に関するチートシート によると、
背景、ID、名前などの安全でない属性を厳密に検証する
background
にdata:
urls。したがって、コンテンツが Rule 2 に従ってHTMLエンコードされている場合でも利用できます。
しかし、なぜid
とname
を厳密に検証する必要があるのですか?それは、他の方法で注入されたイベントハンドラーをトリガーする可能性のあるアンカーを注入するために使用できるからというだけですか?または、IDを使用して要素からコードをロードする脆弱なスクリプト(つまり、ページに存在する他のいくつかの要素をシャドウする)が原因でDOMベースのXSSを防ぐためですか?
これは「アグレッシブHTMLエンティティエンコーディング」でカバーされているため、二重引用符、一重引用符、またはスペースが属性コンテキストから抜け出さないようにするためではありません。
background
の場合、攻撃 このような が可能です:
<body background="javascript:alert('XSS')">
id
およびname
の場合、これらの属性はDOMの参照ポイントとして頻繁に使用されます。
攻撃者がこれらの参照ポイントを偽装できる場合、攻撃者は既存のスクリプトをだまして、設計以外の場所から値を取得および設定する可能性があります。これは、使用されるコンテキストによっては危険な場合があります。
これは、name
を使用して名前と値のペアを識別するHTMLフォームにも適用されます。たとえば、出力時にWebサイトが特定のフォームフィールドをエンコードしないが、フォームフィールドはサーバーで生成され、トークンの使用によってフォームがCSRFから保護されている場合、通常の方法では悪用できません。ただし、攻撃者は、フォームの送信時に実行するXSSペイロードを含むname
で使用されるパラメーターを使用して、ユーザーをURLにアクセスするよう誘導する可能性があります。
例えば通常の使用:
https://example.com/product?item_name=watch&qty=1
フォームをレンダリングします
<form>
<input type="hidden" name="watch" value="1" />
<input type="hidden" name="shop_name" value="Bob's Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />
<input type="submit" value="Click here to buy" />
</form>
そして、次のように出力されます
Thank you for buying from Bob's Supplies.
ただし、攻撃者は次のようにユーザーにリンクを送信する可能性があります。
https://example.com/product?item_name=shop_name&qty=<script>alert('xss')</script>
この時点でアプリケーションは正しくHTMLエンコーディングであるため、フォームは次のようにレンダリングされます。
<form>
<input type="hidden" name="shop_name" value="<script>alert('xss')</script>" />
<input type="hidden" name="shop_name" value="Bob's Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />
<input type="submit" value="Click here to buy" />
</form>
これは次のように出力されます
Thank you for buying from <script>alert('xss')</script>.
このページはshop_name
パラメータをHTMLエンコードしないためです。これは、このページが信頼されており、アプリケーションフレームワークが重複している場合は、常に最初の値を取るためです。非常に工夫されたが、それは私の頭に落ちてそのポイントを実証する最初のものだった。
テキストは、任意の属性として使用される場合、信頼できない入力を検証する必要があることを示しています。 rule 2 を単に言い換えただけです。 "
などの文字は、大きな問題を引き起こす可能性があります。