osCommerce: уязвимость в модуле "Квитанция Сбербанка" (kvitan.php, rusbank)

RA
На сайте с 29.08.2007
Offline
88
2575

Всем кто использует в интернет-магазине на движке osCommerce файлик kvitan.php (rusbank) для печати квитанции Сбербанка, советую проверить его на наличие уязвимости!

Любой посетитель сайта может набрать в браузере: http://адрес_магазина/kvitan.php?order_id=X

(где X - номер заказа), и посмотреть таким образом любую чужую квитанцию. Перебирая номера от 1 и далее, можно скачать всю базу заказов магазина (сумма, дата, платёжные данные клиента).

В пиратской сборке "VAM edition" есть патч 2008 года который устраняет только часть проблемы. Этот патч добавляет только проверку на то, залогинен ли пользователь, но при этом любой пользователь имеющий учётную запись в магазине может по-прежнему смотреть чужие квитанции.

Ниже приведён код, исправляющий данную уязвимость.

В файле kvitan.php сразу после строки:

require('includes/application_top.php');

и ДО строки:

require(DIR_WS_LANGUAGES . $language . '/modules/payment/rusbank.php');

ДОБАВИТЬ:


// UPD ADD (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 (SECURITY FIX 1)

// UPD ADD (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 (SECURITY FIX 2)

Первая часть этого кода уже есть в одном из последних патчей vam.

N
На сайте с 06.05.2007
Offline
419
#1

А дайте ссылку на модуль ?

вот тут http://addons.oscommerce.com/info/3243, смотрю, принципиально другой код.

Это, похоже, обкур лично VaM-а. (и не первый).

Кнопка вызова админа ()
RA
На сайте с 29.08.2007
Offline
88
#2
netwind:
А дайте ссылку на модуль ?
у меня смотрю в этом месте принципиально другой код.
Это, похоже, обкур лично VaM-а. (и не первый).

Вот полностью код kvitan.php:


<?php
/*
$Id: kvitan.php,v 1.6 2003/06/20 00:37:30 hpdl Exp $

osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com

Copyright (c) 2003 osCommerce

Released under the GNU General Public License
*/

require('includes/application_top.php');

// UPD ADD (SECURITY FIX 1)
if (!tep_session_is_registered('customer_id')) {
$navigation->set_snapshot();
tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
}
// END OF UPD (SECURITY FIX 1)

// UPD ADD (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 (SECURITY FIX 2)


require(DIR_WS_LANGUAGES . $language . '/modules/payment/rusbank.php');

require(DIR_WS_CLASSES . 'order.php');
$order = new order($_GET['order_id']);

/*error_log("Квитанция заказ ".$order);
error_log("Квитанция корзина ".$cart->count_contents());
error_log("Квитанция заказ всего " .$order->info['total']);
error_log("Квитанция заказ доставка страна " . $order->delivery['country']);
error_log("Квитанция заказ доставка name " . $order->delivery['name']);
error_log("Квитанция заказ доставка street_address " . $order->delivery['street_address']);
error_log("Квитанция заказ доставка city " . $order->delivery['city']);
error_log("Квитанция заказ доставка postcode " . $order->delivery['postcode']);
error_log("Квитанция заказ покупатель name " . $order->customer['customers_name']);
error_log("Квитанция заказ покупатель city " . $order->customer['city']);
error_log("Это cart ---------------------", 0);
while ( list( $key, $val ) = each($cart) ) {
error_log("$key => $val", 0);
}
error_log("Это order delivery ---------------------", 0);
while ( list( $key, $val ) = each($order->delivery) ) {
error_log("$key => $val", 0);
}
error_log("Это shipping ---------------------", 0);
while ( list( $key, $val ) = each($shipping) ) {
error_log("$key => $val", 0);
}
error_log("Это order_total ---------------------", 0);
while ( list( $key, $val ) = each($order_total)) {
error_log("$key => $val", 0);
}*/
$FIO = $order->delivery['name'];
$Adress = $FIO . "<BR>" . $order->delivery['postcode'] . ", " . $order->delivery['state'] . ", " . $order->delivery['city'] . ", " . $order->delivery['street_address'];
$total = $order->info['total'];
//$total = number_format( $order->info['total'] * $currencies->get_value('RUR'), $currencies->get_decimal_places('RUR')) . " руб.";
//error_log("Это FIO ". $FIO, 0);
$date = date("d-m-Y");
//error_log("Это дата ". $date, 0);

