Session Fixation

Wpis napisany 29 lutego 2008 w kategoriach: PHP/MySQL, Security, Techblog, Wszystkie | 18:24:29 | 7 komentarzy

W dzisiejszym artykule opiszę jeden z groźniejszych ataków na aplikacje PHP. Jest nim Session Fixation. W PHP istnieje mechanizm, zwany mechanizmem sesji. Istnieje po to, aby możliwe było jednoznaczne określenie unikalnego użytkownika odwiedzającego naszą stronę w danym czasie. Jak to zazwyczaj bywa, nic nie jest idealne.

Czytaj dalej »

Directory Traversal oraz RFI (Remote File Inclusion)

Wpis napisany 22 lutego 2008 w kategoriach: PHP/MySQL, Security, Techblog, Wszystkie | 19:27:21 | 7 komentarzy

W każdym systemie operacyjnym istnieje coś takiego jak drzewo katalogów. W nich umieszczone są pliki. W tym także i nasze skrypty. Często zdarza się, że wczytujemy z tego drzewa różne pliki przy pomocy PHP. Możemy je edytować, zapisywać, usuwać lub po prostu wczytywać do wykonania. Czasem zdarza się, że na podstawie różnych danych ustalamy co wczytać lub zapisać.

W takiej sytuacji pobieramy dane od użytkownika, łączymy z jakimś ciągiem znaków i wywołujemy skrypt. I tutaj błąd! Nigdy nie należy ufać danym przesłanym przez użytkownika. Postaram się wytłumaczyć zasadę działania całego błędu na przykładzie prostego skryptu wczytującego odpowiednie moduły:

<?php
function getModule($sModuleName)
{
        require_once($sModuleName.'.php');
        $module = new $sModuleName;
        return $module;
}

getModule($_GET['module']);
?>

Wydawałoby się, że wszystko jest w porządku. Nasz mały skrypt pobiera nazwę modułu, wczytuje plik z klasą i tworzy obiekt tej klasy. Jednak nie wszystko jest w porządku. Co się stanie w przypadku, gdy ktoś o złych zamiarach, zamiast zwykłego parametru poda coś w stylu „http://example.com/somebadscript”? Przypadkiem wczytamy plik z zewnętrznego serwera, a następnie wykonamy z niego kod. Teraz atakujący ma pełną władzę nad tym, co dzieje się w skrypcie, posiada dostęp do naszego połączenia z bazą danych... Jeden błąd, a tak tragiczny w skutkach!

Zacznijmy zabezpieczać. Na początek ograniczmy dostęp do folderów spoza naszego serwera. Jak to zrobić? Bardzo proste. Dwie najlepsze metody to wyłączenie w php.ini dyrektywy allow_url_include oraz dodanie przed ścieżką do pliku odwołania do lokalnego katalogu. Warto wykonać obydwie te czynności, jednak wystarczy właściwie zmienić skrypt w sposób pokazany poniżej:

<?php
function getModule($sModuleName)
{
        require_once('./'.$sModuleName);
        $module = new $sModuleName;
        return $module;
}

getModule($_GET['module']);
?>

Od tej pory nie wykonamy już żadnego zewnętrznego skryptu. Jednak dziura nadal istnieje! Atakujący nadal posiada dostęp do wszystkich plików na naszym serwerze... Dlaczego? Przecież może podać ścieżkę do katalogu nadrzędnego! Wczytajmy sobie teraz /etc/passwd:

GET script.php?module=../.../../../etc/passwd

Skutek po raz kolejny okazuje się opłakany. Treść naszego /etc/passwd zostaje przekazana atakującemu. W ten sposób można dostać się do niemal każdego pliku w systemie (szczególnie narażony jest Windows, który dość kiepsko radzi sobie z uprawnieniami – nie wiem jak to wygląda w wersji serwerowej). Kontynuujmy zatem łatanie naszego skryptu. Musimy się zastanowić, co tak naprawdę pozwala atakującemu na podglądanie naszych plików. Odpowiedź jest bardzo prosta. Aby dostać się do pliku wystarczyło odwołać się do nadrzędnego katalogu. Zrobienie tego polegało na użyciu ciągu znaków "../" w parametrze zapytania.

Kontynuujmy więc łatanie naszego skryptu. W PHP istnieje bardzo przyjemna funkcja basename(), która pozwala na ograniczenie dostępu do pojedynczego pliku z lokalnego katalogu. Jak działa? Usuwa po prostu wszystkie dane o katalogach url'ach z parametru i zwraca taką okrojoną nazwę. Wykorzystajmy to:

