-15% na nową książkę sekuraka: Wprowadzenie do bezpieczeństwa IT. Przy zamówieniu podaj kod: 10000

Magento – dostępny jest exploit. Przygotujcie się na szybkie przejmowanie konta admin.

29 marca 2019, 21:20 | W biegu | komentarze 4

Pisaliśmy niedawno ogólnie o nowo załatanej krytycznej luce w Magento. Przy okazji warto dodać kilka informacji o szczegółach problemu. W skrócie, za pomocą blind SQL injection można pobrać dowolną informację z bazy danych i nie wymaga to uwierzytelnienia. Dostępny jest nawet gotowy exploit, umożliwiający przejęcie konta zalogowanego administratora. Realizowane jest w nim takie zapytanie (czyli otrzymujemy ID sesji zalogowanego admina, nie ma nawet potrzeby łamania hasła):

session_timeout = 900
query = (
'SELECT %%s FROM admin_user_session '
'WHERE TIMESTAMPDIFF(SECOND, updated_at, NOW()) BETWEEN 0 AND %d '
'ORDER BY created_at DESC, updated_at DESC LIMIT 1'
) % session_timeout

Co ciekawe podatność występowała w funkcji, która teoretycznie ma na celu zabezpieczenie przed SQL injection. Problematyczne okazało się budowanie zapytania SQL w momencie jeśli użytkownik przesłał w parametrach pola from i to. Czyli np. realizował zapytanie o produkty, które mieszczą się w danym zakresie cen:

$db->prepareSqlCondition(’price’, [
'from’ => '100′
'to’ => '1000′
]);
$query = „price >= '100′ AND price <= '1000′”;

Jak widać, powyższa funkcja buduje ładne (tj. bezpieczne) fragmenty zapytań SQL. Ale co się stanie jeśli w jednej z wartości umieszczę znak pytajnika (tak jak na przykładzie poniżej?)

$db->prepareSqlCondition(’price’, [ ’from’ => ’x?’ ’to’ => ’ OR 1=1 — -’ ]); -> $query = „price >= 'x’ OR 1=1 — -” AND price <= ’ OR 1=1 — -'”

Uproszczając (dla jasności przekazu) całość jest realizowana w dwóch etapach.

Etap 1. obsługa operatora from. Po tym etapie mamy takie zapytanie:

price >= 'x?’ AND price <= ’?’

Etap 2. obsługa operatora to. Teraz wszystkie znaki zapytania zamienianie są na obłożone apostrofami wartości: OR 1=1 — –
Teoretycznie powinniśmy mieć jeden znak zapytania (w drugiej części zapytania, operator to), ale przecież wstrzyknęliśmy specjalnie w wartości x?. Finalnie mamy taki fragment zapytania z ewidentnym SQL injection:

price >= 'x’ OR 1=1 — -” AND price <= ’ OR 1=1 — -’

Informacja o exploicie pojawiła się już wielu, nawet względnie ’mainstreamowych’ mediach, warto więc załatać Magento ASAP.

–ms

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Tadek

    No dobra ale kto trzyma sesję w bazie danych? Chyba sklepy z pietruszką.
    No i jeszcze adres admina jest konfigurowalny.

    Odpowiedz

Odpowiedz na JonnyAktualizator