Od ostatnich wersji Magento jest form_key
częścią akcji dodawania do koszyka, aby chronić przed atakami CSRF.
Zastanawiam się teraz, czy to naprawdę jest potrzebne w tym miejscu i dlaczego, a właściwie lepiej, przed jakim konkretnym scenariuszem powinien chronić.
magento-1.8
addtocart
security
csrf
Flyingmana
źródło
źródło
Odpowiedzi:
Uważam, że trudno będzie znaleźć ostateczną odpowiedź na to pytanie, dlaczego token CSRF jest „potrzebny” w akcji GET dodawania do koszyka Magento. Spróbuję zinterpretować jego cel. W żadnym wypadku nie jestem ekspertem od bezpieczeństwa i taka jest moja interpretacja CSRF w tym konkretnym kontekście.
Kontekst
Od owasp.org
Jednym z przykładów tego ataku jest osadzenie ukrytego obrazu w wiadomości e-mail lub na innej stronie internetowej:
Serwer internetowy nie rozróżniałby, skąd pochodzi żądanie, i wiernie dodawałby przedmiot do koszyka tego użytkownika.
Celem zapobiegania atakom CSRF jest zapobieganie żądaniom zmieniającym stan . Dodanie przedmiotu do koszyka będzie uważane za zmianę stanu. Ogólnie uważam, że jest to nieszkodliwa zmiana stanu w porównaniu ze złożeniem zamówienia, przekazaniem środków lub aktualizacją adresu e-mail.
Jeśli chodzi o zmiany stanu i metody HTTP, RFC 2616 mówi, co następuje:
Magento i CSRF
Magento implementuje mechanizm zapobiegania CSRF zarówno dla obszarów administracyjnych, jak i frontendowych za pomocą tokena (klucza formularza). Zakładam, że celem Magento, jako platformy przeznaczonej do budowania przez innych programistów, jest zabezpieczenie wszystkich żądań zmieniających stan. Powodem jest to, że nie mają pojęcia, co deweloperzy wdrażający lub rozszerzenia innych firm mogą przypadkowo ujawnić. Bezpieczniej jest zabezpieczyć wszystkie żądania zmieniające stan niż mieć coś ujawnionego przez moduł innej firmy i mieć zły PR dla platformy. Nie wiem, czy wszystkie żądania zmiany stanu są zabezpieczone przed atakami CSRF.
Należy zauważyć, że Magento nie zawsze używa klucza formularza do ochrony żądań zmieniających stan. Na przykład żądania Usuń z koszyka (
/checkout/cart/delete/id/{ID}
) i Usuń adres klienta (/customer/address/delete/id/{ID}
) to żądania GET, które przekazują identyfikator jednostki. Kontroler (lub modele) następnie zapewniają, że użytkownik jest uprawniony do usunięcia tych rekordów encji (zmiany stanu). Są to dwa przypadki, w których Magento nie stosuje się do RFC 2616 . Szczerze mówiąc, w niektórych przypadkach użycia może nie być to praktyczne lub konieczne.Wygląda na to, że kontrola klucza formularza w
Mage_Checkout_CartController::addAction
metodzie została dodana w wersji 1.8. Z informacji o wersji mamy następujące:Niestety, język jest niejasny, a słowo „mógł mieć” prowadzi mnie do przekonania, że wynikało to z wcześniejszego założenia: bezpiecznego żądania zmiany stanu. Może istnieć możliwość wysłania dodatkowych parametrów, które powodują pewne niezamierzone zachowanie:
/checkout/cart/add/product/337/email/[email protected]/password/l33tp4ssw0rd
Chodzi o to, że po dodaniu czegoś do koszyka pojawia się trochę kodu (rdzeń lub strona trzecia), który jest uruchamiany podczas dodawania do koszyka, np. Poprzez wysłanie zdarzenia.
Wydaje się mało prawdopodobne, aby taka luka istniała od razu po wyjęciu z pudełka, a gdyby tak się stało, można mieć nadzieję, że Magento lepiej poradziłby sobie z ujawnieniem szczegółów / ryzyka. Jednym z zagrożeń, które widziałem, jest to, że Magento ślepo przechowuje parametry żądania podczas dodawania do koszyka w
product_options
kolumnie tabeli pozycji zamówienia sprzedaży (patrzinfo_buyRequest
:). Teoretycznie ktoś może nakłonić grupę użytkowników do dodania elementów do koszyka za pomocą dziwnych parametrów zapytań, które zostaną zapisane wsales_flat_quote_item_option
tabeli, a ostatecznie wsales_flat_order_item
tabeli, jeśli będą oni również w stanie przekonać tych użytkowników do konwersji. W większości przypadków wydaje mi się to mało prawdopodobne.Dodaj do koszyka Kluczowe problemy
Jednym z głównych problemów, na jakie napotykają ludzie przy implementacji FPC i tokenach CSRF, jest to, że kończą się buforowaniem. Pierwszy klient, który ogrzewa pamięć podręczną, generuje token, a gdy drugi klient otrzyma HIT pamięci podręcznej, otrzymuje teraz stronę z tokenem pierwszego użytkownika. Podczas przesyłania formularza tokeny nie będą pasować.
Magento Enterprise używa symboli zastępczych do znajdowania / zastępowania kluczy formularzy na buforowanych stronach. Implementacje lakieru będą podobnie używać ESI wszędzie tam, gdzie używany jest klucz formularza.
Byłbym ciekawy, czy niektóre bardziej popularne rozszerzenia „Cart Cart” kończą sprawdzanie tokena CSRF podczas ich dodawania do koszyka.
Jedną z funkcji, w której kończę rezygnację z tokena CSRF dla akcji „dodaj do koszyka”, jest możliwość tworzenia linków „dodaj do koszyka” do użycia w wiadomościach e-mail lub innych witrynach internetowych (media społecznościowe). Czasami marketing chce, aby użytkownicy bezpośrednio dodawali produkt do koszyka i natychmiast przekierowywali go do koszyka lub do kasy. Nie można tego łatwo zrobić, jeśli wymagany jest token CSRF. Polecam to tylko wtedy, gdy czujesz się komfortowo na poziomie ryzyka i ufasz swojemu i dowolnemu kodowi strony trzeciej.
źródło
Zasady tworzenia stron internetowych mówią, że każda forma fałszowania żądań między witrynami (CSRF) lub skryptów między witrynami (XSS) jest niepożądana i należy jej zawsze unikać.
Co to znaczy? W przypadku CSRF nie możesz mieć żadnych adresów URL, które same mutują dane stanowe. W przeciwnym razie osoba atakująca może manipulować zawartością koszyka danej osoby lub dodawać / usuwać elementy z listy życzeń lub porównań, po prostu nakłaniając ich do kliknięcia lub odwiedzenia tego adresu URL (nawet przekierowania).
Klucze formularzy są sposobem na obejście tego. Magento generuje skrót, który jest specyficzny dla sesji i wymaga jego przesłania wraz z każdym żądaniem zmiany danych.
Czy dodawanie / usuwanie elementów koszyka jest wektorem poważnego ataku? Prawdopodobnie nie, w przypadku większości witryn. Ale mimo to CSRF, a CSRF jest zły. Dlatego są
form_key
teraz wartości (od CE 1.8).źródło