<?php
function getModule($sModuleName)
{
        require_once('./modules/'.basename($sModuleName).'.php');
        $module = new $sModuleName;
        return $module;
}

getModule($_GET['module']);
?>

W ten sposób zabezpieczony skrypt pozwoli na wczytanie plików tylko z katalogu modules. Nie ma możliwości „wyjścia z katalogu” przy pomocy directory traversal. Istnieją oczywiście inne metody zabezpieczania się przed tym atakiem. Jednym z nich jest używanie instrukcji warunkowej dla każdego modułu lub sprawdzanie występowania nazwy danego modułu w z góry zdefiniowanej tablicy modułów.

Pokazałem jedynie dwa przykłady z całej listy możliwości ataku. Należy pamiętać, że dane od użytkownika to nie tylko tablice $_GET i $_POST. Więcej na ten temat z pewnością umieszczę na blogu w oddzielnym wpisie. Poza tym należy szczególnie uważać podczas stosowania także takich funkcji jak fopen(), file() czy unlink(). Na zakończenie warto podsumować zdobyte informacje.

RFI (Remote File Inclusion) to błąd polegający na wczytaniu zewnętrznego pliku z serwera atakującego i wykonaniu go. Sposób na zabezpieczenie skryptu jest banalny, wystarczy wszystkie nazwy plików filtrować dzięki funkcji basename(). Jeżeli w ogóle nie potrzebujemy wczytywania plików PHP z zewnętrznych domen, możemy ustawić dyrektywę php.ini allow_url_include na false.

Directory Traversal to błąd pozwalający atakującemu na modyfikację lub wczytywanie pliku spoza dozwolonych. Polega na wykorzystaniu znaków powrotu do poprzedniego katalogu lub przejścia do katalogów podrzędnych w adresie pliku do wczytania.

Jakie jeszcze znacie metody użycia Directory Traversal? Spotkaliście się kiedyś z tego typu błędami w jakichś serwisach? A może sami go popełniliście/popełnialiście?

PS: Dodałem trackback do wpisu BTM'a o RFI.

CodeCup.pl - zadanie 14

Wpis napisany 22 lutego 2008 w kategoriach: CodeCup.pl, PHP/MySQL, Wszystkie | 18:45:08 | Dodaj komentarz

Na CodeCup.pl niedawno zakończyło się kolejne zadanie. Z tej okazji publikuję treść mojego kodziwa razem z porcją komentarza. Od niedawna punkty dostaje się nie tylko za samo rozwiązanie, ale także i za pomysł/jakość kodu. Tym razem postawiłem na pomysł. Zresztą, sami zobaczcie:

Czytaj dalej »

Moje przemyślenia na temat Linuksa

Wpis napisany 19 lutego 2008 w kategoriach: Linux, Techblog, Wszystkie | 21:47:03 | 38 komentarzy

Wiele osób Linuksa używa na co dzień. Jednak nie jest ich tak wiele, pomimo że to świetny system operacyjny, który daje wszystko, czego może potrzebować przeciętny użytkownik. W tym wpisie chciałbym podzielić się moimi uwagami i spostrzeżeniami jako user z rocznym stażem.

Czytaj dalej »

Jubileusz

Wpis napisany 19 lutego 2008 w kategoriach: Blog, Wszystkie | 21:24:47 | 2 komentarze

Dzisiaj mija rok, jak na tym blogu pojawił się pierwszy wpis. Z tej okazji chciałem podzielić się moimi spostrzeżeniami oraz napisać, co u mnie zmieniło się od tego czasu...

Po pierwsze, najwyższa pora ocenić Joggera. Pozytywnie :). Ta platforma blogowa daje doskonałe możliwości rozreklamowania bloga, a społeczność całkiem zgrana. Ciągły rozwój powoduje, że do tej pory zadziwiony jestem możliwościami... Do komentowania poprzez Jabbera tak się przyzwyczaiłem, że nie wyobrażam sobie bez tego życia. Jedyny brak, jaki dostrzegam, to brak zapisywania nowego wpisu co kilkanaście sekund poprzez AJAX (wiem że zostało zgłoszone, ale ostatni wpis pisałem trzy razy...).

