Как подделать переменную $ SERVER['REMOTE ADDR']?

можно ли подделать или захватить содержимое $_SERVER['REMOTE_ADDR'] переменной?

Я хотел бы, чтобы подделать запрос:

$_SERVER['REMOTE_ADDR']='127.0.0.1';

Как я могу это сделать с PHP? Может ли керл как-то это сделать?

7 ответов


Я предполагаю, что вы имеете в виду притворяется удаленно. Короткий ответ: да, можете. Длинный ответ о том, насколько это легко, зависит от того, как вы хотите его подделать.

если вы не заботитесь о получении ответа, это так же тривиально, как открытие необработанного сокета к месту назначения и подделка исходного IP-адреса. Я не уверен, что это действительно легко сделать в PHP, так как все реализации сокетов PHP находятся на уровне TCP или выше. Но я уверен, что это возможно. Так как тебя нет дома управление сетью, ответ не будет возвращаться к вам. Таким образом, это означает, что вы не можете (надежно в любом случае) создать TCP-соединение через тривиальный поддельный заголовок TCP (поскольку syn-ack предотвращает это, требуя двусторонней связи).

однако, если вы можете скомпрометировать шлюз, IP выключен, вы можете делать все, что хотите. Поэтому, если вы компрометируете wifi-маршрутизатор, к которому подключен компьютер, вы можете притвориться этим компьютером, и сервер не заметит разницы. Если вы компрометируете исходящий маршрутизатор ISP, вы можете (по крайней мере теоретически) притвориться компьютером, и сервер не заметит разницы.

для получения дополнительной информации, см. следующие ссылки:

тем не менее, вы сможете только подделать 127.0.0.1 адрес обратной связи по TCP, если вы фактически компрометируете локальную машину / сервер. И в этот момент это действительно имеет значение?

важно

если вы используете фреймворк для доступа к этой информации, будьте абсолютно точно что он не проверяет X-HTTP-FORWARDED-FOR заголовок! В противном случае подделать IP-адрес тривиально. Например, если вы используете Zend Framework в Zend_Controller_Request_Http::getClientIp метод, будьте абсолютно уверены, что вы проходите false в качестве параметра! Иначе кому-то просто нужно отправить HTTP-заголовок: X-Http-Forwarded-For: 127.0.0.1 и теперь они кажутся местными! Это один из случаев, когда использование фреймворка без понимания того, как он работает в бэкэнде, может быть действительно плохим...

Edit: Соответствующий

недавно я написал сообщение в блоге о том, как я наткнулся на уязвимость в приложении StackOverflow. Это очень актуально здесь, так как он использует очень похожий механизм на то, что ищет этот вопрос (хотя обстоятельства вокруг него несколько узкий):

Как Я Взломал StackOverflow


удаленный адрес не является чем-то добавленным из вежливости, он используется в протоколе IP для маршрутизации пакетов, поэтому, если вы отправка пакета с поддельным адресом!--2-->, вы не получите ответ, и так как вы говорите о HTTP-запросе, который доставляется через TCP-соединение, для настройки которого требуется несколько IP-пакетов (и соответствующие ответы):

нет, это невозможно (за исключением, конечно, отправки запроса с того же хоста через петлю взаимодействие.)


Apache заполняет $_SERVER['REMOTE_ADDR'] из сокета TCP, который он использует для связи с вашим браузером. Это невозможно влиять на эту переменную через интернет из-за три-рукопожатие. Если клиент и сервер находятся в широковещательной сети, например wifi, вы можете понюхать провод и завершить рукопожатие.


вы можете заменить любой элемент $_SERVER массив, включая тот, который вы упомянули, в код сервер; конечно, не в чужую.

однако, это не изменит IP-адрес вашего компьютера.


Если вы просматриваете через прокси,$_SERVER['REMOTE_ADDR'] может быть настроен на IP-адрес прокси, а не конечного пользователя.

есть другие заголовки, которые вы можете использовать вместо этого в этом случае: эта страница дает функцию, которая проверяет все возможности и предоставляет адрес, скорее всего, конечного пользователя:

http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

однако, если пользователь проксирует с помощью плохо настроенного прокси-сервера или вредоносный или предназначенный для анонимизации конечного пользователя, тогда вы не сможете гарантировать ни один из заголовков, кроме REMOTE_ADDR (что приведет вас только к прокси-серверу).

Если ваш конечный пользователь просматривает через HTTPS, то REMOTE_ADDR всегда будет его IP-адрес; вы не можете использовать переадресацию прокси через HTTPS. Поэтому один из способов быть абсолютно уверенным в его адресе-заставить его открыть ваш сайт в HTTPS.


REMOTE_ADDR

IP-адрес, с которого пользователь просматривает текущую страницу.

вы можете запросить скрипт через прокси и т. д. чтобы изменить IP-адрес, но вы не можете установить там любой текст, который вы хотите.


это переменная, установленная apache или любым сервером, который вы используете. Вы не можете его подделать. Вы можете бежать $_SERVER['REMOTE_ADDR']='127.0.0.1'; в начале скриптов, но я сомневаюсь, что это то, что ты пытаешься сделать