web-dev-qa-db-ja.com

Webサイトは「localhost」にHTTPリクエストを送信できますか?クロスドメインポリシーを回避するにはどうすればよいですか?

私は このWebサイト を見つけました。これは、同じ脆弱性を利用してRedisの脆弱性を修正することについて述べています。

問題のウェブサイトには「パッチを適用」ボタンがあり、マシンでパスワードなしのRedisサーバーを実行している場合は、パッチを適用します。

つまり、ウェブサイト自体がコンピューターのRedisサーバーに接続、いくつかのコマンドを実行します。

あなたが見つけたウェブサイトのコードを見ると、予想通り、これは:

    var text = "the code to run";
    var bad = "EVAL "  + JSON.stringify(text) + " 0\r\n";
    var x = new XMLHttpRequest();
    x.open("POST", "http://localhost:6379");
    x.send(bad);

驚いたことに、これはうまくいきます!

クロスドメインポリシーはこれの実行を停止すると考えていましたが、実際には停止しません。

なぜこれが機能するのか、そして私がアクセスするすべてのWebサイトが私のRedisサーバーのコンテンツ全体を読んでいることに偏執しないようにするにはどうすればよいですか?

それは、それが書き込みではなく読み取りではないからですか?それでも、世界中のどのWebサイトでも、ローカルのRedisサーバーをにしたり、認証なしで自分のマシンのポートをリッスンしている他のものに書き込んだりできます。

ここで何か不足していますか?

15
Daniel Magliola

質問に答えるには:はい、WebサイトはlocalhostにHTTPリクエストを送信できます。リクエストはドメインを越えないため、ドメインを越えたポリシーを破ることはありません。ローカルにとどまります。クロスドメインポリシーを回避する1つの方法は、ターゲットの犠牲者にHTTPリクエストを自分で作成させることです。したがって、要求がドメインを超えることはありません。

あなたが説明した問題を理解するのを助けるために:

攻撃によってデータが送信されることはなく、ローカルRedisマシン以外の場所への接続も行われません。これは、Redisマシンに接続するWebサイト自体ではありません。 あなたがRedisマシンに接続し、クライアント側のコード/スクリプトを実行しますあなたリンクをクリックして実行しました。基本的に、あなたはリンクをクリックします>リンクをダウンロードしていくつかのコードを実行します->コードはhttpリクエストを生成します-> httpリクエストはあなたのマシンからあなたのマシンに行きます。

この状況でのRedisサーバーの脆弱性は、クロスサイトリクエストフォージェリです。攻撃者は被害者(この場合はサーバーの所有者)の認証を利用して攻撃を実行します。

攻撃者はプロセスを完全に制御することはできません。コードの実行はRedisサーバーの所有者に依存しています。所有者(またはRedisサーバーのローカルの他の誰か)だけが127.0.0.1(Localhost)にアクセスするための可視性(およびおそらく許可と信頼関係)を持っています

コードが実行できることは、ローカルユーザーが実行できるコマンドを実行することだけですが、それらを実行するのは攻撃者ではなく、所有者であるため、クロスドメインポリシーに違反しません。

このようなリンクの影響を受けるのは、Redisサーバーを実行している人だけです。ない場合、リンクは何もしません。また、ローカルのRedisサーバーでのみ実行されます。攻撃者は、エクスプロイトが発生する場所を実際に選択することはできません。

クロスサイトリクエストフォージェリを調べます。 https://en.wikipedia.org/wiki/Cross-site_request_forgery

5
meltdownmonk