PDA

View Full Version : Php-Nuke POST XSS


Soniks
10.03.2007, 05:16
Продукт: PHP-Nuke
Версия: 8.0 и ниже
Описание:
При определенных настройках сервера (4.0.7<=PHP<=5.2.1 и выключенном параметре register_globals off), позволяет злоумышленнику подменять переменные в скриптах, при помощи POST запроса.
Устранение:

Открываем:
mainfile.php

Находим (89 строка):
if (!ini_get('register_globals')) {
@import_request_variables("GPC", "");
}
И меняем на:

if (!ini_get('register_globals')) {
extract($_COOKIE, EXTR_SKIP);
extract($_POST, EXTR_SKIP);
extract($_GET, EXTR_SKIP);
}
Для версий php-nuke ниже 8.0 нужно так же добавить еще ниже:

// 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);
}
}

На этом все!:breton:

Alexander-V-Sh
11.03.2007, 18:14
Для версий php-nuke ниже 8.0 нужно так же добавить еще ниже:
У меня версия 7.9.3.1. Этот код присутствует в ней.

Astrix
11.03.2007, 18:59
у меня 7.9.3.2 - там его уже нет :(
А вот вторая часть имеется...

Alexander-V-Sh
11.03.2007, 19:21
Astrix
Я про вторую часть и говорю.
// Die message for empty HTTP_REFERER

А первой ниукого наверно нет, раз для 8 менять надо. Заменил себе

Astrix
11.03.2007, 19:39
аналогично. я тоже заменил.

Astrix
18.03.2007, 22:02
И меняем на:

if (!ini_get('register_globals')) {
extract($_COOKIE, EXTR_SKIP);
extract($_POST, EXTR_SKIP);
extract($_GET, EXTR_SKIP);
}


Soniks, я бы от себя порекомендовал сделать небольшую перестановку в этом коде, а именно:


if (!ini_get('register_globals')) {
extract($_POST, EXTR_SKIP);
extract($_GET, EXTR_SKIP);
extract($_COOKIE, EXTR_SKIP);
}

А перед ним вставить вот такой код:


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

PPS
Найдено мною только что.

Soniks
21.03.2007, 23:55
Astrix Теперь поясню, чем чревато невыполнение этой маленькой просьбы.

Переменные cookie вообще не подлежат никакой проверке в Нюке и (мною было только что проверено!!!) хакер может сформировать определенным образом эти самые куки и выполнить произвольный SQL-запрос в БД жертвы.
бесполезный шаг, читайте описание функции extract() и не советуйте того чего не проверяли!

Astrix
22.03.2007, 00:26
Astrix
бесполезный шаг, читайте описание функции extract() и не советуйте того чего не проверяли!

Проверял! И два дня назад взломал таким методом сайт - специально, чтобы проверить (не буду говорить, какой, к тому же они сервер прикрыли), и на локалхосте в разных вариантах все это прогонял! Так что уж поверьте, я знаю, о чем говорю...

Описание функции я читал: "EXTR_SKIP - Если есть конфликт, существующая переменная не перезаписывается."

в том все и дело, что из COOKIE переменные извлекаются в первую очередь и никаких конфликтов и быть не может!

В общем, я останусь при своем мнении. Вы поступайте, как считаете нужным.

jokerz
24.03.2007, 11:04
потверждаю, но многие пропаччены

Soniks
24.03.2007, 17:30
Astrix разницы ни какой, т.к. не в этом смысл что первое, т.к. что куки подменить, что в пост добавить, что в гет, любой способ подойдет, если скрипт не проверяет переменные то тут уже проблема не в этом именно... данная проблема существует именно в том, что происходит подмена переменной $_SERVER, на которую опирается фильтр.

Astrix
25.03.2007, 01:33
тут соглашусь, но все же Get/post переменные в отличие от Cookies проходят хоть какую-то проверку!
и мой способ не может быть панацеей. я всего лишь сказал, как снизить вероятность взлома, но любые фильтры бесполезны по одиночке. только комплекс мер может полностью защитить сайт.
и я привел небольшую часть из этого комплекса.