web-dev-qa-db-ja.com

このjQuery ajax呼び出しはXSSに対して脆弱ですか?

誰かが$("#field").val()を編集できる場合、別の場所を指すようにここでurlプロパティを変更できますか?

$.ajax({
  url: "http://mywebsite/script?param=" + $("#field").val(),
  dataType: "jsonp",
  success: function(response) {
      document.write(/*fields from response object*/);
  },
 });

悪意のある場所が応答オブジェクトでスクリプトタグを返す可能性があるため、彼らができる場合、私のページはXSS脆弱です。 fieldの値を使用してAJAX urlを変更することができるかどうかを知りたいです。

更新

申し訳ありません。質問を更新しました。値は実際にはjavascript変数に含まれており、phpによって直接記述されていません(そうでない場合は明らかにXSSの問題があります)。申し訳ありません。

6
Kevin

はい、それは脆弱ですが、あなたが疑う方法ではありません。攻撃者は読み込まれたURLを変更するのではなく、コードを直接実行しようとします。例えば:

_$_GET['fname'] = '"+(function(){/*any_code_i_like*/})()+"';
_

となります:

_$.ajax({
   url: "http://mywebsite/script?param="+(function(){/*any_code_i_like*/})()+""
_

コードはajaxでURLをリクエストする前でも実行されます。これは単なる例です。ここでも機能する他のベクターもあります。このコンテキストでXSSを防ぐためにパラメーターをエスケープする最も簡単な方法は、次のようにurlencode() in PHPを使用することです。

_$.ajax({
  url: "http://mywebsite/script?param=<?php echo urlencode($_GET["fname"]); ?>"
  dataType: "jsonp",
  success: function(response) {
      document.write(/*fields from response object*/);
  },
 });
_

また、 OWASP XSS防止に関するチートシート もご覧ください。

Update:質問を更新した後-ここにはXSSの脆弱性はありません(たとえば、リクエストを別のドメインにポイントすることはできません)が、例は別の獣に対して脆弱- HTTPパラメータpolution 。この正確なケースでは問題ではないかもしれませんが、指定されたパラメーターが次のとおりであるとします。

_a_valid_value&param=another_param_injected
_

攻撃者は、アプリケーションにとって重要である可能性があり、実行フローを変更する可能性がある追加のHTTP GETパラメーターを注入することができます(例:パラメーター_admin=1_)。ユーザー入力からのすべてをエスケープ/エンコードする習慣を身に付ける必要があります。この変更されたケースでは、Javascript encodeURIComponent関数を使用して、攻撃者が「&」、「=」、「?」を挿入できないようにする必要があります。

_"http://mywebsite/script?param=" + encodeURIComponent($("#field").val()),
_
14