Archiwum kategorii ‘Zabezpieczenia’

Nadpisywanie wbudowanych protokołów PHP własnym wrapperem strumienia

piątek, 15 Kwiecień 2011

Po ostatnich, dosyć wyczerpujących artykułach na temat silnego typowania danych, oraz autentykacji NTLM poprzez atak man-in-the-middle, postanowiłem przedstawić coś znacznie lżejszego.

Nieraz podczas pisania aplikacji natrafiałem na zabezpieczenia w stylu „system plików jest w trybie: tylko do odczytu, PHP ma prawa zapisu wyłącznie w bazie danych”. Jest to oczywiście skrajny przypadek zabezpieczeń przed hackerami, jednak w moim przypadku zdarzający się dosyć nagminnie. W tak zabezpieczonym środowisku pojawiają się więc dosyć nietypowe problemy z funkcjami wbudowanymi w PHP, gdyż niektóre z nich wymagają praw zapisu do katalogów na dysku lokalnym (upload plików, cache WSDL, biblioteka cURL), lub odczytu z plików (np. SoapClient nie potrafi odczytać treści WSDL bezpośrednio ze zmiennej, lecz tylko poprzez protokół HTTP lub z pliku lokalnego).

Opiszę więc krótko mało znane i dosyć egzotyczne obejście tych problemów: nadpisywanie wbudowanych w PHP protokołów własnymi. (więcej…)

Uwierzytelnianie NTLM i Single Sign On: czyli jak w PHP zalogować się do ActiveDirectory bez znajomości loginu i hasła

czwartek, 14 Kwiecień 2011

Przeglądając gotowe biblioteki PHP do uwierzytelniania w domenie ActiveDirectory zauważyłem, że żadne z tych rozwiązań nie pozwala na zalogowanie użytkownika domenowego bez konieczności podania przez niego loginu i hasła.

Funkcjonalność automatycznego logowania do domeny wbudowana jest oczywiście tylko w w przeglądarce Internet Explorer, ale powiedzmy sobie szczerze: w dużych firmach i korporacjach jest to nadal jedyna słuszna aplikacja do surfowania po Int(ra|er)necie.