Co u mnie zmieniło się od założenia tego bloga? Myślę, że dość spore są te zmiany. Po pierwsze, rozpocząłem naukę w Liceum. Wybrałem 2 Liceum Ogólnokształcące im. Hetmana Jana Zamoyskiego. Świetna atmosfera i luzacki tryb nauki powoduje, że jest to jedne z najlepszych liceów w tym mieście (co wcale nie oznacza niskiego poziomu nauczania - jeden z najwyższych takowoż :>). Dalej sprawiłem sobie nowy sprzęt, którym nie zdążyłem się pochwalić... Stary AMD K6 poszedł na złom, moje problemy z komputerem wreszcie się skończyły. Poza tym na dobre przerzuciłem się na Linuksa. Obecnie działam na Arch'u, który zachwyca mnie prostotą konfiguracji i szybkością działania :).

Nauczyłem się w znacznym stopniu jQuery oraz JS. Zwiększyłem także swoją znajomość PHP. Wkrótce planuję rozpocząć naukę C++/D oraz Pythona lub Ruby/RoR. Plany ambitne, co z tego wyjdzie - zobaczymy. W czasie ostatniego roku brałem udziwał w tworzeniu gry MMORPG o nazwie Orodlin. Więcej na ten temat napiszę z pewnością wkrótce.

Co z blogiem? Plany są wielkie. Wiem, że zaniedbywałem dość często pisanie i pomimo wiecznego braku czasu chciałbym to naprawić. W przygotowaniu jest nowy design i dwa wpisy na tematy, które są mi obecnie bliskie. Zamierzam rozpocząć serię artykułów na temat MySQL w ramach douczania oraz dokończyć tą o atakach PHP.

Na koniec nieco statystyk:

  1. W ciągu tego roku odwiedziło mnie 6.506 użytkowników, 8.609 razy, generując 12.951 odsłon
  2. Na blogu znajduje się 39 wpisów i 339 komentarzy
  3. 58,6% odwiedzin odbyło się za pomocą przeglądarki Firefox
  4. Najwięcej wejść na bloga nastąpiło z wykop.pl i reduser.net
  5. Dwa najczęstsze słowa kluczowe to "ataki php" oraz "sql injection"
  6. Najpopularniejszym wpisem na blogu jest "Najpopularniejsze ataki w PHP", zaraz za nim "SQL Injection"

To na tyle, dzięki wam wszystkim za ten rok i życzcie udanego przyszłego roku :).

Jakość kodu

Wpis napisany 17 lutego 2008 w kategoriach: Internet, Wszystkie | 22:06:18 | 5 komentarzy

Znalezione na wykopie (tak, poza flejmami nadal coś tam jest :>). Jedyny prawidłowy sposób oceny jakości kodu - WTF'y/minutę. Ile razy wyrwało wam się przysłowiowe WTF, gdy patrzyliście na kod sprzed roku?

code quality comics image

Ajax i jQuery - problem z cache

Wpis napisany 15 lutego 2008 w kategoriach: (x)HTML/CSS, Techblog, Wszystkie | 12:50:35 | 2 komentarze

Od dość dawna używam jQuery do tworzenia interaktywnych stron. Jak do tej pory udało mi się poznać je dość dobrze, problemy pojawiały się i znikały. Dzisiaj jednak natknąłem się na coś, co wprowadziło mnie w ogromne zdziwienie.

Czytaj dalej »

CodeCup.pl

Wpis napisany 14 lutego 2008 w kategoriach: CodeCup.pl, PHP/MySQL, Wszystkie | 21:28:28 | 6 komentarzy

Ostatnio trafiłem na bardzo ciekawą stronę, na której odbywa się, jeżeli można to tak nazwać turniej PHP. Z samym PHP nie ma aż tak wiele do czynienia, jednak sprawdza znajomość algorytmiki oraz podstawowych funkcji PHP. Pewien problem leży w tym, że nie jest on zbyt popularny, co chciałbym zmienić (ech, sam sobie konkurencję produkuję). Zadania są naprawdę ciekawe i dają do myślenia. Poza tym pomagają w nauce PHP i dają mobilizację do czytania manuala. Naprawdę warto!

Ze swojej strony będę publikował moje rozwiązania po zakończeniu się każdego zadania. Chętnie poznam opinie o moim stylu i zobaczę wasze kodziwa. Treści zadań można sprawdzić na stronie cudecup.pl. Oto moje pierwsze dwa twory:

Czytaj dalej »

Google Reader po polsku!

