<および>などのHTMLメタ文字がエンコードされ、結果がHTMLコンテキストで出力される場合、反映されたXSSは不可能ですか?
HTMLコンテキストでURLパスを直接表示するWebサイトがあります。
www.mysite.com/helloworld
を指定すると、<body>
タグの間にhelloworld
が表示されます。
ただし、<
や>
などの一部のメタ文字はHTMLエスケープされます。
この場合、難解なUTFエンコーディング攻撃など、反映されたXSS攻撃を実行することは可能ですか?
これはコンテキストに依存します。私はあなたがhtmlentities()
関数を使用していると仮定していますが、これは一般的に安全でしょう。 htmlspecialchars()
とほぼ同じことを行います。
どちらも一般的なXSSに対して安全であり、サニタイズされたパラメーターがHTMLタグに挿入されたときにイベントベースのXSSを防ぎます。
どちらも_javascript:
_攻撃を防止しません。これは、パラメーター値をリンク、iframe、または他の同様のタグに挿入した場合に発生する可能性があります。これらのタグのいずれかからsrc
またはhref
を挿入する場合、最初にパラメーターから空白を削除し、次に_javascript:
_と_data:
_の両方を確認することをお勧めします。
javascript:alert(0)
は、リンクまたはiframeに挿入されたときにアラートを表示します。 data:text/javascript:alert(0)
も同様です。 data:text/html:<script>alert(0);</script>
も同じことを行い、_strip_tags
_をバイパスします。
最初に空白を削除する理由は、攻撃者がペイロードの途中で改行/ CRLF文字をドロップするのを防ぐためです。つまり、PHPは_javascript:
_または_data:
_ペイロードをブロックするとき。ただし、JavaScriptが無視するため、引き続き実行されます。
どのような種類の攻撃が可能かを説明しているといいのですが、htmlentities()
とhtmlspecialchars()
は問題の解決策の1つであると簡単に主張できますが、状況によっては、これは非常に危険なアドバイスになる可能性があります。
引用符がエスケープされておらず、テキストが引用符で囲まれたhtml属性の内部に配置されている場合、" onmouseover="alert(0)
のようなjavascript-bearing属性を設定する値が機能する場合があります。