Co ciekawe, w innych językach programowania (Java, C#) nie ma najmniejszego problemu, by użytkownik domenowy mógł wejść poprzez Internet Explorer do chronionego serwisu, istnieje tam wiele gotowych rozwiązań operujących na uwierzytelnianiu NTLM.

Po dwóch dniach spędzonych na czytaniu dokumentacji Microsoftu, Samby, oraz po sniffingu sieciowym, udało mi się zaimplementować działające rozwiązanie.

W niniejszym artykule postaram się przybliżyć schemat automatycznego logowania skryptów PHP do domeny ActiveDirectory za pomocą… ataku Man-in-the-middle. (więcej…)

Silne typowanie danych w PHP, część II: autoboxing oraz niezniszczalne obiekty

wtorek, 12 Kwiecień 2011

We wcześniejszym artykule dotyczącym silnego typowania opisałem mechanizm typehintów, który wymusza zgodność typów danych (także nie będących obiektami) przekazywanych do metod i funkcji. Niestety wspomniana implementacja nie zabezpiecza przed innym problemem związanym z dynamicznym typowaniem zmiennych: brakiem kontroli typu podczas nadpisywania wartości zmiennych.

W celu zapewnienia kontroli typu, postanowiłem wprowadzić do języka PHP pojęcie autoboxingu znanego z języków C#, oraz Java. (więcej…)

UTF-8 i zła walidacja tekstu

poniedziałek, 11 Kwiecień 2011

Jak dobrze wiadomo, słabą stroną języka PHP jest między innymi wsparcie dla bardzo popularnego w dzisiejszych czasach kodowania znaków w UTF-8. O ile w wersji 5.3 pojawiła się biblioteka ext/intl, to jednak większość istniejących mechanizmów walidacji tekstu opiera się wyłącznie na regułkach zapisanych w postaci wyrażeń regularnych. Mechanizm ten jest bardzo wygodny, lecz w przypadku znaków spoza alfabetu łacińskiego nie zawsze działa tak, jak programista to przewidział.

W skrajnych przypadkach użycie wyrażeń regularnych prowadzi to do bardzo ciekawych skutków ubocznych, które mogą negatywnie wpłynąć na bezpieczeństwo serwisu internetowego. (więcej…)

Ciasteczka HttpOnly oraz Secure, czyli zabezpieczenia których nie ma

czwartek, 7 Kwiecień 2011

Zgodnie z dokumentacją Microsoftu flaga HttpOnly przesłana w nagłówku HTTP Set-Cookie sprawia, że w przeglądarkach WWW obsługujących ten mechanizm skrypty JavaScript nie są w stanie odczytywać, ani modyfikować zawartości ciasteczka którego ten parametr dotyczył.

Podobnie działa mechanizm Secure, z tym że nie ukrywa on danych przed skryptami JS, lecz dotyczy rodzaju połączenia, przez które przesyłane jest ciasteczko. Jeśli zostało ono ustawione jako bezpieczne, przeglądarka WWW wyśle je do serwera jedynie wtedy, gdy połączenie jest szyfrowane (HTTPS).

Poniżej prezentuję prosty przykład w języku JavaScript łamiący częściowo te zabezpieczenia. (więcej…)

Shared hosting: wykradanie ciasteczek HTTP

czwartek, 7 Kwiecień 2011

  click here to see different articles in english

Serwery typu shared web hosting posiadają jedną wielką zaletę, w przeciwieństwie do serwerów dedykowanych założenie konta jest na nich bardzo tanie. Pozwala to na szybkie i bezproblemowe założenie niewielkiej strony internetowej, małego sklepu, czy też własnego portfolio bez większych nakładów finansowych.

Wiadomo jednak, że serwery te posiadają też i swoje mroczne strony, związane szczególnie z bezpieczeństwem.

W tym artykule skupię się na jednym z mniej znanych luk bezpieczeństwa – na wykradaniu ciasteczek HTTP pomiędzy różnymi kontami na tym samym serwerze. (więcej…)

Pilnuj kodu swego…

piątek, 1 Kwiecień 2011

Black hatWpis ten dotyczy programistów, którzy w nazewnictwie własnych plików wyznają zasadę, że biblioteki PHP powinny nosić rozszerzenie *.php.inc, oraz osób, które z sobie tylko znanych powodów stosują inne warianty rozszerzeń (np. *.inc, *.asp lub *.phtml).

Choć moda na takie nazewnictwo przeminęła wiele lat temu wraz z niektórymi książkami uczącymi języka PHP, okazuje się jednak, że jest to nadal często spotykany proceder w Internecie.

Niestety jest to także jeden z podstawowych i najgroźniejszych błędów bezpieczeństwa. (więcej…)

Jak obejść limit przestrzeni dyskowej na koncie WWW

czwartek, 24 Marzec 2011

Przy wyborze serwera hostingowego pod nową stronę WWW jednym z głównych czynników decydujących „za” lub „przeciw” jest limit dostępnej przestrzeni dyskowej.

Chociaż w dzisiejszych czasach większość firm na rynku prześciga się między sobą w ilości oferowanych gigabajtów (tak dostępnego transferu, jak i powierzchni), zademonstruję, jak te limity obejść całkowicie (lecz krótkoterminowo). (więcej…)

Silne typowanie danych w PHP, część I

środa, 23 Marzec 2011

Logo PHPW wielu dyskusjach porównawczych pomiędzy programistami różnych języków programowania często pojawia się zarzut w stylu „a u was w PHP nie ma silnego typowania danych!”.

Czy aby na pewno?

Okazuje się jednak, że w PHP można zaimplementować mechanizm silnego typowania danych znany z takich języków jak C, C++, C#, Java… (więcej…)

Oszukać przeznaczenie, czyli łamanie SAFE_MODE oraz max_execution_time

środa, 23 Marzec 2011

Większość programistów PHP choć raz w swoim życiu spotkało się z takimi terminami jak SAFE_MODE oraz limitem czasowym wykonywania programu w PHP (domyślnie 30 sekund).

O ile obie te rzeczy można łatwo wyłączyć, gdy pracuje się na serwerze dedykowanym lub w środowisku wewnętrznym firmy, to na hostingach współdzielonych obie te rzeczy potrafią przyprawić o ból głowy, wyłączając skrypt (np. migrujący dużą ilość danych) w trakcie jego wykonywania.

W tym artykule przedstawię prostą metodę na obejście tego zabezpieczenia. (więcej…)

Limitowanie prędkości przesyłu plików w PHP

wtorek, 22 Marzec 2011

MiniaturkaPracując w sektorze hostingowym często spotykam się z potrzebą kontroli użycia łącza ze światem. Jako że łącza nie są z gumy i mają swoje fizyczne/ekonomiczne ograniczenia, w przeszłości niejednokrotnie musiałem przycinać maksymalne pasmo użytkownikom przy pomocy gotowych modułów do Apacha, lub niskopoziomowych mechanizmów wbudowanych w system operacyjny.

Co jednak jeśli użytkownik sam sobie chce zmniejszyć lub zwiększyć szerokość pasma do celów np działu download na swojej stronie?

Na shared hostingu nie jest w stanie tego osiągnąć, gdyż nie istnieją takie serwery, gdzie można sobie taki parametr regulować. Z tego też powodu postanowiłem napisać kod PHP symulujący tą funkcjonalność (więcej…)