Назад | Перейти на главную страницу

Взломали? Как добавление имени файла обеспечивает доступ к данным на сайте… см. Пример

При посещении всех перечисленных ниже вы попадете на экран входа в систему:

http://mysite.com/admin/configuration.php
http://mysite.com/admin/login.php

Однако, если вы посетите (обратите внимание, что две последние части строки URL-адреса являются .php):

http://mysite.com/admin/configuration.php/login.php

Вы можете увидеть экран конфигурации и все его данные!

Кроме того, если вы добавите некоторые переменные GET, вы даже можете получить редактируемые поля:

http://mysite.com/admin/configuration.php/login.php?cID=1&action=edit

Что здесь происходит?

Я должен отметить, что это на сайте с использованием абсолютно ужасной корзины покупок под названием oscommerce. Код - это кошмар, но я пока с ним застрял.


РЕДАКТИРОВАТЬ

Исправление, основанное на отличном и точном комментарии ниже:

Это будет происходить непосредственно перед проверкой, чтобы узнать, $current_page != FILENAME_LOGIN (около строк 141–143 в /admin/includes/application_top.php). Имейте в виду, что это просто аварийный патч, поскольку реальное решение - никогда не использовать интернет-торговлю, поскольку он так же безопасен, как пояс проститутки.

//$current_page = basename($PHP_SELF); //this is the default
$current_page = basename($_SERVER['SCRIPT_NAME']); //change that default to this

if ( ($current_page == FILENAME_LOGIN) && !tep_session_is_registered('redirect_origin') ) {
      $current_page = FILENAME_DEFAULT;
      $HTTP_GET_VARS = array();
    }

Если кто-то попытается это сделать, не забывайте, что redirect_origin переменная сеанса может быть уже установлена, поэтому это не сработает. Просто отключите его и попробуйте снова.

В include / application_top, который включается всеми скриптами в /admin вы найдете эту маленькую жемчужину (я выбросил некоторые неинтересные части):

// redirect to login page if administrator is not yet logged in
if (!tep_session_is_registered('admin')) {
    $redirect = false;

    $current_page = basename($PHP_SELF);

    if ($current_page != FILENAME_LOGIN) {
        // session stuf blabla
        $redirect = true;
    }

    if ($redirect == true) {
        tep_redirect(tep_href_link(FILENAME_LOGIN));
    }

    unset($redirect);
}

Этот код запускается только тогда, когда вы не вошли в систему. В основном он проверяет, basename из $PHP_SELF это login.php. Если это login.php, он продолжает рендеринг страницы, в противном случае вы будете перенаправлены.

Если вы сделаете этот запрос:

http://mysite.com/admin/configuration.php/login.php

Тогда PHP_SELF будет

/admin/configuration.php/login.php

И basename($PHP_SELF) конечно будет login.php таким образом, рендеринг продолжается, и перенаправление не выполняется. Но это конечно не так login.php который отображается, но configuration.php. Остальная часть URL-адреса «/login.php» «игнорируется» и просто передается PHP в $ _SERVER ['PATH_INFO'].

Изменить: я хотел бы добавить, что эта «ошибка» влияет только на oscommerce или любое другое программное обеспечение, которое использует подобное решение для «защиты» входа в систему администратора (я думаю, что не так много людей страдают от этого). Это не ошибка, которая затрагивает все программное обеспечение PHP.

Это просто уязвимость в configuration.php file - фальшивый каталог с файлом php как частью пути является преднамеренной функцией и тем, что вы часто будете видеть - то, как обрабатывается материал после косой черты, зависит от файла php в пути. (на ум приходит mediawiki)

Я пробовал это в окне Windows, чтобы использовать двойной URL-адрес, как указано, - он говорит, что страница не найдена. Но сервер настроен так, чтобы не разрешать перемещение каталогов, а OSCommerce настроен на проверку пользовательского агента и предотвращение сеансов пауков, а также использование каталога сеансов - возможно, поэтому он безопасен и не позволяет добавлять URL-адрес. Кроме того, сервер рассматривает /login.php как часть первого имени файла, не допускает обхода каталога и не допускает точки в имени файла - следовательно, он полностью отклоняет URL-адрес. Следовательно, безопасен, потому что сервер безопасен независимо от того, что пытается сделать программное обеспечение каталога.