Łukasz Pilorz
msgbartop
Bezpieczeństwo aplikacji PHP
msgbarbottom

12 Apr 07 Spacje w odnośnikach

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.

05 Apr 07 Uwaga na rozszerzenia do Firefoksa

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/

03 Apr 07 Okup za lukę

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

 

01 Apr 07 XSS-hackme: zwycięzca i rozwiązania

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:

  • Nawet programista w pełni świadomy zagrożenia płynącego ze strony XSS może popełnić błąd. Wszystkie trzy powyższe skrypty są pozornie zabezpieczone, ale żadne z tych zabezpieczeń nie jest pełne
  • Błąd Internet Explorera pokazany w trzecim skrypcie, podobnie jak luka mhtml-redirect, stawia moim zdaniem pod znakiem zapytania sens zabezpieczania wszystkich użytkowników przed XSS. Jak daleko Waszym zdaniem powinien się posunąć programista zabezpieczając aplikację, skoro co kilka miesięcy okazuje się, że powinien jeszcze raz przebudować dotychczasowy kod, bo jakaś dawno zapomniana przez niego (ale nie przez użytkowników) przeglądarka zachowuje się inaczej niż powinna?
  • Wszystkie mechanizmy filtrujące/czyszczące kod powinny być umieszczone w osobnych funkcjach, które umożliwią póżniejszą modyfikację. Nawet jeśli stosujesz tylko htmlspecialchars(), wrzuć je do zdefiniowanej przez siebie funkcji, i nie wykorzystuj htmlspecialchars() bezpośrednio. W ten sposób, jeśli ktoś znajdzie kolejną lukę w jakiejś przeglądarce, zmienisz w mechanizmie obronnym tylko jedną linię kodu.
  • Człowiek uczy się całe życie.

Wszelkie komentarze oczywiście mile widziane.

01 Apr 07 XSS-hackme: pierwsze podpowiedzi

Podpowiedzi w formie linków: do skryptu 2, do skryptu 3.

To nie jest primaaprilisowy dowcip ;)