Właśnie zauważyłem, że w Operze poprawiono problem spacji w odnośnikach - są aktualnie wyświetlane na pasku stanu w postaci URL-encoded. Utrudnia to ukrycie przed użytkownikiem dodatkowych parametrów metodą, którą zastosowałem między innymi tutaj.
Mam nadzieję, że wkrótce również użytkownicy Firefoksa doczekają się podobnej zmiany.
www.gnucitizen.org/blog/firebug-goes-evil
Nie jest to pierwsza tego typu luka, i z całą pewnością nie ostatnia. Najostrożniejsi wyłączyli już w przeglądarkach wtyczki, teraz czas na rozszerzenia…
Aktualizacja: http://larholm.com/2007/04/06/more-0day-in-firebug/
Dwa dość interesujące odnośniki:
SQL, samochody i kłopoty z prawem
Hack.pl: za 200.000 zł nie napiszemy o Waszej luce w systemie
Wszystkie trzy zadania doczekały się poprawnej odpowiedzi. Zwycięzcą jest Michał Majchrowicz, części z Was zapewne znany z zainteresowania tematyką XSS.
Rozwiązania:
W pierwszym skrypcie błąd polega na użyciu operatora porównania bez kontroli typu przy porównywaniu liczby całkowitej i łańcucha znaków (warunek “1a”==1 ma wartość true). Metoda zabezpieczenia to rzutowanie parametru id na typ integer, lub porównanie z kontrolą typu. Trzeba przy tym pamiętać, że wszystkie dane w $_GET, $_POST, $_COOKIE itp. są zawsze typu string lub array.
Drugi przypadek to zastosowanie do filtrowania danych funkcji ereg(), która nie jest bezpieczna dla danych binarnych. Oznacza to, że bajt zerowy potraktuje jako koniec łańcucha. Do niezaufanych danych należy stosować funkcję preg_match().
Ostatni skrypt nie bierze pod uwagę błędu, jaki popełnili twórcy Internet Explorera 6. Ta przeglądarka w przypadku kodowania UTF-8 traktuje bajty powyżej 192 jako początek wielobajtowego znaku, niezależnie od tego, czy następny bajt jest faktycznie kontynuacją tego znaku. Dzięki temu można usunąć cudzysłów i spowodować, że tag nie zostanie zamknięty. Rozwiązaniem może być stosowanie htmlspecialchars()+ENT_QUOTES zamiast/oprócz strip_tags(), oraz usuwanie nieprawidłowych znaków UTF-8 przy pomocy $zmienna=mb_convert_encoding($zmienna,”UTF-8″,”UTF-8″). Wady tych rozwiązań:
- nawet stosując wszędzie htmlspecialchars()+ENT_QUOTES można być podatnym
- dodanie mb_convert_encoding() we wszystkich danych wyjściowych to sporo roboty; z kolei dodanie tej funkcji globalnie do wszystkich danych przychodzących to zabójstwo dla wydajności
Dodatkowo wszystkie trzy skrypty są podatne na ujawnienie ścieżki do pliku w komunikatach błędów, co słusznie zauważył jeden z uczestników.
Kilka luźnych wniosków:
Wszelkie komentarze oczywiście mile widziane.
Podpowiedzi w formie linków: do skryptu 2, do skryptu 3.
To nie jest primaaprilisowy dowcip ;)