Jak zapobiegać usterkom związanym z przesyłaniem plików

  1. Wpływ luk w zabezpieczeniach przesyłania plików
  2. Typy luk w zabezpieczeniach przesyłania plików
  3. Usterka lokalnego przesyłania plików
  4. Usterka zdalnego przesyłania plików
  5. Wniosek

Luki w zabezpieczeniach dotyczące przesyłania plików to trzeci najczęściej występujący typ luki w zabezpieczeniach, który znaleźliśmy w naszej analizie luk w zabezpieczeniach 1599 luk w WordPressie w ciągu 14 miesięcy.

Luki w zabezpieczeniach dotyczące przesyłania plików to trzeci najczęściej występujący typ luki w zabezpieczeniach, który znaleźliśmy w naszej analizie luk w zabezpieczeniach 1599 luk w WordPressie w ciągu 14 miesięcy

Wpływ luk w zabezpieczeniach przesyłania plików

W poniższym pokazie wideo pokazujemy, w jaki sposób atakujący umieszcza lukę w przesyłaniu plików na podatnej stronie. Następnie atakujący używa Metasploit, aby uzyskać zdalną powłokę na stronie internetowej. Pokazujemy możliwości, jakie zdalna powłoka zapewnia atakującemu. Film wyraźnie pokazuje, że luki w przesyłaniu plików są niezwykle poważne i bardzo łatwe do wykorzystania.

Typy luk w zabezpieczeniach przesyłania plików

Istnieją dwa podstawowe rodzaje luk w przesyłaniu plików. W tym artykule zamierzamy podać te opisowe nazwy, których być może nie słyszeliście w innym miejscu, ale uważamy, że opisują one różnicę między podstawowymi typami luk w zabezpieczeniach przesyłania.

Usterka lokalnego przesyłania plików to luka, w której aplikacja umożliwia użytkownikowi bezpośrednie przesłanie szkodliwego pliku, który następnie jest wykonywany.

Usterka zdalnego przesyłania plików to luka, w której aplikacja używa danych wejściowych użytkownika do pobrania zdalnego pliku z witryny w Internecie i przechowywania go lokalnie. Ten plik jest następnie wykonywany przez atakującego.

Przyjrzyjmy się każdej z tych luk w szczegółach, w jaki sposób są tworzone i jak ich unikać.

Usterka lokalnego przesyłania plików

Aby zbadać tę lukę, spójrzmy na Luka związana z przesyłaniem plików wtyczki „wpshop” zgłoszono na początku 2015 r. Oto kod, który stworzył lukę:

$ file = $ _FILES ['wpshop_file']; $ tmp_name = $ file ['tmp_name']; $ name = $ file ["name"]; @move_uploaded_file ($ tmp_name, WPSHOP_UPLOAD_DIR. $ name);

Możesz znajdź ten kod w linii 620 include / ajax.php w wersji 1.3.9.5 wtyczki .

Powyższy kod zawiera dwa krytyczne błędy, które tworzą lukę w przesyłaniu plików.

Błąd 1: Nie ma sprawdzania autentyczności ani autoryzacji, aby upewnić się, że użytkownik się zalogował (uwierzytelnienie) i ma dostęp do przesyłania plików (autoryzacja). Pozwala to osobie atakującej na przesłanie pliku do witryny bez konieczności logowania się lub posiadania poprawnych uprawnień.

Jako programista możesz uniknąć tego błędu, sprawdzając, czy użytkownik ma uprawnienia do przesyłania plików przed przetworzeniem przesłanego pliku:

if (! current_user_can ('upload_files')) // Sprawdź, czy bieżący użytkownik może przesyłać pliki wp_die (__ ('Nie masz uprawnień do przesyłania plików.)); // Przetwarzaj przesyłanie plików

Błąd 2: Nie ma sanityzacji nazwy lub zawartości pliku. Pozwala to atakującemu na przesłanie pliku z rozszerzeniem .php, do którego atakujący może uzyskać dostęp z sieci i wykonać.

Programiści mogą uniknąć tego błędu, oczyszczając nazwę pliku, tak aby nie zawierała rozszerzenia, które może wykonywać kod za pośrednictwem serwera WWW. WordPress ma wbudowane funkcje do sprawdzania i oczyszczania plików przed ich przesłaniem.

wp_check_filetype () sprawdzi, czy rozszerzenie pliku może zostać przesłane, a domyślnie lista dozwolonych plików przesłanych przez WordPress uniemożliwia załadowanie kodu wykonywalnego.

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']))); if (! empty ($ fileInfo ['ext'])) {// Ten plik jest poprawny} else {// Nieprawidłowy plik}

