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

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

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

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

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

7 ответов

Решение

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

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

Однако, если вы можете скомпрометировать шлюз, с которого отключен IP, вы можете делать все, что захотите. Таким образом, если вы скомпрометировали маршрутизатор Wi-Fi, к которому подключен компьютер, вы можете притвориться этим компьютером, и сервер не заметит разницы. Если вы скомпрометируете исходящий маршрутизатор провайдера, вы можете (по крайней мере, теоретически) притвориться компьютером, и сервер не заметит разницы.

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

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

Важный

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

Изменить: Соответствующий

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

Как я взломал Stackru

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

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

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

Если вы просматриваете через прокси, $_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.

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

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

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

REMOTE_ADDR

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

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

Другие вопросы по тегам