Этот код уязвим для хакерской атаки? - PullRequest
2 голосов
/ 31 июля 2009

Я действительно новичок в онлайн-приложении. Я использую PHP, я получил этот код:

if(isset($_GET['return']) && !empty($_GET['return'])){
return = $_GET['return'];
header("Location: ./index.php?" . $return);    
} else {
header("Location: ./index.php");    

}

переменная $return - это переменная URL, которая может быть легко изменена хакером.

Например, я получаю переменную $return из этого: www.web.com/verify.php?return=profile.php

Есть ли что-нибудь, что я должен позаботиться? Должен ли я использовать htmlentities в этой строке:

header("Location: ./index.php?" . htmlentities($return));    

Уязвим ли он к атаке хакера?

Что я должен сделать, чтобы предотвратить взлом?

Ответы [ 6 ]

5 голосов
/ 31 июля 2009

Помимо этой опечатки в строке 2 (должно быть $ return = $ _GET ['return'];) вы должны сделать $ return = urlencode ($ return) , чтобы убедиться, что $ return является допустимый QueryString, поскольку он передается в качестве параметра в index.php.

index.php должен затем проверить, что return является допустимым URL-адресом, к которому у пользователя есть доступ. Я не знаю, как работает ваш index.php, но если он просто отображает страницу, вы можете получить что-то вроде index.php? / Etc / passwd или аналогичное, что действительно может быть проблемой безопасности.

Редактировать: Какую дыру в безопасности вы получаете? Я вижу две возможные проблемы, в зависимости от того, как index.php использует возвращаемое значение:

  • Если index.php перенаправляет пользователя на целевую страницу, то я мог бы использовать ваш сайт в качестве ретранслятора для перенаправления пользователя на сайт, которым я управляю. Это может быть использовано либо для фишинга (я делаю сайт, который выглядит точно так же, как ваш, и запрашивает у пользователя имя пользователя / пароль), либо просто для рекламы.
    • Например, http://yoursite/index.php?return?http%3A%2F%2Fwww.example.com выглядит так, как будто пользователь заходит на Ваш сайт, но затем перенаправляется на www.example.com. Поскольку я могу кодировать любой символ, используя нотацию% xx, это может даже не быть очевидным для пользователя.
  • Если index.php отображает файл из return-параметра, я мог бы попытаться передать имя некоторого системного файла, такого как / etc / passwd, и получить список всех пользователей. Или я мог бы передать что-то вроде ../config.php и получить подключение к вашей базе данных
    • Не думаю, что здесь так, но это такая распространенная дыра в безопасности, которую я все же хотел бы отметить.

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

  • $ newurl = "http://yoursite/". $ Return;
    • это может гарантировать, что вы всегда находитесь только на своем домене и никогда не будете перенаправлять на любой другой домен
  • $ valid = file_exists ($ return)
    • Это работает, если $ return - это всегда страница на жестком диске. Проверяя, что return действительно указывает на действительный файл, вы можете отфильтровать фиктивные записи
    • Если return примет строки запроса (то есть return = profile.php? Step = 2), вам нужно будет разобрать путь "profile.php"
  • иметь список допустимых значений для $ return и сравнить с ним
    • это обычно непрактично, если вы действительно не спроектировали свое приложение так, чтобы index.php мог возвращать только заданный набор страниц

Есть много способов снять шкуру с этого кота, но обычно вы хотите как-то проверить, что $ return указывает на действительную цель. Каковы эти действительные цели, зависит от вашей спецификации.

3 голосов
/ 31 июля 2009

Если вы используете более старую версию PHP 4 или 5, то я думаю, что вы будете уязвимы для внедрения заголовка - кто-то может установить возврат по URL-адресу, затем возврат строки и любые другие заголовки, которые они хотят чтобы ваш сервер отправлял.

Вы можете избежать этого, сначала очистив строку. Этого может быть достаточно, чтобы убрать возврат строк, но было бы лучше иметь разрешенный список символов - это может быть нецелесообразно.

4.4.2 и 5.1.2 : эта функция теперь предотвращает использование более одного заголовка отправлено сразу в качестве защиты от атаки с использованием заголовков.

http://php.net/manual/en/function.header.php

2 голосов
/ 31 июля 2009

Что бы произошло, если бы вы добавили страницу, которой не было. Например:

return=blowup.php

или

return=http://www.google.co.uk

или

return=http%3A%2F%2Fwww.google.co.uk%2F

Вы могли бы скрыть ссылку, не включив в переменную .php. Затем вы можете добавить его в коде и проверить наличие файла в вашем каталоге / использовать оператор switch допустимых значений перед перенаправлением на него.

1 голос
/ 21 апреля 2011

Я Вещь Хакер может сделать это вы будете перенаправлять, если $_GET['return'] Содержит какую-либо вещь хакер может использовать его как xss перенаправить на вирус или что-то подобное но нет возможности сделать что-либо еще

1 голос
/ 31 июля 2009

Вещи, которые я бы сделал:

  1. Определите, какой тип возвращаемых значений разрешен?
  2. Запишите все типы возможных возвращаемых значений.
  3. Затем сделайте выводы: какие символы запрещены, какая максимальная длина URL, какие домены разрешены и т. Д.
  4. Наконец: создайте функцию фильтра в соответствии с приведенными выше выводами.
1 голос
/ 31 июля 2009

В этом случае это больше зависит от того, что сделано с этой частью строки запроса на index.php. Если он отправляется в запрос к базе данных, вывод eval() или exec() да, это очень распространенная дыра в безопасности. Большинство других ситуаций будет безопасно нефильтровано, но лучше написать свою собственную дезинфицирующую функцию общего назначения, которая преобразует кавычки всех разновидностей в их сущность HTML, а также равнозначные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...