При посещении всех перечисленных ниже вы попадете на экран входа в систему:
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-адрес. Следовательно, безопасен, потому что сервер безопасен независимо от того, что пытается сделать программное обеспечение каталога.