O tym, że identyfikatory globalne są ZŁE pisałem wielokrotnie, ostatnio przy okazji luki w systemie rejestracji UJ. Udostępniam więc prosty przykład pokazujący różnicę między identyfikatorem globalnym a lokalnym (pośrednim): Identyfikatory globalne i lokalne (pośrednie).
Bootcamp: identyfikatory globalne i lokalne (pośrednie)
Zadanie jest proste, wystarczy przeczytać (opcjonalnie usunąć) wiadomości innych użytkowników. Oczywiście tu nie ma użytkowników, ale wiadomości oznaczone są identyfikatorem właściciela, który zresztą jest wyświetlany w wiadomości. Jak to zrobić w przypadku identyfikatorów globalnych? Jaka jest różnica w stosunku do analogicznego przykładu z wcześniejszych lekcji? Co się zmieni w przypadku włączenia identyfikatorów lokalnych?
I pytanie dodatkowe - jaka nowa podatność pojawia się w przypadku wykorzystania identyfikatorów lokalnych? Nie jest to całkiem nowa podatność, w przypadku wykorzystania identyfikatorów globalnych też istniała, ale jej wykorzystanie jest wówczas nieco trudniejsze.
Mam pytanie co do tej nowej podatności, ponieważ szukam i znaleźć nie mogę... Możesz mi udzielić jakiejś podpowiedzi?
Jak się takie identyfikatory tworzy? Po prostu przy pierwszym gecie stronka nadaje takie identyfikatory (które później są w cookies) i od tej pory czeka sobie tylko na nie? Sprawdziłem, że dla każdego innego identyfikatora wyświetla ostatnio pobraną poprawnie wiadomość, czyli ma gdzieś sobie zapisane że np. id=1 to tak naprawde 2105643784 ( tak dalej) i jeśli poda się cokolwiek innego to serwer to olewa? Jak to właściwie działa?
W chwili obsługi żądania następuje tłumaczenie na identyfikator globalny. Jest ono z oczywistych przyczyn możliwe do wykonania wyłącznie wtedy, gdy takie mapowanie istnieje. Dostęp do cudzych danych będzie wówczas niemożliwy (brak mapowania).
O ile mnie pamięć nie myli w tym konkretnym przypadku identyfikator obiektu jest zapisany w sesji i jeśli nie ma prawidłowego mapowania, to po prostu jest wykorzystywana ostatnia prawidłowa zapisana wartość.
A jeśli chodzi o podatność, to będzie to CSRF. Wcześniej atakujący nie znał identyfikatora wiadomości ofiary, więc atak był trudniejszy (musiał np. przeszukać dużą przestrzeń identyfikatorów lub w jakiś inny sposób ją ograniczyć). Wprowadzenie identyfikatora lokalnego znacznie atak ułatwia.
Mam pytanko: jak można w tym przykładzie wrzucić taki kod ofierze? W tej chwili po prostu modyfikowałem sobie w Fiddlerze response jaki ma wrócić i rzeczywiście sztuczka działa, jednocześnie w "praktyce" to raczej nie będę miał dostępu do ruchu między ofiarą a serwerem, dlatego dobrze byłoby umieć na stałe coś tam wrzucić .
Jak coś takiego w tym przypadku zrobić? W Lekcji 4 i 5 było łatwiutko, ponieważ mieliśmy kontrolkę która wstawiała na formularz, tutaj już tak łatwo nie jest... Więc jak? Da się?
Bo jak rozumiem, te identyfikatory mogą się powtarzać dla różnych ownerów?
Jeśli tak, to skądś system musi wiedzieć z którym ownerem ma do czynienia (właśnie, jak to robi? Ciasteczkiem?).