//'Название банка', 'MODULE_PAYMENT_RUS_BANK_1'
//'Расчетный счет', 'MODULE_PAYMENT_RUS_BANK_2'
//'БИК', 'MODULE_PAYMENT_RUS_BANK_3'
//'Кор./счет', 'MODULE_PAYMENT_RUS_BANK_4'
//'ИНН', 'MODULE_PAYMENT_RUS_BANK_5'
//'Получатель', 'MODULE_PAYMENT_RUS_BANK_6'
//'КПП', 'MODULE_PAYMENT_RUS_BANK_7'

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML dir=ltr lang=ru><HEAD><TITLE>Квитанция на оплату услуг для <?php echo $FIO ?></TITLE>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
<META content="MSHTML 5.00.3700.6699" name=GENERATOR></HEAD>
<BODY>
<CENTER>
<TABLE border=1 cellPadding=3 cellSpacing=0 width=600>
<TBODY>
<TR>
<TD align=right height=255 vAlign=top width=240><BR><BR><FONT size=2>
<P>Извещение</P></FONT><FONT
size=1><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<P>Кассир</P><BR></FONT></FONT></TD>
<TD align=right height=255 vAlign=center width=100>
<TABLE border=1 cellPadding=3 cellSpacing=0 width=360><FONT size=-1>
<P align=center><?php echo MODULE_PAYMENT_RUS_BANK_1 . "<br>ИНН " . MODULE_PAYMENT_RUS_BANK_5 . ", " . MODULE_PAYMENT_RUS_BANK_6 ?>
<BR><P></P></FONT><FONT size=1>получатель платежа</FONT>
<TBODY>
<TR>
<TD align=middle colSpan=4 height=10 vAlign=center><FONT size=2>
<P>Расчетный счет №: <?php echo MODULE_PAYMENT_RUS_BANK_2 ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;БИК:
<?php echo MODULE_PAYMENT_RUS_BANK_3 ?></P></FONT></TD></TR>
<TR>
<TD align=center colSpan=4 height=10 vAlign=middle><FONT size=2>
<P>Кор. сч.: <?php echo MODULE_PAYMENT_RUS_BANK_4 . " &nbsp;&nbsp;&nbsp;&nbsp;КПП " . MODULE_PAYMENT_RUS_BANK_7 ?></P></FONT></TD></TR>
<TR>
<TD colSpan=4><FONT size=2>
<CENTER>&nbsp; <?php echo $Adress ?> <BR></CENTER></FONT></TD></TR>
<TR>
<TD align=middle colSpan=2><FONT size=2>Вид платежа</FONT></TD>
<TD align=middle><FONT size=2>Дата</FONT></TD>
<TD align=middle><FONT size=2>Сумма</FONT></TD></TR>
<TR>
<TD align=middle colSpan=2><FONT size=1><?php echo MODULE_PAYMENT_RUS_BANK_8 . MODULE_PAYMENT_RUS_BANK_ORDER_NUMBER . $_GET['order_id']; ?></FONT></TD>
<TD align=middle><FONT size=2><?php echo $date ?></FONT><BR></TD>
<TD align=middle><FONT size=2><?php echo $total ?></FONT></TD></TR>
<TR>
<TD align=left colSpan=2 rowSpan=2><FONT
size=2>Плательщик:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD align=middle><FONT size=1>Пеня:</FONT></TD>
<TD align=middle>---<BR></TD></TR>
<TR align=middle>
<TD><FONT size=2>Всего:</FONT></TD>
<TD><FONT size=2><?php echo $total ?></FONT><BR></TD></TR></P></TABLE></TD></TR>
<TR>
<TD align=right height=255 vAlign=top width=240><FONT size=2><BR><BR>
<P>Квитанция</P><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><FONT size=1>
<P>Кассир</P><BR></FONT></FONT></TD>
<TD align=right height=255 vAlign=center width=100>
<TABLE border=1 cellPadding=3 cellSpacing=0 width=360><FONT size=-1>
<P align=center><?php echo MODULE_PAYMENT_RUS_BANK_1 . "<br>ИНН " . MODULE_PAYMENT_RUS_BANK_5 . ", " . MODULE_PAYMENT_RUS_BANK_6 ?>
<P></P></FONT><FONT size=1>получатель платежа</FONT>
<TBODY>
<TR>
<TD align=middle colSpan=4 height=10 vAlign=center><FONT size=2>
<P>Расчетный счет №: <?php echo MODULE_PAYMENT_RUS_BANK_2 ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;БИК:
<?php echo MODULE_PAYMENT_RUS_BANK_3 ?></P></FONT></TD></TR>
<TR>
<TD align=center colSpan=4 height=10 vAlign=middle><FONT size=2>
<P>Кор. сч.: <?php echo MODULE_PAYMENT_RUS_BANK_4 . " &nbsp;&nbsp;&nbsp;&nbsp;КПП " . MODULE_PAYMENT_RUS_BANK_7 ?></P></FONT></TD></TR>
<TR>
<TD colSpan=4><FONT size=2>
<CENTER>&nbsp; <?php echo $Adress ?><BR></CENTER></FONT></TD></TR>
<TR>
<TD align=middle colSpan=2><FONT size=2>Вид платежа</FONT></TD>
<TD align=middle><FONT size=2>Дата</FONT></TD>
<TD align=middle><FONT size=2>Сумма</FONT></TD></TR>
<TR>
<TD align=middle colSpan=2><FONT size=1><?php echo MODULE_PAYMENT_RUS_BANK_8 . MODULE_PAYMENT_RUS_BANK_ORDER_NUMBER . $_GET['order_id']; ?></FONT></TD>
<TD align=middle><FONT size=2><?php echo $date ?></FONT><BR></TD>
<TD align=middle><FONT size=2> <?php echo $total ?></FONT></TD></TR>
<TR>
<TD align=left colSpan=2 rowSpan=2><FONT
size=2>Плательщик:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD align=middle><FONT size=1>Пеня:</FONT></TD>
<TD align=middle>---<BR></TD></TR>
<TR align=middle>
<TD><FONT size=2>Всего:</FONT></TD>
<TD><FONT size=2><?php echo $total ?></FONT><BR></TD></TR></P></TABLE></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

