web-dev-qa-db-ja.com

スプーフィングされたIPを介してHTTPパケットを送信することは可能ですか?

次のPHPコードは、IPが127.0.0.1(ループバック)に等しい場合にのみ、text.txtという名前のファイルにacceptedを書き込みます)。IPがdeniedと書き込みます。

<?php
$file = fopen('text.txt' , 'a');
if($_SERVER['REMOTE_ADDR'] === '127.0.0.1') {
$request = $_GET['output'];
if($request === '123') {
fwrite($file, "\x0D\x0A".'accepted - ' .$_SERVER['REMOTE_ADDR']);

}

}
else {  
    fwrite($file, "\x0D\x0A".'denied - ' .$_SERVER['REMOTE_ADDR']);
}
?>

スプーフィングされたIPが127.0.0.1の外部ネットワークからgetリクエスト(www.example.com/get.php?output=123)を送信できますか?可能であれば、どうすればよいですか?そうでない場合、なぜですか?

6
user111609

スプーフィングされたIPを介してHTTPパケットを送信することは可能ですか?

いいえ、できません。

HTTPはTCPの上にあるプロトコルであり、TCPを使用してIPスプーフィングを行うことは、プロトコルの内部が原因でほとんど不可能です。送信するだけでなく、 UDPのような単一のスプーフィングされたパケットですが、実際には、一致する必要があるこのシーケンス番号を含むピアパケットを監視できずに、一致するシーケンス番号を使用してピアのパケットに応答する必要があります。接続、つまりHTTPペイロードを送信する前でも。

それ以外の多くのシステムは、ルートに適合しないパケットを単にドロップします。つまり、127.0.0.1(localhost)からのパケットは、ローカルネットワークに接続されたネットワークカードに着信することはありません。

if($_SERVER['REMOTE_ADDR'] === '127.0.0.1') {

しかし、あなたのコードを考えると、$_SERVER['REMOTE_ADDR']の値が偽装される可能性がある場合、実際にはもっと興味があるかもしれません。ほとんどの場合、これはクライアントのソースIPアドレスであると想定していますが、実際にはHTTP接続の実際のソースIPとは異なる可能性があり、攻撃者によって操作される可能性さえあります。

Webサーバーの前にあるリバースプロキシ(またはロードバランサー)の場合、クライアントからの接続は実際にはリバースプロキシで終了するため、クライアントの実際のIPはWebサーバーにはわかりません。したがって、リバースプロキシがHTTPヘッダー(通常はX-Forwarded-For)を挿入して元のクライアントのソースIPを伝達することは珍しくありません。一部のWebサーバーは、このヘッダーの値を実際のソースIPではなく$_SERVER['REMOTE_ADDR']に設定するように設定されています。また、状況によっては、攻撃者がこれを悪用して、ケースで採用されているようなIPベースのアクセス制御をバイパスすることもできます。

この種のバイパスの具体的な例については、 攻撃の構造:StackOverflowをハッキングする方法 を参照してください。

8
Steffen Ullrich

それは不可能

スプーフィングされたhttpパケットは、TCP接続を介して移動する必要があります。

TCPには3ウェイハンドシェイクがあり、なりすましのIPアドレスからの通信がサーバーのPHP=コードに到達することを防ぎます。

アプリケーションデータが送信される前に、次のことが起こります。

[〜#〜]あなた[〜#〜]送信TCPなりすましIPのSYN

[〜#〜] server [〜#〜]はそのIPにSYN-ACKで応答し、ACKを待機し、そのIPからのデータパケットを返します。

会話の終わり!

TCPスタックはSYNパケットのみを送信し、リモートシステムは送信した偽装IPにSYN-ACKパケットを送信しようとします。SYN-ACKへの応答はありません。存在し、SYN-ACKパケットを受信した場合でも、そのスプーフィングされたIPからは、SYNパケットを送信したことがないことがわかっているためです。

9
mcgyver5

ネタバレ:できません。

スマートパンツ:リクエストを1つのTCP=パケットに収めることができる場合は、そうすることができます。または、スプーフィングされたIPへのルーティングを制御する場合。または、スプーフィングされたIPを持つマシン。

しかし、おそらくあなたはそれを行うことができないでしょう。

問題は次のとおりです。HTTPはステートレスですが、TCPを使用しますが、そうではありません。特に、実際のデータが送信される前に、ハンドシェイクが実行され、通信の「基本ルール」が確立されます。

スプーフィングされたIPを持つパケットが送信された場合、サーバーからの応答はあなたのIPではなくそのIPに送信されます。

つまり、ハンドシェイクを完了できないため、HTTPリクエストを送信しません。

より正確には、a TCP IP aからのSYNパケットを偽装し、IP bに送信されたパケットのみが表示される場合、TCP ACKは表示されません。サーバーがaに送信するパケット。したがって、TCP接続を正しく確立するために別の偽装パケットを作成することはできません。

詳細については、お気に入りの検索エンジンと「TCP」をお勧めします。

4
Tobi Nary