web-dev-qa-db-ja.com

このXssフィルターをバイパスすることは可能ですか?

ノードプラグイン用のXSSフィルターを作成していました。それをバイパスする方法はありますか?はいの場合、どうすればそれを防ぐことができますか?

function xSSFilter(str) {
        return str
            .replace(/&/g, '&')
            .replace(/"/g, '"')
            .replace(/'/g, ''')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
    }
1
Sameer

出力エンコーディングはコンテキスト固有です。この関数の出力をHTMLテキスト要素にのみ入れる場合-属性ではなく、スクリプト内の文字列(または他の場所)ではなく、CSSなどではなく-あなたかもしれません大丈夫。今のところ。あなたが他の文脈を目指しているなら、あなたは間違いなく大丈夫ではありません。以下はほんの一部です(これは包括的なリストではありません。包括的なリストを作成しようとしないでください。失敗する可能性が高く、次のECMAScriptまたはHTMLの更新を行わなくても、魔法のユニコーンが壊れます実行可能なブラックリスト)。

  • \をフィルタリングしていません。これは、正当な文字列末尾の'または"をエスケープするために使用できます。攻撃者が同じ行の別の文字列を制御すると、その文字列はコードとして解釈されます。
  • JSで テンプレート文字列 を区切るために使用される `をフィルタリングしていません。攻撃者はそれらのうちの1つから簡単に抜け出すことができます。
  • テンプレート文字列内で展開する式を作成するために使用される${または}をフィルタリングしていません。それらの間のテキストはコードとして扱われます。

本当に安全にしたい場合は、すべての非英数字の出力エンコーディングを使用するか、少なくとも非英数字のホワイトリストを使用してエンコードしないでください(そしてそれを保守的にしてください)。特定のコンテキストまたは2つ(たとえば、HTMLテキストと非イベントHTML属性)に対してのみフィルターを使用している場合、フィルターする文字の特定の「ブラックリスト」を使用することで問題を回避できる可能性がありますが、他の場合よりもリスクが高くなります。仕方。

5
CBHacking

はい、作成したものはブラックリスト(使用できない文字)と呼ばれます。作成する必要があるのは、ホワイトリスト(つまり、使用が許可されている文字)です。

フィルターの回避は非常に一般的です OWASPフィルター評価チートシート を参照して、このフィルターをバイパスできる膨大な方法を確認してください。

また、これはJavaScriptなので、これはクライアント側にあると思います。クライアント側の検証は、ユーザーエクスペリエンスを向上させるためにのみ使用してください。検証には使用しないでください。サーバー側のスクリプトを検証に使用する必要があります。

1
meowcat