Forum. MyNuke.ru

Forum. MyNuke.ru (http://forum.mynuke.ru/index.php)
-   Уязвимости Защиты (http://forum.mynuke.ru/forumdisplay.php?f=15)
-   -   Php-Nuke POST XSS (http://forum.mynuke.ru/showthread.php?t=2666)

Soniks 10.03.2007 05:16

Php-Nuke POST XSS
 
Продукт: 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($_COOKIEEXTR_SKIP);
extract($_POSTEXTR_SKIP);
extract($_GETEXTR_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);
}



На этом все!: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

Цитата: Сообщение от Soniks
И меняем на:
PHP код:
 if (!ini_get('register_globals')) {
 
extract($_COOKIEEXTR_SKIP);
 
extract($_POSTEXTR_SKIP);
 
extract($_GETEXTR_SKIP);




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

PHP код:
 if (!ini_get('register_globals')) {
 
extract($_POSTEXTR_SKIP);
 
extract($_GETEXTR_SKIP);
 
extract($_COOKIEEXTR_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

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

Soniks 21.03.2007 23:55

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

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

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

Astrix 22.03.2007 00:26

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


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

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

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

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

jokerz 24.03.2007 11:04

потверждаю, но многие пропаччены

Soniks 24.03.2007 17:30

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


Часовой пояс GMT +4, время: 18:50.

Copyright © 2005 by Soniks