web-dev-qa-db-ja.com

URLのアンパサンドについて具体的に何が「潜在的に危険」か

ASP.NETには、次の文字のいずれかがURLのパス部分に存在する場合にページ処理を停止する要求検証システムが含まれています< > * % & : \ ?。ランタイムは通常のページの代わりに、次のようなエラーページを返します。

潜在的に危険なRequest.Path値がクライアントから検出されました

「潜在的に危険」であることについて私が見つけた唯一の情報は、XSSへのあいまいな参照です。ランタイムが緩和しようとしている具体的な問題は何ですか?アプリで制御できないURLを受け入れる必要があり、安全でない文字が含まれている可能性がある場合、ランタイム検証を無効にしても安全ですか?

(検証を無効にするhowについて議論している記事はすでに多数ありますが、そうすることの影響については言及されていません)。

正確な状況を知らなくても検証を無効にしても安全かどうかについての質問に答えることは困難ですが、パスコンポーネントの検証を自分であまり行わない場合は無効にしないように注意してください。

疑問符とアンパサンドは、URLを介してアプリケーションにパラメータを渡すために使用されるため、危険な場合があります。アンパサンドは、htmlエンティティをアンパサンドでエンコードできるため、問題でもあります(&auml;は 'ä'を生成します)。これは実際にはURLの問題ではありませんが、エンコード/デコードが少し間違っており、これらを含むget変数をページのhtmlに挿入すると、攻撃者がスクリプトタグなどの危険なhtmlタグを含めることができる可能性があります。 iframesなど。パーセント文字は、URLで特殊文字をエンコードするために使用されるため、問題になります。そしてもちろん、<と>は、HTMLタグに使用されるため問題です。

アプリケーションがこれらの文字を含むリクエストパス(またはボディコンテンツ)をだれからでも受け入れる方法を提供する場合、誰かがそれらを使用してアプリケーションをだまして意図しない何かをさせる方法を考えるかもしれません。

たとえば、リクエストパスを検証せず、アプリケーションが 'title'変数の値をページに挿入した場合、その値が存在する場合、誰かがhttp://www.example.com/profile?user=johndoe&title=JohnなどのURLをリクエストしても問題はありませんが、他の誰かがhttp://www.example.com/profile?user=johndoe&title=<script>really bad script here<script>(おそらくパーセントURLエンコーディングを使用してタイトルの値をエンコードする)を使用し、自分のスクリプトをページのコンテキストで実行する可能性があります。

storedデータベース内のtitle変数の値で、後でjohn doeのプロファイルを確認したいすべてのユーザーに表示すると、さらに悪いことになります。 john doeのプロファイル。その後、スクリプトはこれらのユーザーのCookieを盗んだり、他の本当に恐ろしくて邪悪なことをしたりします。 :-)例は少し遠いですが、基本的な問題はそうではありません。

1
Out of Band