Kolejna porcja błędów programistycznych #od0dopentestera Dzisiaj nietypowo, nie będziemy bowiem przyglądać się konkretnemu językowi #programowanie a komendzie unzip z #linux
Czasami wymagania biznesowe sprawiają, że musimy dodać obsługę archiwów do naszego serwisu internetowego. Mogą to być pliki zip, rar czy też tar. Załóżmy, że prowadzimy serwis, w którym można tworzyć galerie. Użytkownik może wysłać kilka zdjęć na raz przesyłając do nas archiwum zip. Plik ten jest wypakowywany po stronie naszego serwera przy użyciu unzip do tymczasowego katalogu a następnie procesowane są wszystkie zdjęcia z rozszerzeniem .png.
Gdzie czyha niebezpieczeństwo? W linuxie oprócz standardowego pliku istnieją symlinki - czyli pewnego rodzaju skróty, nie posiadające własnej treści a odnoszące się do innego zasobu. Tworzymy więc skrot.png, który to będzie się odnosił do pliku /etc/passwd zawierającego informacje o kontach użytkownika w danym systemie.
ln -s /etc/passwd skrot.png Następnie tworzymy archiwum z tym plikiem:
zip --symlinks archiwum.zip skrot.png Teraz jeśli serwer wypakuje go przy użyciu:
unzip archiwum.zip -d temp użytkownik wchodząc na dane zdjęcie otrzyma treść /etc/passwd.
Jak zatem zabezpieczyć się przed tym atakiem? Najlepiej korzystać z modułów wypakowywania plików dostępnych w większości języków programowania. Warto poszukać tam opcji, która wyłączy obsługę dowiązań symbolicznych. Dodatkowo, przed każdą operacją na pliku warto sprawdzić, czy nie jest to symlink.
@KacperSzurek: eee, a nie wystarczy walidować czy plik jest obrazkiem? a wręcz należy to walidować? totalną głupotą jest pozwalać na upload czegokolwiek przez użytkownika bez walidacji.
jesteś w stanie zrobić symlinka, który ma mime obrazkowe?
@Sorry_Yanku: Tutaj dla uproszczenia wideo wykonałem komendę w terminalu. Komenda może jednak zostać wykonana w dowolnym języku programowania - większość z nich bowiem pozwala na wykonanie systemowych aplikacji. Dla przykładu w php wyglądało by to mniej więcej tak:
if (is_uploaded_file($_FILES['plik']['tmp_name'])) { syst em("unzip ".$_FILES['plik']['tmp_name']." -d temp") }
@MacDada: Nie do końca. Symlink może bowiem wskazywać na Twój tajny obrazek do którego nie mam dostępu, np. /home/user/tajny_obrazek.png (zakładam tutaj oczywiście, że serwer WWW ma uprawnienia do tego pliku no i musze znać jego nazwę).
Wtedy to po wypakowaniu i sprawdzeniu czy plik jest obrazkiem – jeśli dalej podążasz za dowiązaniami symbolicznymi – wyświetlisz swój plik użytkownikowi.
Dodatkowo sprawdzenie czy plik jest tylko obrazkiem i czy nie zawiera niczego złego
@KacperSzurek: ktokolwiek piszę jakąkolwiek aplikację webową, w której korzysta bezpośrednio z wywołań systemowych? Szczególnie do takich operacji jak wypakowywanie danych?
Dzisiaj nietypowo, nie będziemy bowiem przyglądać się konkretnemu językowi #programowanie a komendzie
unzip
z #linuxCzasami wymagania biznesowe sprawiają, że musimy dodać obsługę archiwów do naszego serwisu internetowego.
Mogą to być pliki
zip
,rar
czy teżtar
.Załóżmy, że prowadzimy serwis, w którym można tworzyć galerie.
Użytkownik może wysłać kilka zdjęć na raz przesyłając do nas archiwum
zip
.Plik ten jest wypakowywany po stronie naszego serwera przy użyciu
unzip
do tymczasowego katalogu a następnie procesowane są wszystkie zdjęcia z rozszerzeniem.png
.Gdzie czyha niebezpieczeństwo?
W linuxie oprócz standardowego pliku istnieją symlinki - czyli pewnego rodzaju skróty, nie posiadające własnej treści a odnoszące się do innego zasobu.
Tworzymy więc
skrot.png
, który to będzie się odnosił do pliku/etc/passwd
zawierającego informacje o kontach użytkownika w danym systemie.ln -s /etc/passwd skrot.png
Następnie tworzymy archiwum z tym plikiem:
zip --symlinks archiwum.zip skrot.png
Teraz jeśli serwer wypakuje go przy użyciu:
unzip archiwum.zip -d temp
użytkownik wchodząc na dane zdjęcie otrzyma treść
/etc/passwd
.Jak zatem zabezpieczyć się przed tym atakiem?
Najlepiej korzystać z modułów wypakowywania plików dostępnych w większości języków programowania.
Warto poszukać tam opcji, która wyłączy obsługę dowiązań symbolicznych.
Dodatkowo, przed każdą operacją na pliku warto sprawdzić, czy nie jest to symlink.
#informatyka #it #hacking #bezpieczenstwo
jesteś w stanie zrobić symlinka, który ma mime obrazkowe?
Komenda może jednak zostać wykonana w dowolnym języku programowania - większość z nich bowiem pozwala na wykonanie systemowych aplikacji.
Dla przykładu w php wyglądało by to mniej więcej tak:
if (is_uploaded_file($_FILES['plik']['tmp_name'])) {
syst em("unzip ".$_FILES['plik']['tmp_name']." -d temp")
}
/home/user/tajny_obrazek.png
(zakładam tutaj oczywiście, że serwer WWW ma uprawnienia do tego pliku no i musze znać jego nazwę).Wtedy to po wypakowaniu i sprawdzeniu czy plik jest obrazkiem – jeśli dalej podążasz za dowiązaniami symbolicznymi – wyświetlisz swój plik użytkownikowi.
Dodatkowo sprawdzenie czy plik jest tylko obrazkiem i czy nie zawiera niczego złego
Tutaj przykład używania funkcji
system
orazexec
.@mk321 ej a jak by zabrać www-data dostęp do etc?