PrestaShop i ciekawy bug pozwalający wyciągnąć dane klientów i nie tylko (PSCSX-8871)

Jakiś czas temu postanowiłem się przyjrzeć nieco, w kontekście błędów i bezpieczeństwa popularnemu silnikowi e-commerce PrestaShop.

Po pobieżnym przejrzeniu dispatcher`a, silnika zarządzania modułami i innymi bardziej zaawansowanym mechanizmom od niechcenia rzuciłem okiem na bardzo prostą funkcjonalność jaką jest ponowienia zamówienia. Pomyślałem że tak prosta mechanika (na liście zamówień pozwala ponowić wybrane zamówienie) nie ma szans posiadać żadnej luki, jakie było moje zdziwienie kiedy okazało się że jest inaczej...

Wywołanie w pliku /controllers/front/ParentOrderController.php:80 wygląda tak:

if (Tools::isSubmit('submitReorder') && $id_order = (int)Tools::getValue('id_order')) {
    $oldCart = new Cart(Order::getCartIdStatic($id_order, $this->context->customer->id));
    $duplication = $oldCart->duplicate();
    ...
}

czyli sprawdza czy mamy zmienną $_GET "id_order" i jeśli tak ładujemy koszyk z zamówienia metodą Order::getCartIdStatic która przyjmuje dwa argumenty czyli:

  • ID zamówienia
  • ID obecnie zalogowanego klienta

Każdy pentester zapewne pierwsze co zrobi to spróbuje zmienić zmienną w adresie URL id_order na  ID zamówienia innego klienta 🙂 i ja tak zrobiłem ale bez oczekiwanego rezultatu - wszystko działa jak należy.

W zasadzie już chciałem odpuścić ale zajrzałem jeszcze do rzeczonej metody Order::getCartIdStatic i co zobaczyłem:

/**
 * @param int $id_order
 * @param int $id_customer optionnal
 * @return int id_cart
 */
public static function getCartIdStatic($id_order, $id_customer = 0)
{
    return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
		SELECT `id_cart`
		FROM `'._DB_PREFIX_.'orders`
		WHERE `id_order` = '.(int)$id_order.'
		'.($id_customer ? 'AND `id_customer` = '.(int)$id_customer : ''));
}

Zmienna "id_customer " którą metoda przyjmuje jest opcjonalna, więc wystarczy się wylogować i przejść pod adres  http://localhost/index.php?controller=order&submitReorder=&id_order=X (gdzie X to ID dowolnego zamówienia) aby załadować koszyk klienta a co z tym idzie:

  • Adres dostawy (tylko PS 1.4-1.6)
  • Adres do rachunku (tylko PS 1.4-1.6)
  • Dostosowania (pliki ładowane podczas składania zamówienia)
  • Zawartość koszyka

Luka nie jest może jakaś spektakularna ale błąd jest ciekawy i występuje praktycznie od pierwszych wydań PrestaShop (1.4x 2011r.) aż do najnowszej wersji 1.7x (2017r.).

Błąd jest eksploitowalny w domyślnej konfiguracji procesu realizacji zamówienia  - 5 kroków - która nie jest jednak najpopularniejsza, większość osòb korzysta z "One page checkout". Jednak wyciek danych klientów i informacjach o ich zamówieniach w niektórych branżach może być dotkliwy. Błąd jest już naprawiony na wersjach PrestaShop 1.6-1.7 więc zalecam aktualizację.

Dodatkowe info:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *