Как подделать переменную $ 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, к которому подключен компьютер, вы можете притвориться этим компьютером, и сервер не скажет разницы. Если вы компрометируете исходящий маршрутизатор провайдера, вы можете (по крайней мере теоретически) притвориться компьютером, и сервер не будет различать разницу.
для получения дополнительной информации, см. следующие ссылки:
однако, вы сможете выковать
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
и теперь они, кажется, местные! Это один из случаев, когда использование фреймворка без понимания того, как он работает в бэкэнде, может быть действительно плохим...Edit: Relevant
недавно я написал сообщение в блоге о том, как я наткнулся на уязвимость в приложении 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.