web-dev-qa-db-ja.com

ID属性に厳密な検証が必要なのはなぜですか?

OWASP XSS防止に関するチートシート によると、

背景、ID、名前などの安全でない属性を厳密に検証する

backgrounddata: urls。したがって、コンテンツが Rule 2 に従ってHTMLエンコードされている場合でも利用できます。

しかし、なぜidnameを厳密に検証する必要があるのですか?それは、他の方法で注入されたイベントハンドラーをトリガーする可能性のあるアンカーを注入するために使用できるからというだけですか?または、IDを使用して要素からコードをロードする脆弱なスクリプト(つまり、ページに存在する他のいくつかの要素をシャドウする)が原因でDOMベースのXSSを防ぐためですか?

4
0x89

これは「アグレッシブ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="&lt;script&gt;alert(&#039;xss&#039;)&lt;/script&gt;" />
<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エンコードしないためです。これは、このページが信頼されており、アプリケーションフレームワークが重複している場合は、常に最初の値を取るためです。非常に工夫されたが、それは私の頭に落ちてそのポイントを実証する最初のものだった。

3
SilverlightFox

テキストは、任意の属性として使用される場合、信頼できない入力を検証する必要があることを示しています。 rule 2 を単に言い換えただけです。 "などの文字は、大きな問題を引き起こす可能性があります。

0
Neil Smithline