Wpis napisany 14 lutego 2008 w kategoriach: Internet, Techblog, Wszystkie | 15:38:48 | 21 komentarzy

Od bardzo długiego czasu używam Google Readera do czytania swoich RSS'ów. Dzisiaj z rana jak zwykle dzień zacząłem od czytania wpisów z mojej listy. W pewnym momencie natknąłem się na wpis Tomasza Topy, który zauważył, że GReader został przetłumaczony na język polski.

Czytaj dalej »

Filozje cz. 1 - postrzeganie drugiego człowieka

Wpis napisany 07 lutego 2008 w kategoriach: Filozje, Osobiste, Szkoła, Wszystkie | 15:15:05 | 2 komentarze

Tym wpisem chciałbym zapoczątkować jakąś dłuższą serię, która będzie mówiła o moim postrzeganiu świata. Można je potraktować jako możliwie jak najbardziej obiektywne filozje młodego człowieka, który sam sobie zadaje pytanie dokąd tak naprawdę ten świat zmierza.

Dzisiaj podczas powrotu ze szkoły naszła mnie dość ciekawa myśl. Dokładniej, zacząłem się zastanawiać nad tym jak postrzegam innych ludzi i jak oni postrzegają mnie. Oczywiste jest, że mój punkt widzenia na dzień dobry musimy potraktować jako zupełnie subiektywny. Jak każdy inny człowiek chciałbym postrzegać siebie w możliwie najlepszym świetla. Z drugiej strony natomiast obawiam się, aby ocena nie była negatywna. To jasne.

A teraz spójrzmy na zachowanie się dzisiejszego społeczeństwa jako ogółu. Z jednej strony panuje wielka moda na "wyróżnianie się". Z drugiej strony chroniczny lęk przed brakiem akceptacji ze strony drugiego człowieka i własnej odmienności.

Kto kształtuje tak naprawdę dzisiejsze wartości? To żadna tajemnica czy wielkie odkrycie. Istnieje pewna grupa zwana "trzymającą władzę". Wielu kwestionuje jej istnienie, ale nie mogę się z nimi zgodzić. Znacznie ciężej powiedzieć, kto tak naprawdę tę władzę trzyma. Kontrolę nad społeczeństwem sprawują oczywiście media. Wartości lansowane w gazetach, radiu czy telewizji pokazują pseudowartości, którymi są m.in. pieniądze, sława i kariera. Kochany, ślepy tłumek podąża za tym jak psy za zapachem mięsa.

Jest internet, powie ktoś z brzegu. I ma rację. Tylko czy tak naprawdę alternatywne źródło wiedzy są aż tak popularne? Ja do tej pory szukam rzetelnej strony z wiadomościami, z której po przeczytaniu 3 artykułów nie wyjdę z dość dosanym słowem na ustach. Do czego zmierzam? Otóż robi nam się papkę z mózgu.

Wracając do sprawy postrzegania. Każdy widzi nas inaczej. Jak? Przez pryzmat samego siebie. Nigdy nie będzie inaczej, w końcu nigdy nie będziemy mieli okazji tak naprawdę spojrzeć "oczami drugiej osoby". W dosłownym tego słowa znaczeniu. Zawsze fascynowała mnie myśl, co czuje, myśli, czego pragnie ktoś siedzący obok mnie? Głupie? Nie sądzę. To tak naprawdę druga osoba, taka jak ja. Jej/jego odczucia dla mnie są aż tak ważne. Ale patrząc jej/jego oczami powiemy coś zupełnie innego. Zastanawialiście się kiedyś, w jaki sposób na czyjeś życie wpływają wasze poczynania? Jak ta osoba je postrzega?

Każdy człowiek chce akceptacji. Więc robi wszystko, aby ją osiągnąć. A całą swoją grę opiera na tym, co zna i widzi. Na wartościach, które są szeroko promowane i znane. To właśnie dlatego tak ciężko znaleźć prawdziwego przyjaciela. W soim życiu udało mi się znaleźć takiego tylko jednego i mimo, że nasze drogi są zgoła odmienne, to nadal potrafimy się zrozumieć :>.

Tutaj nachodzi mnie refleksja i jednocześnie coś w rodzaju postanowienia. Warto być jak najbardziej naturalnym i wyrażać siebie, zamiast schlebiać pseudowartościom. I wbrew pozorom, to nie takie proste.

© Powered by JoggerPL and Albi