Продукт: PHP-Nuke Версия: 8.0 и ниже Описание:
При определенных настройках сервера (4.0.7<=PHP<=5.2.1 и выключенном параметре register_globals off), позволяет злоумышленнику подменять переменные в скриптах, при помощи POST запроса. Устранение:
Открываем:
mainfile.php
Находим (89 строка):
PHP код:
if (!ini_get('register_globals')) { @import_request_variables("GPC", ""); }
И меняем на:
PHP код:
if (!ini_get('register_globals')) { extract($_COOKIE, EXTR_SKIP); extract($_POST, EXTR_SKIP); extract($_GET, EXTR_SKIP); }
Для версий php-nuke ниже 8.0 нужно так же добавить еще ниже:
PHP код:
// Die message for empty HTTP_REFERER $posttags = "<b>Внимание:</b> ваш браузер не отправляет шапку HTTP_REFERER на сайт.<br>"; $posttags .= "Это может быть вызвано вашим браузером, использования proxy server или Firewall.<br>"; $posttags .= "Пожалуйста, измените ваш браузер или выключите использование proxy<br>"; $posttags .= "или выключите 'Deny servers to trace web browsing' в вашем firewall<br>"; $posttags .= "и вы не должны иметь проблем с отсылкой POST запросов на сайт."; if ($_SERVER['REQUEST_METHOD'] == "POST") { if (isset($_SERVER['HTTP_REFERER'])) { if (!stripos_clone($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { die('Posting from another server not allowed!'); } } else { die($posttags); } }
На этом все!
Последний раз редактировалось Soniks, 22.03.2007 в 00:36.
"Если бы вам удалось надавать под зад человеку, виноватому в большинстве ваших неприятностей - вы бы неделю не смогли сидеть".
Soniks, я бы от себя порекомендовал сделать небольшую перестановку в этом коде, а именно:
PHP код:
if (!ini_get('register_globals')) {
extract($_POST, EXTR_SKIP);
extract($_GET, EXTR_SKIP);
extract($_COOKIE, EXTR_SKIP);
}
А перед ним вставить вот такой код:
PHP код:
foreach ($_COOKIE AS $c_key => $c_val)
{
if (isset($_POST[$c_key]) OR isset($_GET[$c_key])) unset($_COOKIE[$c_key]);
}
Теперь поясню, чем чревато невыполнение этой маленькой просьбы.
Переменные cookie вообще не подлежат никакой проверке в Нюке и (мною было только что проверено!!!) хакер может сформировать определенным образом эти самые куки и выполнить произвольный SQL-запрос в БД жертвы.
В связи с этим предлагаю уничтожать все переменные, содержащиеся одновременно в cookie и передаваемые в post/get запросе, отдавая при этом приоритет post/get, т. к. они проходят проверку.
PS
Уязвимость актуальна только при отключенном параметре magic_quotes_gpc
Проверял! И два дня назад взломал таким методом сайт - специально, чтобы проверить (не буду говорить, какой, к тому же они сервер прикрыли), и на локалхосте в разных вариантах все это прогонял! Так что уж поверьте, я знаю, о чем говорю...
Описание функции я читал: "EXTR_SKIP - Если есть конфликт, существующая переменная не перезаписывается."
в том все и дело, что из COOKIE переменные извлекаются в первую очередь и никаких конфликтов и быть не может!
В общем, я останусь при своем мнении. Вы поступайте, как считаете нужным.
Astrix разницы ни какой, т.к. не в этом смысл что первое, т.к. что куки подменить, что в пост добавить, что в гет, любой способ подойдет, если скрипт не проверяет переменные то тут уже проблема не в этом именно... данная проблема существует именно в том, что происходит подмена переменной $_SERVER, на которую опирается фильтр.
"Если бы вам удалось надавать под зад человеку, виноватому в большинстве ваших неприятностей - вы бы неделю не смогли сидеть".