Po dłuższej przerwie kolejne przykłady:
Zadanie jest proste - odczytać wiadomość o identyfikatorze 2161. W obu przypadkach ta wiadomość jest taka sama. Same przykłady są bardzo podobne do siebie, a cel można osiągnąć na kilka sposobów.
Powodzenia!
P.S. Inspiracją tego przykładu (jego części) jest jedno zdanie wypowiadane w tym filmiku. Które?
KOD: 08ac4aa54df006e9154c60e06b0d1bbb
SEKRET
Działania arytmetyczne na parametrze id wystarczają, aby dobrać się do wiadomości 2161. Ważne jest także to, że :
w c) jedna z wartości w działaniu arytmetycznym musi być równa 1,4,11 lub 12, a możliwe działania to mnożenie i odejmowanie. Stąd : 12*181-11 jest jednym z rozwiązań
w d) operandy operacji arytm.(-,*,/) są dowolne, z tym że wynik działania musi być równy : 1,4,11 lub 12 i jeśli tak jest brana jest pod uwagę pierwsza wartość z operacji. Stąd : 2161/2161 jest jednym z rozwiązań.
"Did you fuzzy it?"
A teraz do sedna - tak, rozwiązałeś zadanie na jeden z możliwych sposobów (SQLi), jest jeszcze drugi sposób.
Po drugie dozwolone są wszystkie operatory arytmetyczne, w tym +, przy czym ten znak musi być zakodowany (sam oznacza spację).
Nie, nie chodziło o to zdanie To ten drugi sposób był inspirowany tym filmikiem, choć w sumie to pytanie też można podciągnąć pod ten przykład
Kodowanie plusa przeoczyłem. Ale człek z natury leniwy to też gdy działa co innego, trzyma się tego uparcie.
Parametr p dosyć ciekawy. O ile dla wiadomości 1 i 2 można od razu wychwycić jak jest kodowana jego wartość, o tyle dla pozostałych dwóch pojedynczy = trochę psuje imprezę Po drobnej modyfikacji wejścia wychodzi na to, że mamy hash z hash'a zatem ... jakiś HMAC chyba wchodzi w grę.
"Use an HMAC not a hash" ?
md5('id=1') = 681afe34439cf1a3939f032f7bab1dde
oraz
base64 decode(p) D = 3}893bhf5564;dh2c4;4;g244g9ccc3eff
Odrzucając 3} między md5 a wartością p zachodzi zależność : md5[n*2] = D[n+1]-2 ; md5[n*2+1] = D[n*2+1]-1. Przy czym znak : reprezentuje liczbę 10, a ; liczbę 11.
Podobnie jest dla pozostałych id.
Nie udało mi się jednak wygenerować poprawnego p dla id=2161. Co to takiego 3} 6} itd...
Może jak będzie trochę czasu to jeszcze do tego przysiądę, a może ktoś inny będzie pierwszy
md5[n*2] = D[n*2]-2
md5[n*2+1] = D[n*2+1]-1
Podpowiem Ci, że kontrolujesz część tego, co wchodzi do postaci zakodowanej (parametr id), więc wykorzystaj to. Przecież potrafisz już zrobić SQLi, więc może będziesz wstanie kontrolować większy fragment zakodowanego tekstu i może wówczas sposób kodowania będzie bardziej oczywisty? A gwarantuje, że jest trywialny. Zresztą częściowo już to zauważyłeś więc...
3}893bhf5564;dh2c4;4;g244g9ccc3eff
id = 1 (3-2 = 1) potem separator }
a następnie tak jak wspomniałem nibble md5 zwiększone o 2 i 1 odpowiednio dla parzystych i nieparzystych znaków base64.
To dla potwierdzenia że manipulować parametrem p można. Jest to spowodowane brakiem potwierdzenia autentyczności wiadomości (mamy tylko zapewnioną integralność komunikatu dzięki md5). Brakuje zatem wmieszanego klucza tajnego i stworzenia dzięki niemu implementacji HMAC. Dopiero wtedy możemy uchronić się przed udanymi próbami manipulacji.