Aktywne Wpisy
![rzzz](https://wykop.pl/cdn/c0834752/c947753d79088c65535d38a04cda016830f41e59af67d5f5fae85b192af84b21,q60.jpg)
rzzz +114
Badanie z końcówki 2023.
Ponad 80% rodaków nie ma nawet 50 tys. złotych. Najprawdopodobniej znakomita większość z nich nigdy nie widziała takich pieniędzy na koncie.
Nie przeszkadza im to brać hipotek na 700k na dwa pokoje. Bo to fair price jest.
Jakby mick napisał, to nie jest śmieszne...
#nieruchomosci
Ponad 80% rodaków nie ma nawet 50 tys. złotych. Najprawdopodobniej znakomita większość z nich nigdy nie widziała takich pieniędzy na koncie.
Nie przeszkadza im to brać hipotek na 700k na dwa pokoje. Bo to fair price jest.
Jakby mick napisał, to nie jest śmieszne...
#nieruchomosci
![rzzz - Badanie z końcówki 2023.
Ponad 80% rodaków nie ma nawet 50 tys. złotych. Najp...](https://wykop.pl/cdn/c3201142/a4ce49a768e7f2b0694cdd079ab508e6ed2c9acfe01d748ffc8bdf501c4b4df6,w150.png?author=rzzz&auth=28a20a27c45bebfb875144d635f7d4b5)
źródło: s-640-x
PobierzZdradze wam przepis na spokojne i szczesliwe zycie w zwiazku - zone trzeba traktowac jak zone.
Nie wolno podchodzic do niej jak do rownego sobie, kobiety nie rozumieja wielu rzeczy, czesto kieruja sie emocjami a nie logika. Oczywiscie dziala to tez w druga strone, gdzie jest lepsza ode mnie w wielu aspektach ale dzisiaj nie o tym.
Mam 28lv, zona 26lv jestesmy malzenstwem od 3 lat, w zwiazku od 4. Od samego
Nie wolno podchodzic do niej jak do rownego sobie, kobiety nie rozumieja wielu rzeczy, czesto kieruja sie emocjami a nie logika. Oczywiscie dziala to tez w druga strone, gdzie jest lepsza ode mnie w wielu aspektach ale dzisiaj nie o tym.
Mam 28lv, zona 26lv jestesmy malzenstwem od 3 lat, w zwiazku od 4. Od samego
![KarmelowyJeremiasz - Zdradze wam przepis na spokojne i szczesliwe zycie w zwiazku - z...](https://wykop.pl/cdn/c3201142/04d9ccaefb6855530a47466c74114e4848c5cbc473554dd2194436b962674bce,w150.jpg?author=KarmelowyJeremiasz&auth=a9de7a090a8cc73b8ccb8265b345c2a3)
źródło: 3944163
Pobierz
Wczoraj wrzuciłem zagadkę hakerską, w której należało wejść na stronę podając odpowiednie hasło, mając nawet dostęp do źródła tej strony. W tym wpisie wyjaśnię dokładnie jak należało przeprowadzić "atak" i z czego to wynika.
Zanim przejdę konkretnie do treści zagadki, krótkie wprowadzenie do zachowania PHP w przypadku użycia operatorów
==
lub
!=
do porównywania. Jeżeli z użyciem tych operatorów są porównywane wartości typu
string
, które jednak wyglądają jak liczby to PHP wcześniej dokonuje zamiany tych wartości na liczb, a dopiero potem porównuje. Tak więc porównanie w postaci
('255' == '255')
powoduje, że oba stringi
'255'
są wpierw zamieniane na liczby, dopiero potem porównywane. Wydaje się to niegroźna cecha, ale zaczyna ona być problematyczna, gdy dokładnie przeanalizujemy co to znaczy, że ciągi znaków "wyglądają jak liczby". Otóż znaczy to, że także porównanie postaci
('255' == '0xff')
także zwraca wartość
TRUE
Jeszcze innym sposobem zapisu liczb jest notacja wykładnicza, np. zapis
4e35
jest jednoznaczny z
4*10^35
. Zauważamy jednak, że jeżeli cechą (czyli tą częścią zapisu przed "e") jest
0
, to niezależnie od tego co jest dalej, cała liczba też jest równa 0. A więc
0e345
to jest 0, podobnie jak np.
0e457
też jest równe 0. To powoduje, że następujące porównanie stringów w PHP też zwraca
true
:
('0e456' == '0e123')
.
Przejdźmy już teraz do samej zagadki. W kodzie źródłowym została zdefiniowana stała
SECRET_PASSPHRASE
o wartości
"Teg0!HasL4.Ni3_D4!Si3##ZgadnAc!!39720403"
. Dalej w kodzie brany jest pod uwagę hash md5 tej wartości, a konkretniej jego pierwszych 16 znaków. Ten hash to dokładnie
0000e468235440361a9ab73ca7c60018
, zaś biorąc jego pierwszą połowę uzyskujemy
0000e46823544036
. Czy coś wam to przypomina? No właśnie! Na początku mamy
0
, później
e
, a później wartość liczbową. A więc jeżeli znajdziemy inny string postaci (jako regex):
0+e[0-9]+
(co najmniej jedno "0", "e", co najmniej jedna cyfra) to (co wynika z tego o czym pisałem akapit wcześniej) dla PHP te stringi będą równe.
Znalezienie wartości, której hash będzie spełniał ten warunek nie jest zbyt skomplikowane. W zasadzie wystarczy brać po prostu kolejne wartości liczbowe i sprawdzać ich hasze. Napisałem prosty program w Pythonie, który błyskawicznie wyszukuje trzy wartości, których pierwsze 16 znaków hasza md5 jest w postaci
0+e[0-9]+
. Pierwszą z nich jest
"7554"
, której hash md5 wynosi
"0e16366727185813f59d4a9467878901"
, a pierwsza połowa tego hasha to
"0e16366727185813"
. Upewnijmy się jeszcze, że PHP faktycznie będzie myślał, że ta wartość jest równa pierwszej połowie hasza z
SECRET_PASSPHRASE
: (poniższe polecenie można po prostu wpisać w konsoli):
$ php -r 'var_dump("0e16366727185813" == "0000e46823544036");'
bool(true)
Może dla nas te stringi nie są takie same, ale dla PHP już tak :) Pozostaje więc tylko przejść na stronę Hakerium, wpisać w pole "7554" i cieszyć się z ukończenia zagadki.
Jak się bronić przed podobnym ryzykiem we własnych aplikacjach? Nie stosować operatorów
==/!=
tylko
===/!==
. Ta pierwsza para prawie nigdy nie jest dobrym rozwiązaniem, bo praktycznie zawsze chcemy porównywać wartości tego samego typu, a ta druga para nam to zapewnia. Sprawdźmy:
$ php -r 'var_dump("0e16366727185813" === "0000e46823544036");'
bool(false)
A więc tak jak powinno być :)
Jedyną osobą, której udało się zalogować był @koziolek i dla niego gratulacje :). Dla reszty, mam nadzieję, będzie to pouczająca lekcja i zaraz sprawdźcie czy wasz kod w PHP nie jest na taką przypadłość podatny ;-)
Jeśli macie jakieś pytania, śmiało pytajcie.
==
podam jego nieprzechodniość. Z matematyki wiemy, że jeśli spełniona jest równość a=b i a=c to z tego wynika, że b=c. Czy tak jest zawsze w PHP?
php > var_dump("wykop" == 0);
bool(true)
php > var_dump("wykop" == TRUE);
bool(true)
php > var_dump(0 == TRUE);
bool(false)