Ataki na sumy kontrolne, czyli dowolne zakupy za 0.01 PLN

W 2021 roku zespół Sequndant przeanalizował kilka popularnych mechanizmów polskiego e-commerce, identyfikując serię ciekawych podatności. Jedną z nich prezentujemy poniżej.

Zakupy w internecie związane są zwykle z przekierowaniem na stronę danego operatora płatności. Takie przekierowanie może wyglądać tak:

Tajemniczy parametr na końcu to suma kontrolna, dzięki której zapewniona jest integralność transakcji – te same dane wychodzą ze sklepu, docierają do operatora płatności i wracają znów do sklepu w „zwrotce” po ukończonej transakcji.

Jak budowana jest taka suma kontrolna? Czasem jest to po prostu hash (np. SHA-1) ze sklejonych ze sobą parametrów i tajnego klucza, np.:

czyli w praktyce:

Taka suma kontrolna może być niestety naruszona przez przesuwanie danych pomiędzy poszczególnymi parametrami. Na przykład, suma kontrolna jest taka sama dla:
123456 lukasz@sequndant.com 1001.00 Kowalski+Jan
jak i
123456 lukasz@sequndant.com100 1.00 Kowalski+Jan

Albo:
123456 lukasz@sequndant.com 1000.00 e-3Nowak+Agnieszka
jak i:
123456 lukasz@sequndant.com 1000.00e-3 Nowak+Agnieszka

Oznacza to, że jeśli masz na nazwisko powiedzmy e-3Nowak (masz, prawda? 😉 ), możesz zrobić zakupy 1000 razy taniej.

Podobny, nieco trudniejszy w realizacji atak można wykonać także, gdy interesujące nas parametry nie sąsiadują ze sobą.

W praktyce realizacja zakupów za 0.01 PLN wymaga, by sklep nie weryfikował w pełni tzw. „zwrotki”, m. in. kwoty transakcji, która została faktycznie wykonana. Ponieważ taka sytuacja się zdarza, operatorzy płatności korzystający z podatnych algorytmów sum kontrolnych wprowadzili w tym roku – po zgłoszeniu od Sequndant – odpowiednie poprawki.

Jak może przed podobnymi atakami bronić się sklep internetowy:

  • zawsze weryfikuj parametry zwrotki od operatora płatności, w tym kwotę
  • weryfikuj adres IP operatora płatności w zwrotce
  • aktualizuj kod integracji zgodnie z wymaganiami operatora płatności
  • wymagaj weryfikacji sumy kontrolnej, również w zwrotce

Jeśli tworzysz lub testujesz podobne sumy kontrolne, zwróć też uwagę na ataki hash length extension, niepodrabialność separatorów oraz długość klucza (minimum 16 znaków, zalecany jak najdłuższy).