Уважаемые посетители портала Kamensk.NET! Напоминаем вам, что будучи зарегистрированным пользователем вы получаете возможность оставлять комментарии к новостям на сайте и к топикам на форуме, иметь доступ к скрытым разделам и много других благ и привелегий. Пожалуйста заполните регистрационную форму, это отнимет у вас всего лишь несколько минут вашего времени.
osCommerce: уязвимость в модуле kvitan.php (квитанция Сбербанк)
Найденная уязвимость позволяет любому пользователю смотреть любой заказ, оформленный в магазине где установлен модуль печати квитанции Сбербанка (файл kvitan.php).
Любой посетитель сайта может набрать в браузере: http://www.example.com/kvitan.php?order_id=X (или http://www.example.com/catalog/kvitan.php?order_id=X или другой путь по которому установлен каталог магазина), где X - это номер заказа (число), и просмотреть квитанцию сбербанка с датой, суммой платежа и платёжным адресом клиента.
Таким образом перебирая номера с 1 и далее пока не будет выдана ошибка, можно скачать всю историю заказов магазина с информацией о клиентах. Для этого можно например использовать простой скрипт и wget.
В 2008 году Александр Меновщиков известный под псевдонимом «vam», включил исправленную версию этого скрипта в свою пиратскую сборку «osCommerce VAM edition» ("патч" как и саму сборку могут скачивать только купившие лицензию, при том что движок распространяется по GPL). Но этот патч не устраняет уязвимость полностью.
В модификации от VAM был добавлен код, проверяющий залогинен ли пользователь, но при этом там всё равно нет проверки на соответствие между номером заказа и учётной записи пользователя. Поэтому для эксплуатации уязвимости в версии распространяемой Александром Меновщиковым, достаточно зарегистрироваться в магазине и можно точно также скачать все заказы.
Ниже приведён код, исправляющий данную уязвимость.
В файле kvitan.php сразу после строки:
require('includes/application_top.php');
и ДО строки:
require(DIR_WS_LANGUAGES . $language . '/modules/payment/rusbank.php');
ДОБАВИТЬ:
// UPD ADD 2009-02-17 (SECURITY FIX 1)
if (!tep_session_is_registered('customer_id')) {
$navigation->set_snapshot();
tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
}
// END OF UPD ADD 2009-02-17 (SECURITY FIX 1)
// UPD ADD 2009-02-17 (SECURITY FIX 2)
$customer_number_query = tep_db_query("select customers_id from " . TABLE_ORDERS . " where orders_id = '". tep_db_input(tep_db_prepare_input($_GET['order_id'])) . "'");
$customer_number = tep_db_fetch_array($customer_number_query);
if ($customer_number['customers_id'] != $customer_id) {
tep_redirect(tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL'));
}
// END OF UPD ADD 2009-02-17 (SECURITY FIX 2)
Первая часть кода в последнем патче от VAM уже есть, а вторые несколько строк Александр почему-то не догадался скопировать из printorder.php 
Последние комментарии