Wpis z mikrobloga

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.

#informatyka #it #hacking #bezpieczenstwo
KacperSzurek - Kolejna porcja błędów programistycznych #od0dopentestera
Dzisiaj niet...
  • 10
@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