Możesz również ograniczyć to, co jest dozwolone, określając dozwolone typy MIME. Ta lista pozwala tylko na obrazy.

// Dopuszczamy tylko obrazy $ allowedMimes = array ('jpg | jpeg | jpe' => 'image / jpeg', 'gif' => 'image / gif', 'png' => 'image / png',) ; $ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']), $ allowedMimes);

Teraz, gdy zweryfikowaliśmy, że nazwa pliku jest bezpieczna, poradzimy sobie z przesyłaniem plików. WordPress ma poręczną wbudowaną funkcję do tego celu: wp_handle_upload ().

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']))); if (! empty ($ fileInfo ['type'])) {$ uploadInfo = wp_handle_upload ($ _ FILES ['wpshop_file'], array ('test_form' => false, 'mimes' => $ allowedMimes,)); }

wp_handle_upload () pobiera odwołanie do pojedynczego elementu super-globalnego $ _FILES i zwraca tablicę zawierającą URL, pełną ścieżkę i typ MIME wysyłanego pliku.

Sprawdź zawartość przesyłaną w celu zwiększenia bezpieczeństwa

Po otrzymaniu przesyłki możesz uniknąć atakujących przesyłających wykonywalny kod PHP lub inny kod, sprawdzając przesłane pliki pod kątem zawartości. Na przykład, jeśli akceptujesz przesyłanie obrazów, zadzwoń do PHP getimagesize () funkcja na przesłanym pliku, aby określić, czy jest to prawidłowy obraz.

getimagesize () próbuje odczytać informacje nagłówka obrazu i zakończy się niepowodzeniem na nieprawidłowym obrazie. Jest to kolejna metoda weryfikacji treści oczekiwanych od użytkownika.

if (! @getimagesize ($ _ FILES ['wpshop_file'] ['tmp_name'])) wp_die (__ ('Podano nieprawidłowy obraz.'));

Usterka zdalnego przesyłania plików

Usterka zdalnego przesyłania plików występuje wtedy, gdy aplikacja nie akceptuje przesyłania bezpośrednio od odwiedzających witrynę. Zamiast tego użytkownik może podać adres URL w sieci, którego aplikacja użyje do pobrania pliku. Ten plik zostanie zapisany na dysku w publicznie dostępnym katalogu. Osoba atakująca może następnie uzyskać dostęp do tego pliku, wykonać go i uzyskać dostęp do witryny.

Luka TimThumb, która miała wpływ na bardzo dużą liczbę wtyczek i motywów, była podatnością na zdalne przesyłanie plików. W przypadku TimThumb biblioteka obrazów umożliwiła programistom określenie adresu URL obrazu w ciągu zapytania, tak aby TimThumb.php pobierał ten obraz z sieci.

Adres URL obrazu może być modyfikowany, aby osoba atakująca mogła określić plik PHP, który był hostowany na własnej stronie atakującego. TimThumb pobierze ten plik PHP i zapisze go na stronie ofiary w katalogu dostępnym z sieci. Osoba atakująca po prostu uzyska dostęp do tego pliku PHP w swojej przeglądarce i będzie mogła go wykonać.

Jak uniknąć luk w przesyłaniu plików zdalnych

Unikanie tego rodzaju luki jest podobne do unikania luki związanej z przesyłaniem plików lokalnych:

  • Zezwalaj tylko na określone rozszerzenia plików.
  • Zezwalaj tylko autoryzowanym i uwierzytelnionym użytkownikom na korzystanie z tej funkcji.
  • Sprawdź zawartość pliku pobranego z Internetu. Upewnij się, że w rzeczywistości jest to obraz lub dowolny typ pliku, jakiego oczekujesz.
  • Obsługuj pobierane pliki z aplikacji, a nie bezpośrednio przez serwer WWW.
  • Przechowuj pliki w niepublicznym katalogu dostępnym, jeśli możesz.
  • Napisz do pliku, gdy zachowasz go, aby zawierał nagłówek, który czyni go niewykonalnym.

Wniosek

Jak widać z demonstracji wideo i treści powyżej, luki w przesyłaniu plików są poważne. Łatwo ich uniknąć, gdy deweloper może je rozpoznać, a dostępnych jest kilka skutecznych technik, które zapobiegają temu rodzajowi luk w zabezpieczeniach aplikacji WordPress.