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


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

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

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

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

7 61

7 ответов:

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

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

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

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

однако, вы сможете выковать 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: Relevant

недавно я написал сообщение в блоге о том, как я наткнулся на уязвимость в приложении 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'; в начале скриптов, но я сомневаюсь, что это то, что ты пытаешься сделать