Сам модуль нигде не мог найти, на oscommerce.ru раздел "Файлы" давно не работает, в итоге пришлось качать с торрента несколько версий "vam" и выдёргивать нужные модули квитанции и счёта оттуда.

Последняя версия vam которая у меня есть это 1.184 от 26 февраля 2008 года, там есть код который обозначен в комментарии как "SECURITY FIX 1" но нет кода с комментарием "SECURITY FIX 2". В версии vam 1.181 нет ни того ни другого исправления.

N
На сайте с 06.05.2007
Offline
419
#3

require('includes/application_top.php');

require(DIR_WS_CLASSES . 'order.php');
$order = new order;

и никаких $_GET .

Вывод :

Хоть VaM и молодец, но настоящие параноики не должны использовать его сборки.

RA
На сайте с 29.08.2007
Offline
88
#4
netwind:
и никаких $_GET .
Вывод :
Хоть VaM и молодец, но настоящие параноики не должны использовать его сборки.

Это точно :)

Один такой GET я уже где-то в другом файлике от Vam'а нашёл и исправил, этот файл ещё не успел проверить, только выше упомянутый баг пофиксил.

UPD. Невнимательно посмотрел.

Относительно конкретно этого GET'а. Как тогда смотреть квитанцию из истроии заказов, если в скрипт не будет передаваться переменная id?

N
На сайте с 06.05.2007
Offline
419
#5

Real Alex, в оригинале там вроде содержимое заказа берется из сессии. Естественно квитанция печатается только на текущую корзину. Если потребуется распечатать квитанцию на старый заказ, то уже никак не получится. Эту проблему Vam и исправил. К сожалению, не очень качественно.

RA
На сайте с 29.08.2007
Offline
88
#6

Понятно тогда...

Да уж, Vam исправил так исправил :) Вообще ошибка-то глупая, не проверять чей заказ.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий