クロスサイト スクリプティングを使用すると、 Web サーバー自体を感染させることなく、生成された HTMLドキュメントを感染させることができます。XSS 攻撃では、サーバーをベクトルとして使用して、悪意のあるコンテンツをクライアントに提示します。これは、リクエストから即座に (リフレクト攻撃)、または保存と取得を遅らせて (保存された攻撃) 行われます。
XSS 攻撃は、要求データが応答で生の形式で表示されることを可能にするページのサーバーの生成における弱点を悪用します。ページはリクエストで送信された内容を反映しているだけですが、そのリクエストのコンテンツには、通常のテキスト コンテンツから抜け出して、開発者が意図しない HTML または JavaScript コンテンツを導入する文字が含まれている可能性があります。
簡単な例を次に示します。HTML ページを作成するために何らかのテンプレート言語 (PHP、ASP、CGI、または Velocity や Freemarker スクリプトなど) を作成したとします。次のページを取得し、「<?=$name?>」を「name」クエリ パラメータのエスケープされていない値に置き換えます。
<html>
<head><title>Example</title></head>
<body>Hi, <?=$name?></body>
</html>
次の URL でそのページを呼び出す誰か:
http://example.com/unsafepage?name=Rumplestiltskin
次のメッセージが表示されるはずです。
Hi, Rumplestiltskin
より悪意のあるもので同じページを呼び出すと、ページまたはユーザー エクスペリエンスが大幅に変更される可能性があります。
http://example.com/unsafepage?name=Rumplestiltskin<script>alert('Boo!')</script>
この URL は、単に「やあ、Rumplestiltskin」と言うだけでなく、「Boo!」という警告メッセージをページに表示させます。もちろん、これは単純化した例です。キーストロークをキャプチャしたり、名前とパスワードの確認を要求したり、画面をクリアして衝撃的なコンテンツでページを完全に書き換えたりする高度なスクリプトを提供することもできます。ページ自体が example.com から来たように見えますが、コンテンツはリクエストのどこかに提供されており、ページの一部として反映されているだけです。
では、そのページがリクエストした人から提供されたコンテンツを吐き出しているだけで、あなたがそのページをリクエストしている場合、ハッカーはどのようにしてあなたのリクエストに感染するのでしょうか? 通常、これは、Web ページ上、電子メールで送信されたリンク、または URL 短縮リクエストでリンクを提供することによって行われるため、URL の混乱を確認することは困難です。
<a href="http://example.com?name=<script>alert('Malicious content')</script>">
Click Me!
</a>
悪用可能な XSS 脆弱性を持つサーバーは、それ自体で悪意のあるコードを実行することはなく、そのプログラミングは変更されませんが、クライアントに悪意のあるコンテンツを提供するように仕向けることができます。