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

Pamiętacie wpis dotyczący ataków na uploadery osadzone na stronach WWW? Dzisiejszy wpis jest jego kontynuacją. Zostaliśmy poproszeni w komentarzu, aby rozwinąć temat obchodzenia uploaderów napisanych w języku PHP z pomocą EXIF plików graficznych. Więc jeśli jesteś programistą-hakerem i chcesz dowiedzieć się jak zabezpieczać uploader plików to zapraszamy do lektury! Wadliwą funkcją, którą pokażemy jak oszukać jest getimagesize(). Do wpisu dołączone jest krótkie wideo demonstracyjne.

Czym jest EXIF?

Nie wymyślając koła na nowo zacytujmy:

Exchangeable Image File Format (Exif) – standard metadanych dla plików z obrazkami, wydany przez Japan Electronics and Information Technology Industries Association.

Prościej mówiąc są to ukryte dane zaszyte w zdjęciu nie widoczne gołym okiem. Mogą przechowywać międzyinnymi takie informacje jak:

  • aparat którym zostało wykonane zdjęcie,
  • data wykonania zdjęcia,
  • rozdzielczość zdjęcia,
  • pozycja z GPS aparatu,
  • ISO.

Jednym ze sposobów zabezpieczenia uploaderów, który wymienialiśmy i jest nadal często stosowany w webaplikacjach jest wykorzystanie funkcji PHP o getimagesize(). Programiści aplikacji webowych za jej pomocą pobierają rozmiar potencjalnego zdjęcia i na jego podstawie stwierdzają, czy dany plik jest zdjęciem czy też nie. Problem polega na tym, że dane z EXIF da się zmodyfikować. Umieszczony tam kod PHP zostanie wykonany po stronie serwera. Podsumowując cyberprzestępca wgrywa zdjęcie z kodem php zaszytym w EXIF, funkcja getimagesize() badając zdjęcie je przepuszcza dalej… a kod php po wywołaniu żądania do zdjęcia zostaje wykonany.

Atak na wadliwy uploader PHP

Przykładowo mamy taki skrypt z formularzem do wgrywania plików  o nazwie upload.php:

<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 (isset($_FILES['wgrywanyPlik'])) {
        list($width, $height) = getimagesize($_FILES['wgrywanyPlik']['tmp_name']);
        if ($width > 0 && $height > 0) {
            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>";
            }
        } else {
            echo "<b>To nie jest plik graficzny!</b>";
        }
    }
}
?>


Skrypt pochodzi z poprzedniego wpisu o webhackingu i został nieznacznie zmodyfikowany (link do poprzedniego wpisu znajduje się w pierwszym akapicie tego poradnika). Przy korzystaniu z tego skryptu pamiętaj o stworzeniu folderu pliki.Ulepszenie w powyższym skrypcie polega na sprawdzaniu w 14 linii kodu szerokości i wysokości zdjęcia (rozdzielczość). Jeśli wysokość i szerokość jest większa od zera to plik zostaje wgrany na serwer.  Powyższy skrypt tylko pozornie pozwala na wgrywanie tylko plików graficznych…

Wystarczy tylko spreparować zdjęcie z dodatkowym kodem php w metaznacznikach, aby obejść to pozornie dobre zabezpieczenie. Za pomocą dowolnego edytora metadanych EXIF (np. Exif Pilot) otwórzmy dowolne zdjęcie a następnie dodajmy złośliwy kod php do dowolnego metaznacznika. Przykładowy kod znajduje się poniżej:

<?php echo("<br>ZLOSLIWY KOD<br>"); ?>
uploader exif php bypass
Zmodyfikowany EXIF zdjęcia z dodanym „złośliwym” kodem PHP 🙂

Następnym krokiem jest zamiana nazwy pliku na dysku na taki z rozszerzeniem .php i wgranie go na serwer. Nie tylko okaże się, że nasz spreparowany plik zostanie wgrany pomimo swojego rozszerzenia, ale i po wywołaniu jego za pomocą przeglądarki stron WWW zostanie on wykonany po stronie serwera. Oczywiście do jakich to może prowadzić nasłużyć nie trzeba przypominać. Wystarczy poszukać poprzedniego poradnika poruszającego ten temat na naszym blogu.

Wideo prezentujące podatność uploadera z getimagesize()

Krótki film prezentujący daną lukę i metodę obrony przed nią:

>> Pobierz film o luce getimagesize <<

Pozostałe filmy znajdziesz w naszym dziale wideo / download.

Podsumowanie i zabezpieczenie

Dowiedziałeś się jak oszukać już uploader wykorzystujący funkcje getimagesize. W celu zabezpieczenia naszego skryptu najlepiej wykorzystać wszystkie dostępne środki i zasadę ograniczonego zaufania do użytkownika strony. Zacznij od implementacji (choćby za pomocą HTML5 i atrybutu accept) sprawdzania typu plików po stronie klienta. Ma to na celu odstraszenie początkujących włamywaczy i odciążenie naszego serwera. Następnym krokiem jest stworzenie funkcji która sprawdzi plik pod każdym względem. Możesz przykładowo:

  • sprawdzać mime-type,
  • sprawdzać rozszerzenie pliku (ostatnie litery nazwy),
  • sprawdzać rozdzielczość zdjęcia,
  • dopisywać przy wgrywaniu zdjęcia w sposób obligatoryjny do nazwy  pliku rozszerzenie .jpeg,
  • odpowiednie prawa do folderu z plikami z mime-type za pomocą .htaccess,
  • inne.

Zawsze stosuj zasadę ograniczonego zaufania. Zawsze dawaj użytkownikowi tylko to czego naprawdę potrzebuje (chodzi o uprawnienia). Nadmiar uprawnień może prowadzić do nadużyć (fejsbukowanie pracowników?). Tym optymistycznym akcentem kończę ten wpis.

Jeśli spodobał Ci się ten wpis i nasz blog, a chcesz być zawsze na bieżąco zapraszamy na naszego Twittera i Facebooka. Posiadamy również nowo powstałe forum internetowe, jeśli masz pytania śmiało!

Inne wpisy o podobnej tematyce:

Pozdrawiamy :-).

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

  1. U mnie na stronie zmieniam rozszerzenie wgrywanych plików na .png da się jakoś to obejść czy nie muszę się martwić, że ktoś będzie mi jakieś rzeczy z serwerem robił za pomocą PHP. Pozdrawiam Mateusz

    1. Jeśli sztywno dopisujesz do końcówki rozszerzenie lub konwertujesz plik to raczej nie masz się czego bać… JEDNAK należy mieć na uwadze, że jeśli serwer/oprogramowanie będzie zawierało błąd w interpretacji plików PNG a cyberprzestępca będzie na bieżąco to również wykorzysta lukę i spreparuje odpowiedni plik PNG. Im więcej sprawdzasz, tym lepiej. Oczywiście bez przesady. Nakład czasu powinien być adekwatny do rangi witryny. Pozdrawiam

Dodaj komentarz

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